diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/JumpThreading.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index f2b9d78..7a8128c 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -761,7 +761,10 @@ bool JumpThreadingPass::computeValueKnownInPredecessorsImpl( PHINode *PN = dyn_cast<PHINode>(CmpLHS); if (!PN) PN = dyn_cast<PHINode>(CmpRHS); - if (PN && PN->getParent() == BB) { + // Do not perform phi translation across a loop header phi, because this + // may result in comparison of values from two different loop iterations. + // FIXME: This check is broken if LoopHeaders is not populated. + if (PN && PN->getParent() == BB && !LoopHeaders.contains(BB)) { const DataLayout &DL = PN->getModule()->getDataLayout(); // We can do this simplification if any comparisons fold to true or false. // See if any do. |