summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86InstrInfo.cpp
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-02-05 22:03:18 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-02-05 22:03:18 +0000
commit916f48a0547ecbda69e06a784888f8d1ffc0c0ad (patch)
tree63a06ab99d7b05914631a39b6ddcb68c10291cc1 /llvm/lib/Target/X86/X86InstrInfo.cpp
parent9c9453e58261f8967d16e59145a7f08e719b4b8f (diff)
downloadbcm5719-llvm-916f48a0547ecbda69e06a784888f8d1ffc0c0ad.tar.gz
bcm5719-llvm-916f48a0547ecbda69e06a784888f8d1ffc0c0ad.zip
Teach SimplifyCFG about magic pointer constants.
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
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrInfo.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud