mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
58e9ee85fd
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95439 91177308-0d34-0410-b5e6-96231b3b80d8 |
||
---|---|---|
.. | ||
ABCD.cpp | ||
ADCE.cpp | ||
BasicBlockPlacement.cpp | ||
CMakeLists.txt | ||
CodeGenPrepare.cpp | ||
ConstantProp.cpp | ||
DCE.cpp | ||
DeadStoreElimination.cpp | ||
GEPSplitter.cpp | ||
GVN.cpp | ||
IndVarSimplify.cpp | ||
JumpThreading.cpp | ||
LICM.cpp | ||
LoopDeletion.cpp | ||
LoopIndexSplit.cpp | ||
LoopRotation.cpp | ||
LoopStrengthReduce.cpp | ||
LoopUnrollPass.cpp | ||
LoopUnswitch.cpp | ||
Makefile | ||
MemCpyOptimizer.cpp | ||
Reassociate.cpp | ||
Reg2Mem.cpp | ||
Scalar.cpp | ||
ScalarReplAggregates.cpp | ||
SCCP.cpp | ||
SCCVN.cpp | ||
SimplifyCFGPass.cpp | ||
SimplifyHalfPowrLibCalls.cpp | ||
SimplifyLibCalls.cpp | ||
TailDuplication.cpp | ||
TailRecursionElimination.cpp |