[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
Evan Cheng
evan.cheng at apple.com
Sat Mar 17 01:23:06 PDT 2007
Changes in directory llvm/lib/CodeGen/SelectionDAG:
SelectionDAGISel.cpp updated: 1.387 -> 1.388
---
Log message:
If sdisel has decided to sink GEP index expression into any BB. Replace all uses
in that BB.
---
Diffs of the changes: (+37 -22)
SelectionDAGISel.cpp | 59 +++++++++++++++++++++++++++++++--------------------
1 files changed, 37 insertions(+), 22 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.387 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.388
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.387 Fri Mar 16 13:32:30 2007
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Sat Mar 17 03:22:49 2007
@@ -3982,18 +3982,13 @@
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 @@
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;
}
More information about the llvm-commits
mailing list