diff options
author | Jay Foad <jay.foad@amd.com> | 2023-11-08 09:49:07 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-08 09:49:07 +0000 |
commit | d5f3b3b3b188d17aa8a2227d31e8fd7611d7dfff (patch) | |
tree | c88ad97b9014d88cdbdc31ac6aeae37877ae9d9f /llvm/lib/CodeGen/RegisterScavenging.cpp | |
parent | e6a94dca38d77db2678366c55bb7b72cfa312487 (diff) | |
download | llvm-d5f3b3b3b188d17aa8a2227d31e8fd7611d7dfff.zip llvm-d5f3b3b3b188d17aa8a2227d31e8fd7611d7dfff.tar.gz llvm-d5f3b3b3b188d17aa8a2227d31e8fd7611d7dfff.tar.bz2 |
[RegScavenger] Simplify state tracking for backwards scavenging (#71202)
Track the live register state immediately before, instead of after,
MBBI. This makes it simple to track the state at the start or end of a
basic block without a separate (and poorly named) Tracking flag.
This changes the API of the backward(MachineBasicBlock::iterator I)
method, which now recedes to the state just before, instead of just
after, *I. Some clients are simplified by this change.
There is one small functional change shown in the lit tests where
multiple spilled registers all need to be reloaded before the same
instruction. The reloads will now be inserted in the opposite order.
This should not affect correctness.
Diffstat (limited to 'llvm/lib/CodeGen/RegisterScavenging.cpp')
-rw-r--r-- | llvm/lib/CodeGen/RegisterScavenging.cpp | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/llvm/lib/CodeGen/RegisterScavenging.cpp b/llvm/lib/CodeGen/RegisterScavenging.cpp index e6ff570..0ac3489 100644 --- a/llvm/lib/CodeGen/RegisterScavenging.cpp +++ b/llvm/lib/CodeGen/RegisterScavenging.cpp @@ -65,30 +65,22 @@ void RegScavenger::init(MachineBasicBlock &MBB) { SI.Reg = 0; SI.Restore = nullptr; } - - Tracking = false; } void RegScavenger::enterBasicBlock(MachineBasicBlock &MBB) { init(MBB); LiveUnits.addLiveIns(MBB); + MBBI = MBB.begin(); } void RegScavenger::enterBasicBlockEnd(MachineBasicBlock &MBB) { init(MBB); LiveUnits.addLiveOuts(MBB); - - // Move internal iterator at the last instruction of the block. - if (!MBB.empty()) { - MBBI = std::prev(MBB.end()); - Tracking = true; - } + MBBI = MBB.end(); } void RegScavenger::backward() { - assert(Tracking && "Must be tracking to determine kills and defs"); - - const MachineInstr &MI = *MBBI; + const MachineInstr &MI = *--MBBI; LiveUnits.stepBackward(MI); // Expire scavenge spill frameindex uses. @@ -98,12 +90,6 @@ void RegScavenger::backward() { I.Restore = nullptr; } } - - if (MBBI == MBB->begin()) { - MBBI = MachineBasicBlock::iterator(nullptr); - Tracking = false; - } else - --MBBI; } bool RegScavenger::isRegUsed(Register Reg, bool includeReserved) const { @@ -317,9 +303,8 @@ Register RegScavenger::scavengeRegisterBackwards(const TargetRegisterClass &RC, // Find the register whose use is furthest away. MachineBasicBlock::iterator UseMI; ArrayRef<MCPhysReg> AllocationOrder = RC.getRawAllocationOrder(MF); - std::pair<MCPhysReg, MachineBasicBlock::iterator> P = - findSurvivorBackwards(*MRI, MBBI, To, LiveUnits, AllocationOrder, - RestoreAfter); + std::pair<MCPhysReg, MachineBasicBlock::iterator> P = findSurvivorBackwards( + *MRI, std::prev(MBBI), To, LiveUnits, AllocationOrder, RestoreAfter); MCPhysReg Reg = P.first; MachineBasicBlock::iterator SpillBefore = P.second; // Found an available register? @@ -334,9 +319,8 @@ Register RegScavenger::scavengeRegisterBackwards(const TargetRegisterClass &RC, assert(Reg != 0 && "No register left to scavenge!"); - MachineBasicBlock::iterator ReloadAfter = - RestoreAfter ? std::next(MBBI) : MBBI; - MachineBasicBlock::iterator ReloadBefore = std::next(ReloadAfter); + MachineBasicBlock::iterator ReloadBefore = + RestoreAfter ? std::next(MBBI) : MBBI; if (ReloadBefore != MBB.end()) LLVM_DEBUG(dbgs() << "Reload before: " << *ReloadBefore << '\n'); ScavengedInfo &Scavenged = spill(Reg, RC, SPAdj, SpillBefore, ReloadBefore); @@ -414,9 +398,9 @@ static bool scavengeFrameVirtualRegsInBlock(MachineRegisterInfo &MRI, unsigned InitialNumVirtRegs = MRI.getNumVirtRegs(); bool NextInstructionReadsVReg = false; for (MachineBasicBlock::iterator I = MBB.end(); I != MBB.begin(); ) { - --I; - // Move RegScavenger to the position between *I and *std::next(I). + // Move RegScavenger to the position between *std::prev(I) and *I. RS.backward(I); + --I; // Look for unassigned vregs in the uses of *std::next(I). if (NextInstructionReadsVReg) { |