mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-22 20:43:44 +02:00
53f2760fdc
Turns out this approach is buggy. In discussion about follow on work, Sanjoy pointed out that we could be subject to circular logic problems. Consider: if (i u< L) leave() if ((i + 1) u< L) leave() print(a[i] + a[i+1]) If we know that L is less than UINT_MAX, we could possible prove (in a control dependent way) that i + 1 does not overflow. This gives us: if (i u< L) leave() if ((i +nuw 1) u< L) leave() print(a[i] + a[i+1]) If we now do the transform this patch proposed, we end up with: if ((i +nuw 1) u< L) leave_appropriately() print(a[i] + a[i+1]) That would be a miscompile when i==-1. The problem here is that the control dependent nuw bits got used to prove something about the first condition. That's obviously invalid. This won't happen today, but since I plan to enhance LVI/CVP with exactly that transform at some point in the not too distant future... llvm-svn: 250430 |
||
---|---|---|
.. | ||
AddDiscriminators.cpp | ||
ASanStackFrameLayout.cpp | ||
BasicBlockUtils.cpp | ||
BreakCriticalEdges.cpp | ||
BuildLibCalls.cpp | ||
BypassSlowDivision.cpp | ||
CloneFunction.cpp | ||
CloneModule.cpp | ||
CMakeLists.txt | ||
CmpInstAnalysis.cpp | ||
CodeExtractor.cpp | ||
CtorUtils.cpp | ||
DemoteRegToStack.cpp | ||
FlattenCFG.cpp | ||
GlobalStatus.cpp | ||
InlineFunction.cpp | ||
InstructionNamer.cpp | ||
IntegerDivision.cpp | ||
LCSSA.cpp | ||
LLVMBuild.txt | ||
Local.cpp | ||
LoopSimplify.cpp | ||
LoopUnroll.cpp | ||
LoopUnrollRuntime.cpp | ||
LoopUtils.cpp | ||
LoopVersioning.cpp | ||
LowerInvoke.cpp | ||
LowerSwitch.cpp | ||
Makefile | ||
Mem2Reg.cpp | ||
MetaRenamer.cpp | ||
ModuleUtils.cpp | ||
PromoteMemoryToRegister.cpp | ||
SimplifyCFG.cpp | ||
SimplifyIndVar.cpp | ||
SimplifyInstructions.cpp | ||
SimplifyLibCalls.cpp | ||
SplitModule.cpp | ||
SSAUpdater.cpp | ||
SymbolRewriter.cpp | ||
UnifyFunctionExitNodes.cpp | ||
Utils.cpp | ||
ValueMapper.cpp |