diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-02-05 22:03:18 +0000 |
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-02-05 22:03:18 +0000 |
| commit | 916f48a0547ecbda69e06a784888f8d1ffc0c0ad (patch) | |
| tree | 63a06ab99d7b05914631a39b6ddcb68c10291cc1 /llvm/lib/Target/X86/X86InstrInfo.cpp | |
| parent | 9c9453e58261f8967d16e59145a7f08e719b4b8f (diff) | |
| download | bcm5719-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

