Skip to content
  • Jakob Stoklund Olesen's avatar
    Teach SimplifyCFG about magic pointer constants. · 916f48a0
    Jakob Stoklund Olesen authored
    Weird code sometimes uses pointer constants other than null. This patch
    teaches SimplifyCFG to build switch instructions in those cases.
    
    Code like this:
    
    void f(const char *x) {
      if (!x)
        puts("null");
      else if ((uintptr_t)x == 1)
        puts("one");
      else if (x == (char*)2 || x == (char*)3)
        puts("two");
      else if ((intptr_t)x == 4)
        puts("four");
      else
        puts(x);
    }
    
    Now becomes a switch:
    
    define void @f(i8* %x) nounwind ssp {
    entry:
      %magicptr23 = ptrtoint i8* %x to i64            ; <i64> [#uses=1]
      switch i64 %magicptr23, label %if.else16 [
        i64 0, label %if.then
        i64 1, label %if.then2
        i64 2, label %if.then9
        i64 3, label %if.then9
        i64 4, label %if.then14
      ]
    
    Note that LLVM's own DenseMap uses magic pointers.
    
    llvm-svn: 95439
    916f48a0
Loading