[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
Evan Cheng
evan.cheng at apple.com
Mon May 1 01:55:10 PDT 2006
Changes in directory llvm/lib/CodeGen/SelectionDAG:
ScheduleDAGList.cpp updated: 1.48 -> 1.49
---
Log message:
Remove temp. option -spiller-check-liveout, it didn't cause any failure nor performance regressions.
---
Diffs of the changes: (+33 -17)
ScheduleDAGList.cpp | 50 +++++++++++++++++++++++++++++++++-----------------
1 files changed, 33 insertions(+), 17 deletions(-)
Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.48 llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.49
--- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp:1.48 Sun Mar 12 03:01:41 2006
+++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAGList.cpp Mon May 1 03:54:57 2006
@@ -51,6 +51,7 @@
short NumSuccsLeft; // # of succs not scheduled.
short NumChainPredsLeft; // # of chain preds not scheduled.
short NumChainSuccsLeft; // # of chain succs not scheduled.
+ bool isStore : 1; // Is a store.
bool isTwoAddress : 1; // Is a two-address instruction.
bool isDefNUseOperand : 1; // Is a def&use operand.
bool isPending : 1; // True once pending.
@@ -63,7 +64,7 @@
SUnit(SDNode *node, unsigned nodenum)
: Node(node), NumPredsLeft(0), NumSuccsLeft(0),
- NumChainPredsLeft(0), NumChainSuccsLeft(0),
+ NumChainPredsLeft(0), NumChainSuccsLeft(0), isStore(false),
isTwoAddress(false), isDefNUseOperand(false),
isPending(false), isAvailable(false), isScheduled(false),
Latency(0), CycleBound(0), Cycle(0), NodeNum(nodenum) {}
@@ -315,9 +316,13 @@
SUnit *SU = &SUnits[su];
SDNode *MainNode = SU->Node;
- if (MainNode->isTargetOpcode() &&
- TII->isTwoAddrInstr(MainNode->getTargetOpcode()))
- SU->isTwoAddress = true;
+ if (MainNode->isTargetOpcode()) {
+ unsigned Opc = MainNode->getTargetOpcode();
+ if (TII->isTwoAddrInstr(Opc))
+ SU->isTwoAddress = true;
+ if (TII->isStore(Opc))
+ SU->isStore = true;
+ }
// Find all predecessors and successors of the group.
// Temporarily add N to make code simpler.
@@ -358,9 +363,9 @@
SU->FlaggedNodes.pop_back();
}
- return;
DEBUG(for (unsigned su = 0, e = SUnits.size(); su != e; ++su)
SUnits[su].dumpAll(&DAG));
+ return;
}
/// EmitSchedule - Emit the machine code in scheduled order.
@@ -735,7 +740,7 @@
const std::vector<SUnit> *SUnits;
// SethiUllmanNumbers - The SethiUllman number for each node.
- std::vector<int> SethiUllmanNumbers;
+ std::vector<unsigned> SethiUllmanNumbers;
std::priority_queue<SUnit*, std::vector<SUnit*>, ls_rr_sort> Queue;
public:
@@ -774,7 +779,7 @@
}
private:
void CalculatePriorities();
- int CalcNodePriority(const SUnit *SU);
+ unsigned CalcNodePriority(const SUnit *SU);
};
}
@@ -784,7 +789,7 @@
int LBonus = (int)left ->isDefNUseOperand;
int RBonus = (int)right->isDefNUseOperand;
-
+
// Special tie breaker: if two nodes share a operand, the one that
// use it as a def&use operand is preferred.
if (left->isTwoAddress && !right->isTwoAddress) {
@@ -798,6 +803,20 @@
RBonus++;
}
+ // Push stores up as much as possible. This really help code like this:
+ // load
+ // compute
+ // store
+ // load
+ // compute
+ // store
+ // This would make sure the scheduled code completed all computations and
+ // the stores before the next series of computation starts.
+ if (!left->isStore && right->isStore)
+ LBonus += 2;
+ if (left->isStore && !right->isStore)
+ RBonus += 2;
+
// Priority1 is just the number of live range genned.
int LPriority1 = left ->NumPredsLeft - LBonus;
int RPriority1 = right->NumPredsLeft - RBonus;
@@ -819,9 +838,9 @@
/// CalcNodePriority - Priority is the Sethi Ullman number.
/// Smaller number is the higher priority.
-int RegReductionPriorityQueue::CalcNodePriority(const SUnit *SU) {
- int &SethiUllmanNumber = SethiUllmanNumbers[SU->NodeNum];
- if (SethiUllmanNumber != INT_MIN)
+unsigned RegReductionPriorityQueue::CalcNodePriority(const SUnit *SU) {
+ unsigned &SethiUllmanNumber = SethiUllmanNumbers[SU->NodeNum];
+ if (SethiUllmanNumber != 0)
return SethiUllmanNumber;
if (SU->Preds.size() == 0) {
@@ -832,7 +851,7 @@
I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) {
if (I->second) continue; // ignore chain preds.
SUnit *PredSU = I->first;
- int PredSethiUllman = CalcNodePriority(PredSU);
+ unsigned PredSethiUllman = CalcNodePriority(PredSU);
if (PredSethiUllman > SethiUllmanNumber) {
SethiUllmanNumber = PredSethiUllman;
Extra = 0;
@@ -840,10 +859,7 @@
Extra++;
}
- if (SU->Node->getOpcode() != ISD::TokenFactor)
- SethiUllmanNumber += Extra;
- else
- SethiUllmanNumber = (Extra == 1) ? 0 : Extra-1;
+ SethiUllmanNumber += Extra;
}
return SethiUllmanNumber;
@@ -851,7 +867,7 @@
/// CalculatePriorities - Calculate priorities of all scheduling units.
void RegReductionPriorityQueue::CalculatePriorities() {
- SethiUllmanNumbers.assign(SUnits->size(), INT_MIN);
+ SethiUllmanNumbers.assign(SUnits->size(), 0);
for (unsigned i = 0, e = SUnits->size(); i != e; ++i)
CalcNodePriority(&(*SUnits)[i]);
More information about the llvm-commits
mailing list