aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2013-01-24 09:59:39 +0000
committerChandler Carruth <chandlerc@gmail.com>2013-01-24 09:59:39 +0000
commit6cf7a91d12fe208a41223daa4aa9c603c390e0ce (patch)
tree6692733dda709d4146b607070fceced909093376 /lib/Transforms
parent9e620952617b90992e50dcf9bca8078c535cbaef (diff)
downloadexternal_llvm-6cf7a91d12fe208a41223daa4aa9c603c390e0ce.zip
external_llvm-6cf7a91d12fe208a41223daa4aa9c603c390e0ce.tar.gz
external_llvm-6cf7a91d12fe208a41223daa4aa9c603c390e0ce.tar.bz2
Give the basic block variables here names based on the if-then-end
structure being analyzed. No functionality changed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173334 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Utils/SimplifyCFG.cpp65
1 files changed, 33 insertions, 32 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
index fc84c4a..29e1180 100644
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1369,17 +1369,29 @@ static bool SinkThenElseCodeToEnd(BranchInst *BI1) {
/// \endcode
///
/// \returns true if the conditional block is removed.
-static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
+static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB) {
// Be conservative for now. FP select instruction can often be expensive.
Value *BrCond = BI->getCondition();
if (isa<FCmpInst>(BrCond))
return false;
+ BasicBlock *BB = BI->getParent();
+ BasicBlock *EndBB = ThenBB->getTerminator()->getSuccessor(0);
+
+ // If ThenBB is actually on the false edge of the conditional branch, remember
+ // to swap the select operands later.
+ bool Invert = false;
+ if (ThenBB != BI->getSuccessor(0)) {
+ assert(ThenBB == BI->getSuccessor(1) && "No edge from 'if' block?");
+ Invert = true;
+ }
+ assert(EndBB == BI->getSuccessor(!Invert) && "No edge from to end block");
+
// Only speculatively execution a single instruction (not counting the
// terminator) for now.
Instruction *HInst = NULL;
- Instruction *Term = BB1->getTerminator();
- for (BasicBlock::iterator BBI = BB1->begin(), BBE = BB1->end();
+ Instruction *Term = ThenBB->getTerminator();
+ for (BasicBlock::iterator BBI = ThenBB->begin(), BBE = ThenBB->end();
BBI != BBE; ++BBI) {
Instruction *I = BBI;
// Skip debug info.
@@ -1391,8 +1403,6 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
HInst = I;
}
- BasicBlock *BIParent = BI->getParent();
-
// Check the instruction to be hoisted, if there is one.
if (HInst) {
// Don't hoist the instruction if it's unsafe or expensive.
@@ -1407,35 +1417,26 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
for (User::op_iterator i = HInst->op_begin(), e = HInst->op_end();
i != e; ++i) {
Instruction *OpI = dyn_cast<Instruction>(*i);
- if (OpI && OpI->getParent() == BIParent &&
+ if (OpI && OpI->getParent() == BB &&
!OpI->mayHaveSideEffects() &&
- !OpI->isUsedInBasicBlock(BIParent))
+ !OpI->isUsedInBasicBlock(BB))
return false;
}
}
- // If BB1 is actually on the false edge of the conditional branch, remember
- // to swap the select operands later.
- bool Invert = false;
- if (BB1 != BI->getSuccessor(0)) {
- assert(BB1 == BI->getSuccessor(1) && "No edge from 'if' block?");
- Invert = true;
- }
-
// Collect interesting PHIs, and scan for hazards.
SmallSetVector<std::pair<Value *, Value *>, 4> PHIs;
- BasicBlock *BB2 = BB1->getTerminator()->getSuccessor(0);
- for (BasicBlock::iterator I = BB2->begin();
+ for (BasicBlock::iterator I = EndBB->begin();
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
- Value *BB1V = PN->getIncomingValueForBlock(BB1);
- Value *BIParentV = PN->getIncomingValueForBlock(BIParent);
+ Value *OrigV = PN->getIncomingValueForBlock(BB);
+ Value *ThenV = PN->getIncomingValueForBlock(ThenBB);
// Skip PHIs which are trivial.
- if (BB1V == BIParentV)
+ if (ThenV == OrigV)
continue;
// Check for safety.
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(BB1V)) {
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(ThenV)) {
// An unfolded ConstantExpr could end up getting expanded into
// Instructions. Don't speculate this and another instruction at
// the same time.
@@ -1448,7 +1449,7 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
}
// Ok, we may insert a select for this PHI.
- PHIs.insert(std::make_pair(BB1V, BIParentV));
+ PHIs.insert(std::make_pair(ThenV, OrigV));
}
// If there are no PHIs to process, bail early. This helps ensure idempotence
@@ -1457,11 +1458,11 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
return false;
// If we get here, we can hoist the instruction and if-convert.
- DEBUG(dbgs() << "SPECULATIVELY EXECUTING BB" << *BB1 << "\n";);
+ DEBUG(dbgs() << "SPECULATIVELY EXECUTING BB" << *ThenBB << "\n";);
// Hoist the instruction.
if (HInst)
- BIParent->getInstList().splice(BI, BB1->getInstList(), HInst);
+ BB->getInstList().splice(BI, ThenBB->getInstList(), HInst);
// Insert selects and rewrite the PHI operands.
IRBuilder<true, NoFolder> Builder(BI);
@@ -1483,15 +1484,15 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *BB1) {
// Make the PHI node use the select for all incoming values for "then" and
// "if" blocks.
- for (BasicBlock::iterator I = BB2->begin();
+ for (BasicBlock::iterator I = EndBB->begin();
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
- unsigned BB1I = PN->getBasicBlockIndex(BB1);
- unsigned BIParentI = PN->getBasicBlockIndex(BIParent);
- Value *BB1V = PN->getIncomingValue(BB1I);
- Value *BIParentV = PN->getIncomingValue(BIParentI);
- if (TrueV == BB1V && FalseV == BIParentV) {
- PN->setIncomingValue(BB1I, SI);
- PN->setIncomingValue(BIParentI, SI);
+ unsigned ThenI = PN->getBasicBlockIndex(ThenBB);
+ unsigned OrigI = PN->getBasicBlockIndex(BB);
+ Value *ThenV = PN->getIncomingValue(ThenI);
+ Value *OrigV = PN->getIncomingValue(OrigI);
+ if (TrueV == ThenV && FalseV == OrigV) {
+ PN->setIncomingValue(ThenI, SI);
+ PN->setIncomingValue(OrigI, SI);
}
}
}