diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2013-01-24 09:59:39 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2013-01-24 09:59:39 +0000 |
commit | 6cf7a91d12fe208a41223daa4aa9c603c390e0ce (patch) | |
tree | 6692733dda709d4146b607070fceced909093376 /lib/Transforms | |
parent | 9e620952617b90992e50dcf9bca8078c535cbaef (diff) | |
download | external_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.cpp | 65 |
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); } } } |