[Lanai] Use backwards scavenging in frame index elimination
authorJay Foad <jay.foad@amd.com>
Mon, 15 May 2023 15:58:16 +0000 (16:58 +0100)
committerJay Foad <jay.foad@amd.com>
Thu, 18 May 2023 08:58:45 +0000 (09:58 +0100)
This is preferred because it does not rely on accurate kill flags.

Differential Revision: https://reviews.llvm.org/D150600

llvm/lib/Target/Lanai/LanaiRegisterInfo.cpp
llvm/lib/Target/Lanai/LanaiRegisterInfo.h

index 5450bdb..3a271cb 100644 (file)
@@ -167,7 +167,7 @@ bool LanaiRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
     assert(RS && "Register scavenging must be on");
     Register Reg = RS->FindUnusedReg(&Lanai::GPRRegClass);
     if (!Reg)
-      Reg = RS->scavengeRegister(&Lanai::GPRRegClass, II, SPAdj);
+      Reg = RS->scavengeRegisterBackwards(Lanai::GPRRegClass, II, false, SPAdj);
     assert(Reg && "Register scavenger failed");
 
     bool HasNegOffset = false;
@@ -235,10 +235,11 @@ bool LanaiRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II,
         .addReg(FrameReg)
         .addImm(-Offset);
     MI.eraseFromParent();
-  } else {
-    MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, /*isDef=*/false);
-    MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
+    return true;
   }
+
+  MI.getOperand(FIOperandNum).ChangeToRegister(FrameReg, /*isDef=*/false);
+  MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset);
   return false;
 }
 
index 5168ddd..89d9eba 100644 (file)
@@ -34,6 +34,8 @@ struct LanaiRegisterInfo : public LanaiGenRegisterInfo {
 
   bool requiresRegisterScavenging(const MachineFunction &MF) const override;
 
+  bool supportsBackwardScavenger() const override { return true; }
+
   bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
                            unsigned FIOperandNum,
                            RegScavenger *RS = nullptr) const override;