summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-10-20 05:34:36 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-10-20 05:34:36 +0000
commit6665d62117729d7cfb99dc621d6bb2c77f5861ec (patch)
tree8b4bba60cbe300d64b0deb0ea78cca23cceceb00 /llvm/lib/Transforms
parent4804aedd24fc7adf9c23fa6c912713eceae49d5b (diff)
downloadbcm5719-llvm-6665d62117729d7cfb99dc621d6bb2c77f5861ec.tar.gz
bcm5719-llvm-6665d62117729d7cfb99dc621d6bb2c77f5861ec.zip
Fix a somewhat subtle pair of issues with JumpThreading I introduced in
r220178. First, the creation routine doesn't insert prior to the terminator of the basic block provided, but really at the end of the basic block. Instead, get the terminator and insert before that. The next issue was that we need to ensure multiple PHI node entries for a single predecessor re-use the same cast instruction rather than creating new ones. All of the logic here was without tests previously. I've reduced and added a test case from the test suite that crashed without both of these fixes. llvm-svn: 220186
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/JumpThreading.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index fbb5c201347..25a8b0cdbd3 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -1035,10 +1035,13 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
"Didn't find entry for predecessor!");
// If we have an available predecessor but it requires casting, insert the
- // cast in the predecessor and use the cast.
- Value *PredV = I->second;
+ // cast in the predecessor and use the cast. Note that we have to update the
+ // AvailablePreds vector as we go so that all of the PHI entries for this
+ // predecessor use the same bitcast.
+ Value *&PredV = I->second;
if (PredV->getType() != LI->getType())
- PredV = CastInst::Create(CastInst::BitCast, PredV, LI->getType(), "", P);
+ PredV = CastInst::Create(CastInst::BitCast, PredV, LI->getType(), "",
+ P->getTerminator());
PN->addIncoming(PredV, I->first);
}
OpenPOWER on IntegriCloud