diff options
author | Devang Patel <dpatel@apple.com> | 2011-04-06 22:37:20 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2011-04-06 22:37:20 +0000 |
commit | d418194036e9e05f47154535ddb9f1f1c8bc592b (patch) | |
tree | d4d48cbd98544afe0e33576d01f8e0d8f4e28389 | |
parent | f22eefba68d7d128b2de26684df2d5debdf2005d (diff) | |
download | external_llvm-d418194036e9e05f47154535ddb9f1f1c8bc592b.zip external_llvm-d418194036e9e05f47154535ddb9f1f1c8bc592b.tar.gz external_llvm-d418194036e9e05f47154535ddb9f1f1c8bc592b.tar.bz2 |
While folding branch to a common destination into a predecessor, copy dbg values also.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129035 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index c12f9d8..a181e3e 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1403,14 +1403,17 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) { if (Cond == 0 || (!isa<CmpInst>(Cond) && !isa<BinaryOperator>(Cond)) || Cond->getParent() != BB || !Cond->hasOneUse()) return false; - + + SmallVector<DbgInfoIntrinsic *, 8> DbgValues; // Only allow this if the condition is a simple instruction that can be // executed unconditionally. It must be in the same block as the branch, and // must be at the front of the block. BasicBlock::iterator FrontIt = BB->front(); // Ignore dbg intrinsics. - while (isa<DbgInfoIntrinsic>(FrontIt)) + while (DbgInfoIntrinsic *DBI = dyn_cast<DbgInfoIntrinsic>(FrontIt)) { + DbgValues.push_back(DBI); ++FrontIt; + } // Allow a single instruction to be hoisted in addition to the compare // that feeds the branch. We later ensure that any values that _it_ uses @@ -1431,8 +1434,10 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) { // Make sure the instruction after the condition is the cond branch. BasicBlock::iterator CondIt = Cond; ++CondIt; // Ingore dbg intrinsics. - while(isa<DbgInfoIntrinsic>(CondIt)) + while(DbgInfoIntrinsic *DBI = dyn_cast<DbgInfoIntrinsic>(CondIt)) { + DbgValues.push_back(DBI); ++CondIt; + } if (&*CondIt != BI) { assert (!isa<DbgInfoIntrinsic>(CondIt) && "Hey do not forget debug info!"); return false; @@ -1453,7 +1458,7 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) { BasicBlock *FalseDest = BI->getSuccessor(1); if (TrueDest == BB || FalseDest == BB) return false; - + for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { BasicBlock *PredBlock = *PI; BranchInst *PBI = dyn_cast<BranchInst>(PredBlock->getTerminator()); @@ -1566,6 +1571,14 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) { AddPredecessorToBlock(FalseDest, PredBlock, BB); PBI->setSuccessor(1, FalseDest); } + + // Move dbg value intrinsics in PredBlock. + for (SmallVector<DbgInfoIntrinsic *, 8>::iterator DBI = DbgValues.begin(), + DBE = DbgValues.end(); DBI != DBE; ++DBI) { + DbgInfoIntrinsic *DB = *DBI; + DB->removeFromParent(); + DB->insertBefore(PBI); + } return true; } return false; |