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,6 +39,8 @@ 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/ARC/ARCRegisterInfo.cpp b/llvm/lib/Target/ARC/ARCRegisterInfo.cpp --- a/llvm/lib/Target/ARC/ARCRegisterInfo.cpp +++ b/llvm/lib/Target/ARC/ARCRegisterInfo.cpp @@ -63,7 +63,8 @@ // of the load offset. const TargetRegisterInfo *TRI = MBB.getParent()->getSubtarget().getRegisterInfo(); - BaseReg = RS->scavengeRegister(&ARC::GPR32RegClass, II, SPAdj); + BaseReg = + RS->scavengeRegisterBackwards(ARC::GPR32RegClass, II, false, SPAdj); assert(BaseReg && "Register scavenging failed."); LLVM_DEBUG(dbgs() << "Scavenged register " << printReg(BaseReg, TRI) << " for FrameReg=" << printReg(FrameReg, TRI)