diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-10-26 17:31:43 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-10-26 17:31:43 +0000 |
commit | e3d821a4664bc793a32166eb5ea9319c70ee7f9a (patch) | |
tree | f0f48b23b436e6720541c3c815ed8b52e3c22156 /llvm/lib/Transforms/Utils/LoopSimplify.cpp | |
parent | 214935ee70c26fca2a0d6c4916aaebe0de9d3e7f (diff) | |
download | bcm5719-llvm-e3d821a4664bc793a32166eb5ea9319c70ee7f9a.tar.gz bcm5719-llvm-e3d821a4664bc793a32166eb5ea9319c70ee7f9a.zip |
Fix SCEV cache invalidation in LCSSA and LoopSimplify.
The LoopSimplify bug is pretty harmless because the loop goes from unanalyzable
to analyzable but the LCSSA bug is very nasty. It only comes into play with a
specific order of the LoopPassManager worklist and can cause actual
miscompilations, when a SCEV refers to a value that has been replaced with PHI
node. SCEVExpander may then insert code into the wrong place, either violating
domination or randomly miscompiling stuff.
Comes with an extensive test case reduced from the test-suite with
bugpoint+SCEVValidator.
llvm-svn: 166787
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopSimplify.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopSimplify.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopSimplify.cpp b/llvm/lib/Transforms/Utils/LoopSimplify.cpp index 0bc185d8b72..8fce2ac68e5 100644 --- a/llvm/lib/Transforms/Utils/LoopSimplify.cpp +++ b/llvm/lib/Transforms/Utils/LoopSimplify.cpp @@ -194,6 +194,11 @@ ReprocessLoop: BI->setCondition(ConstantInt::get(Cond->getType(), !L->contains(BI->getSuccessor(0)))); + + // This may make the loop analyzable, force SCEV recomputation. + if (SE) + SE->forgetLoop(L); + Changed = true; } } |