[llvm-commits] [patch] Teach SimplifyCFG about magic pointer constants
Jakob Stoklund Olesen
stoklund at 2pi.dk
Fri Feb 5 12:12:10 PST 2010
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 and benefits from this.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: magicptr.patch
Type: application/octet-stream
Size: 23816 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20100205/40a78748/attachment.obj>
More information about the llvm-commits
mailing list