diff --git a/llvm/include/llvm/CodeGen/TargetRegisterInfo.h b/llvm/include/llvm/CodeGen/TargetRegisterInfo.h --- a/llvm/include/llvm/CodeGen/TargetRegisterInfo.h +++ b/llvm/include/llvm/CodeGen/TargetRegisterInfo.h @@ -1045,7 +1045,8 @@ /// the RegScavenger passed to eliminateFrameIndex. If this is true targets /// should scavengeRegisterBackwards in eliminateFrameIndex. New targets /// should prefer reverse scavenging behavior. - virtual bool supportsBackwardScavenger() const { return false; } + /// TODO: Remove this when all targets return true. + virtual bool eliminateFrameIndicesBackwards() const { return true; } /// This method must be overriden to eliminate abstract frame indices from /// instructions which may use them. The instruction referenced by the diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -277,7 +277,7 @@ (RS && !FrameIndexVirtualScavenging) || TRI->requiresFrameIndexReplacementScavenging(MF); - if (TRI->supportsBackwardScavenger()) + if (TRI->eliminateFrameIndicesBackwards()) replaceFrameIndicesBackward(MF); else replaceFrameIndices(MF); diff --git a/llvm/lib/Target/AMDGPU/SIRegisterInfo.h b/llvm/lib/Target/AMDGPU/SIRegisterInfo.h --- a/llvm/lib/Target/AMDGPU/SIRegisterInfo.h +++ b/llvm/lib/Target/AMDGPU/SIRegisterInfo.h @@ -158,10 +158,6 @@ MachineBasicBlock &RestoreMBB, Register SGPR, RegScavenger *RS) const; - bool supportsBackwardScavenger() const override { - return true; - } - bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS) const override; diff --git a/llvm/lib/Target/ARC/ARCRegisterInfo.h b/llvm/lib/Target/ARC/ARCRegisterInfo.h --- a/llvm/lib/Target/ARC/ARCRegisterInfo.h +++ b/llvm/lib/Target/ARC/ARCRegisterInfo.h @@ -39,8 +39,6 @@ bool useFPForScavengingIndex(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; diff --git a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h --- a/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h +++ b/llvm/lib/Target/ARM/ARMBaseRegisterInfo.h @@ -219,8 +219,6 @@ bool requiresFrameIndexScavenging(const MachineFunction &MF) const override; - bool supportsBackwardScavenger() const override { return true; } - bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override; bool eliminateFrameIndex(MachineBasicBlock::iterator II, diff --git a/llvm/lib/Target/Lanai/LanaiRegisterInfo.h b/llvm/lib/Target/Lanai/LanaiRegisterInfo.h --- a/llvm/lib/Target/Lanai/LanaiRegisterInfo.h +++ b/llvm/lib/Target/Lanai/LanaiRegisterInfo.h @@ -34,8 +34,6 @@ 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; diff --git a/llvm/lib/Target/Mips/MipsRegisterInfo.h b/llvm/lib/Target/Mips/MipsRegisterInfo.h --- a/llvm/lib/Target/Mips/MipsRegisterInfo.h +++ b/llvm/lib/Target/Mips/MipsRegisterInfo.h @@ -70,8 +70,6 @@ /// Return GPR register class. virtual const TargetRegisterClass *intRegClass(unsigned Size) const = 0; - bool supportsBackwardScavenger() const override { return true; } - private: virtual void eliminateFI(MachineBasicBlock::iterator II, unsigned OpNo, int FrameIndex, uint64_t StackSize, diff --git a/llvm/lib/Target/PowerPC/PPCRegisterInfo.h b/llvm/lib/Target/PowerPC/PPCRegisterInfo.h --- a/llvm/lib/Target/PowerPC/PPCRegisterInfo.h +++ b/llvm/lib/Target/PowerPC/PPCRegisterInfo.h @@ -113,8 +113,6 @@ bool requiresFrameIndexScavenging(const MachineFunction &MF) const override; - bool supportsBackwardScavenger() const override { return true; } - bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override; void lowerDynamicAlloc(MachineBasicBlock::iterator II) const; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h --- a/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyRegisterInfo.h @@ -38,8 +38,6 @@ unsigned FIOperandNum, RegScavenger *RS = nullptr) const override; - bool supportsBackwardScavenger() const override { return true; } - // Debug information queries. Register getFrameRegister(const MachineFunction &MF) const override; diff --git a/llvm/lib/Target/X86/X86RegisterInfo.h b/llvm/lib/Target/X86/X86RegisterInfo.h --- a/llvm/lib/Target/X86/X86RegisterInfo.h +++ b/llvm/lib/Target/X86/X86RegisterInfo.h @@ -143,6 +143,12 @@ int SPAdj, unsigned FIOperandNum, RegScavenger *RS = nullptr) const override; + /// Process frame indices in forwards block order because + /// X86InstrInfo::getSPAdjust relies on it when searching for the + /// ADJCALLSTACKUP pseudo following a call. + /// TODO: Fix this and return true like all other targets. + bool eliminateFrameIndicesBackwards() const override { return false; } + /// findDeadCallerSavedReg - Return a caller-saved register that isn't live /// when it reaches the "return" instruction. We can then pop a stack object /// to this register without worry about clobbering it. diff --git a/llvm/lib/Target/XCore/XCoreRegisterInfo.h b/llvm/lib/Target/XCore/XCoreRegisterInfo.h --- a/llvm/lib/Target/XCore/XCoreRegisterInfo.h +++ b/llvm/lib/Target/XCore/XCoreRegisterInfo.h @@ -34,8 +34,6 @@ bool useFPForScavengingIndex(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;