summaryrefslogtreecommitdiff
path: root/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
commitb2b2273ef4b67b7da4c05472095b8b96cc04ca8d (patch)
treea082202eacbbc82ca8ab1ec7e7dade1b5eb3f6b7 /lib/Transforms/Utils/LoopSimplify.cpp
parentff18310274e872429cd06d679b1c8c8a14166328 (diff)
downloadllvm-b2b2273ef4b67b7da4c05472095b8b96cc04ca8d.tar.gz
llvm-b2b2273ef4b67b7da4c05472095b8b96cc04ca8d.tar.bz2
llvm-b2b2273ef4b67b7da4c05472095b8b96cc04ca8d.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166787 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/LoopSimplify.cpp')
-rw-r--r--lib/Transforms/Utils/LoopSimplify.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/LoopSimplify.cpp b/lib/Transforms/Utils/LoopSimplify.cpp
index 0bc185d8b7..8fce2ac68e 100644
--- a/lib/Transforms/Utils/LoopSimplify.cpp
+++ b/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;
}
}