mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-16 11:30:51 +00:00
Fix a bug in the scheduler's handling of "unspillable" vregs.
Imagine we see: EFLAGS = inst1 EFLAGS = inst2 FLAGS gpr = inst3 EFLAGS Previously, we would refuse to schedule inst2 because it clobbers the EFLAGS of the predecessor. However, it also uses the EFLAGS of the predecessor, so it is safe to emit. SDep edges ensure that the right order happens already anyway. This fixes 2 testsuite crashes with the X86 patch I'm going to commit next. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122211 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e273690d7a
commit
37944985a5
@ -283,7 +283,7 @@ void ScheduleDAGRRList::ScheduleNodeBottomUp(SUnit *SU, unsigned CurCycle) {
|
||||
Sequence.push_back(SU);
|
||||
|
||||
AvailableQueue->ScheduledNode(SU);
|
||||
|
||||
|
||||
ReleasePredecessors(SU, CurCycle);
|
||||
|
||||
// Release all the implicit physical register defs that are live.
|
||||
@ -704,6 +704,19 @@ DelayForLiveRegsBottomUp(SUnit *SU, SmallVector<unsigned, 4> &LRegs) {
|
||||
}
|
||||
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user