If sdisel has decided to sink GEP index expression into any BB. Replace all uses

in that BB.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35132 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-03-17 08:22:49 +00:00
parent ade0162fdf
commit 2edd563825

View File

@ -3982,18 +3982,13 @@ static bool SinkInvariantGEPIndex(BinaryOperator *BinOp, LoopInfo *loopInfo,
BinOp->getOpcode() != Instruction::Sub)
return false;
/// InsertedOps - Only insert a duplicate in each block once.
std::map<BasicBlock*, BinaryOperator*> InsertedOps;
bool MadeChange = false;
// DestBBs - These are the blocks where a copy of BinOp will be inserted.
std::set<BasicBlock*> DestBBs;
BasicBlock *DefBB = BinOp->getParent();
bool MadeChange = false;
for (Value::use_iterator UI = BinOp->use_begin(), E = BinOp->use_end();
UI != E; ) {
UI != E; ++UI) {
Instruction *User = cast<Instruction>(*UI);
// Preincrement use iterator so we don't invalidate it.
++UI;
// Only look for GEP use in another block.
if (User->getParent() == DefBB) continue;
@ -4016,28 +4011,48 @@ static bool SinkInvariantGEPIndex(BinaryOperator *BinOp, LoopInfo *loopInfo,
if (UseTy &&
TLI.isLegalAddressExpression(Instruction::Add, BinOp->getOperand(0),
BinOp->getOperand(1), UseTy)) {
// Sink it into user block.
BinaryOperator *&InsertedOp = InsertedOps[UserBB];
if (!InsertedOp) {
BasicBlock::iterator InsertPt = UserBB->begin();
while (isa<PHINode>(InsertPt)) ++InsertPt;
InsertedOp =
BinaryOperator::create(BinOp->getOpcode(), BinOp->getOperand(0),
BinOp->getOperand(1), "", InsertPt);
}
User->replaceUsesOfWith(BinOp, InsertedOp);
DestBBs.insert(UserBB);
MadeChange = true;
}
}
}
}
// Nothing to do.
if (!MadeChange)
return false;
/// InsertedOps - Only insert a duplicate in each block once.
std::map<BasicBlock*, BinaryOperator*> InsertedOps;
for (Value::use_iterator UI = BinOp->use_begin(), E = BinOp->use_end();
UI != E; ) {
Instruction *User = cast<Instruction>(*UI);
BasicBlock *UserBB = User->getParent();
// Preincrement use iterator so we don't invalidate it.
++UI;
// If any user in this BB wants it, replace all the uses in the BB.
if (DestBBs.count(UserBB)) {
// Sink it into user block.
BinaryOperator *&InsertedOp = InsertedOps[UserBB];
if (!InsertedOp) {
BasicBlock::iterator InsertPt = UserBB->begin();
while (isa<PHINode>(InsertPt)) ++InsertPt;
InsertedOp =
BinaryOperator::create(BinOp->getOpcode(), BinOp->getOperand(0),
BinOp->getOperand(1), "", InsertPt);
}
User->replaceUsesOfWith(BinOp, InsertedOp);
}
}
if (BinOp->use_empty())
BinOp->eraseFromParent();
return MadeChange;
return true;
}