diff options
| author | Andrew Trick <atrick@apple.com> | 2010-12-21 22:27:44 +0000 | 
|---|---|---|
| committer | Andrew Trick <atrick@apple.com> | 2010-12-21 22:27:44 +0000 | 
| commit | fbb3ed877415f2d9691283575e34d910e75ea3ce (patch) | |
| tree | d382ad2b8d971933357d4fe58e3e43a72d083a02 /llvm/lib | |
| parent | cff2764a6eb8123557c98891384b975a6bdd4d6c (diff) | |
| download | bcm5719-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.cpp | 19 | 
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();  } | 

