diff options
author | Chris Lattner <sabre@nondot.org> | 2010-02-13 04:15:26 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-02-13 04:15:26 +0000 |
commit | b0ebb65ab0af336d40a2ad6b429df3d7f4a01030 (patch) | |
tree | b5ae0fbed459a3ef832d568457dd88c656d23b11 /llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp | |
parent | 96b8826542abee2621a1da2a56b27b12002eda99 (diff) | |
download | bcm5719-llvm-b0ebb65ab0af336d40a2ad6b429df3d7f4a01030.tar.gz bcm5719-llvm-b0ebb65ab0af336d40a2ad6b429df3d7f4a01030.zip |
iterate over preds using PHI information when available instead of
using pred_begin/end. It is much faster.
llvm-svn: 96079
Diffstat (limited to 'llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp index 19c7206e391..eb3e3b2ff3a 100644 --- a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -229,9 +229,18 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, // loop header) then NewBB dominates DestBB. SmallVector<BasicBlock*, 8> OtherPreds; - for (pred_iterator I = pred_begin(DestBB), E = pred_end(DestBB); I != E; ++I) - if (*I != NewBB) - OtherPreds.push_back(*I); + // If there is a PHI in the block, loop over predecessors with it, which is + // faster than iterating pred_begin/end. + if (PHINode *PN = dyn_cast<PHINode>(DestBB->begin())) { + for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) + if (PN->getIncomingBlock(i) != NewBB) + OtherPreds.push_back(PN->getIncomingBlock(i)); + } else { + for (pred_iterator I = pred_begin(DestBB), E = pred_end(DestBB); + I != E; ++I) + if (*I != NewBB) + OtherPreds.push_back(*I); + } bool NewBBDominatesDestBB = true; @@ -382,9 +391,8 @@ BasicBlock *llvm::SplitCriticalEdge(TerminatorInst *TI, unsigned SuccNum, } // Update ProfileInfo if it is around. - if (ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>()) { - PI->splitEdge(TIBB,DestBB,NewBB,MergeIdenticalEdges); - } + if (ProfileInfo *PI = P->getAnalysisIfAvailable<ProfileInfo>()) + PI->splitEdge(TIBB, DestBB, NewBB, MergeIdenticalEdges); return NewBB; } |