diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-08-02 08:06:43 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-08-02 08:06:43 +0000 |
commit | e393b738081104c86d34e4e70e8302474a19a45b (patch) | |
tree | 3c1f56777c49dbd395a17190fb6206a5952126da /lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | ee1d7db74b24f941dd0334f5ca3db7ab48f65ede (diff) | |
download | llvm-e393b738081104c86d34e4e70e8302474a19a45b.tar.gz llvm-e393b738081104c86d34e4e70e8302474a19a45b.tar.bz2 llvm-e393b738081104c86d34e4e70e8302474a19a45b.tar.xz |
Fix dereferencing end iterator in SimplifyCFG. Patch by Ye Mei.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187646 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 427688fc8e..d48213ff6e 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -4290,7 +4290,8 @@ bool SimplifyCFGOpt::SimplifyParallelAndOr(BasicBlock *BB, IRBuilder<> &Builder, // Do the transformation. BasicBlock *CB; bool Iteration = true; - BasicBlock::iterator ItOld = Builder.GetInsertPoint(); + BasicBlock *SaveInsertBB = Builder.GetInsertBlock(); + BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint(); BranchInst *PBI = dyn_cast<BranchInst>(FirstCondBlock->getTerminator()); Value *PC = PBI->getCondition(); do { @@ -4319,8 +4320,8 @@ bool SimplifyCFGOpt::SimplifyParallelAndOr(BasicBlock *BB, IRBuilder<> &Builder, // make CB unreachable and let downstream to delete the block. new UnreachableInst(CB->getContext(), CB); } while (Iteration); - - Builder.SetInsertPoint(ItOld); + if (SaveInsertBB) + Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt); DEBUG(dbgs() << "Use parallel and/or in:\n" << *FirstCondBlock); return true; } @@ -4454,11 +4455,13 @@ bool SimplifyCFGOpt::MergeIfRegion(BasicBlock *BB, IRBuilder<> &Builder, FirstEntryBlock->getInstList().splice(FirstEntryBlock->end(), SecondEntryBlock->getInstList()); BranchInst *PBI = dyn_cast<BranchInst>(FirstEntryBlock->getTerminator()); Value *CC = PBI->getCondition(); - BasicBlock::iterator ItOld = Builder.GetInsertPoint(); + BasicBlock *SaveInsertBB = Builder.GetInsertBlock(); + BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint(); Builder.SetInsertPoint(PBI); Value *NC = Builder.CreateOr(CInst1, CC); PBI->replaceUsesOfWith(CC, NC); - Builder.SetInsertPoint(ItOld); + if (SaveInsertBB) + Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt); // Remove IfTrue1 if (IfTrue1 != FirstEntryBlock) { |