[llvm-commits] [llvm] r121686 - /llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
Chris Lattner
sabre at nondot.org
Sun Dec 12 21:26:52 PST 2010
Author: lattner
Date: Sun Dec 12 23:26:52 2010
New Revision: 121686
URL: http://llvm.org/viewvc/llvm-project?rev=121686&view=rev
Log:
refactor the speculative execution logic to be factored into the cond branch code instead of
doing a cfg search for every block simplified.
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=121686&r1=121685&r2=121686&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Sun Dec 12 23:26:52 2010
@@ -2150,10 +2150,28 @@
// from BI. We know that the condbr dominates the two blocks, so see if
// there is any identical code in the "then" and "else" blocks. If so, we
// can hoist it up to the branching block.
- if (BI->getSuccessor(0)->getSinglePredecessor() != 0 &&
- BI->getSuccessor(1)->getSinglePredecessor() != 0)
- if (HoistThenElseCodeToIf(BI))
- return SimplifyCFG(BB) | true;
+ if (BI->getSuccessor(0)->getSinglePredecessor() != 0) {
+ if (BI->getSuccessor(1)->getSinglePredecessor() != 0) {
+ if (HoistThenElseCodeToIf(BI))
+ return SimplifyCFG(BB) | true;
+ } else {
+ // If Successor #1 has multiple preds, we may be able to conditionally
+ // execute Successor #0 if it branches to successor #1.
+ TerminatorInst *Succ0TI = BI->getSuccessor(0)->getTerminator();
+ if (Succ0TI->getNumSuccessors() == 1 &&
+ Succ0TI->getSuccessor(0) == BI->getSuccessor(1))
+ if (SpeculativelyExecuteBB(BI, BI->getSuccessor(0)))
+ return SimplifyCFG(BB) | true;
+ }
+ } else if (BI->getSuccessor(1)->getSinglePredecessor() != 0) {
+ // If Successor #0 has multiple preds, we may be able to conditionally
+ // execute Successor #1 if it branches to successor #0.
+ TerminatorInst *Succ1TI = BI->getSuccessor(1)->getTerminator();
+ if (Succ1TI->getNumSuccessors() == 1 &&
+ Succ1TI->getSuccessor(0) == BI->getSuccessor(0))
+ if (SpeculativelyExecuteBB(BI, BI->getSuccessor(1)))
+ return SimplifyCFG(BB) | true;
+ }
// If this is a branch on a phi node in the current block, thread control
// through this block if any PHI node entries are constants.
@@ -2326,28 +2344,6 @@
}
}
- // Otherwise, if this block only has a single predecessor, and if that block
- // is a conditional branch, see if we can hoist any code from this block up
- // into our predecessor.
- if (BasicBlock *OnlyPred = BB->getSinglePredecessor()) {
- BranchInst *BI = dyn_cast<BranchInst>(OnlyPred->getTerminator());
- if (BI && BI->isConditional()) {
- // Get the other block.
- BasicBlock *OtherBB = BI->getSuccessor(BI->getSuccessor(0) == BB);
-
- if (OtherBB->getSinglePredecessor() == 0) {
- TerminatorInst *BBTerm = BB->getTerminator();
- if (BBTerm->getNumSuccessors() == 1 &&
- BBTerm->getSuccessor(0) == OtherBB) {
- // If BB's only successor is the other successor of the predecessor,
- // i.e. a triangle, see if we can hoist any code from this block up
- // to the "if" block.
- Changed |= SpeculativelyExecuteBB(BI, BB);
- }
- }
- }
- }
-
return Changed;
}
More information about the llvm-commits
mailing list