summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/LoopSimplify.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-10-26 17:31:43 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-10-26 17:31:43 +0000
commite3d821a4664bc793a32166eb5ea9319c70ee7f9a (patch)
treef0f48b23b436e6720541c3c815ed8b52e3c22156 /llvm/lib/Transforms/Utils/LoopSimplify.cpp
parent214935ee70c26fca2a0d6c4916aaebe0de9d3e7f (diff)
downloadbcm5719-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.cpp5
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;
}
}
OpenPOWER on IntegriCloud