summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2010-12-21 22:27:44 +0000
committerAndrew Trick <atrick@apple.com>2010-12-21 22:27:44 +0000
commitfbb3ed877415f2d9691283575e34d910e75ea3ce (patch)
treed382ad2b8d971933357d4fe58e3e43a72d083a02 /llvm/lib
parentcff2764a6eb8123557c98891384b975a6bdd4d6c (diff)
downloadbcm5719-llvm-fbb3ed877415f2d9691283575e34d910e75ea3ce.tar.gz
bcm5719-llvm-fbb3ed877415f2d9691283575e34d910e75ea3ce.zip
In DelayForLiveRegsBottomUp, handle instructions that read and write
the same physical register. Simplifies the fix from the previous checkin r122211. llvm-svn: 122370
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp19
1 files changed, 4 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
index 92341324047..a925a79cc69 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
@@ -660,9 +660,12 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
SmallSet<unsigned, 4> RegAdded;
// If this node would clobber any "live" register, then it's not ready.
+ //
+ // If SU is the currently live definition of the same register that it uses,
+ // then we are free to schedule it.
for (SUnit::pred_iterator I = SU->Preds.begin(), E = SU->Preds.end();
I != E; ++I) {
- if (I->isAssignedRegDep())
+ if (I->isAssignedRegDep() && LiveRegDefs[I->getReg()] != SU)
CheckForLiveRegDef(I->getSUnit(), I->getReg(), LiveRegDefs,
RegAdded, LRegs, TRI);
}
@@ -703,20 +706,6 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
CheckForLiveRegDef(SU, *Reg, LiveRegDefs, RegAdded, LRegs, TRI);
}
-
- // Okay, we now know all of the live registers that are defined by an
- // immediate predecessor. It is ok to kill these registers if we are also
- // using it.
- for (SUnit::succ_iterator I = SU->Succs.begin(), E = SU->Succs.end();
- I != E; ++I) {
- if (I->isAssignedRegDep() &&
- LiveRegCycles[I->getReg()] == I->getSUnit()->getHeight()) {
- unsigned Reg = I->getReg();
- if (RegAdded.erase(Reg))
- LRegs.erase(std::find(LRegs.begin(), LRegs.end(), Reg));
- }
- }
-
return !LRegs.empty();
}
OpenPOWER on IntegriCloud