summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-01-24 02:24:47 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-01-24 02:24:47 +0000
commit4296ce566202cf00ba2beeb3344db0ea20af0e6f (patch)
tree85a39df99b2ceb1cc45835273f8910c586084e2a /lib/Transforms
parent5950c6fa48fe607e253afab421fa286f5f8e44bf (diff)
downloadllvm-4296ce566202cf00ba2beeb3344db0ea20af0e6f.tar.gz
llvm-4296ce566202cf00ba2beeb3344db0ea20af0e6f.tar.bz2
llvm-4296ce566202cf00ba2beeb3344db0ea20af0e6f.tar.xz
[LPM] Fix a logic error in LICM spotted by inspection.
We completely skipped promotion in LICM if the loop has a preheader or dedicated exits, but not *both*. We hoist if there is a preheader, and sink if there are dedicated exits, but either hoisting or sinking can move loop invariant code out of the loop! I have no idea if this has a practical consequence. If anyone has ideas for a test case, let me know. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199966 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/LICM.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/LICM.cpp b/lib/Transforms/Scalar/LICM.cpp
index f6c78b04f2..46d5ca3dca 100644
--- a/lib/Transforms/Scalar/LICM.cpp
+++ b/lib/Transforms/Scalar/LICM.cpp
@@ -273,7 +273,7 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
// Now that all loop invariants have been removed from the loop, promote any
// memory references to scalars that we can.
- if (!DisablePromotion && Preheader && L->hasDedicatedExits()) {
+ if (!DisablePromotion && (Preheader || L->hasDedicatedExits())) {
SmallVector<BasicBlock *, 8> ExitBlocks;
SmallVector<Instruction *, 8> InsertPts;