Index: include/llvm/Target/TargetRegisterInfo.h =================================================================== --- include/llvm/Target/TargetRegisterInfo.h +++ include/llvm/Target/TargetRegisterInfo.h @@ -818,6 +818,13 @@ return false; } + /// Returns true if the target wants to update the reserved register + /// before the register allocation process. + virtual bool + requiresFreezingReservedRegsBeforeRegAlloc(const MachineFunction &MF) const { + return false; + } + /// Return true if target has reserved a spill slot in the stack frame of /// the given function for the specified register. e.g. On x86, if the frame /// register is required, the first fixed stack object is reserved as its Index: lib/CodeGen/RegAllocBase.cpp =================================================================== --- lib/CodeGen/RegAllocBase.cpp +++ lib/CodeGen/RegAllocBase.cpp @@ -60,8 +60,10 @@ VRM = &vrm; LIS = &lis; Matrix = &mat; - MRI->freezeReservedRegs(vrm.getMachineFunction()); - RegClassInfo.runOnMachineFunction(vrm.getMachineFunction()); + MachineFunction &MF = VRM->getMachineFunction(); + if (TRI->requiresFreezingReservedRegsBeforeRegAlloc(MF)) + MRI->freezeReservedRegs(MF); + RegClassInfo.runOnMachineFunction(MF); } // Visit all the live registers. If they are already assigned to a physical Index: lib/CodeGen/RegAllocFast.cpp =================================================================== --- lib/CodeGen/RegAllocFast.cpp +++ lib/CodeGen/RegAllocFast.cpp @@ -1091,7 +1091,8 @@ MRI = &MF->getRegInfo(); TRI = MF->getSubtarget().getRegisterInfo(); TII = MF->getSubtarget().getInstrInfo(); - MRI->freezeReservedRegs(Fn); + if (TRI->requiresFreezingReservedRegsBeforeRegAlloc(Fn)) + MRI->freezeReservedRegs(Fn); RegClassInfo.runOnMachineFunction(Fn); UsedInInstr.clear(); UsedInInstr.setUniverse(TRI->getNumRegUnits()); Index: lib/CodeGen/RegAllocPBQP.cpp =================================================================== --- lib/CodeGen/RegAllocPBQP.cpp +++ lib/CodeGen/RegAllocPBQP.cpp @@ -753,7 +753,9 @@ std::unique_ptr VRegSpiller(createInlineSpiller(*this, MF, VRM)); - MF.getRegInfo().freezeReservedRegs(MF); + const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); + if (TRI->requiresFreezingReservedRegsBeforeRegAlloc(MF)) + MF.getRegInfo().freezeReservedRegs(MF); DEBUG(dbgs() << "PBQP Register Allocating for " << MF.getName() << "\n"); Index: lib/Target/PowerPC/PPCRegisterInfo.h =================================================================== --- lib/Target/PowerPC/PPCRegisterInfo.h +++ lib/Target/PowerPC/PPCRegisterInfo.h @@ -101,6 +101,11 @@ return true; } + bool requiresFreezingReservedRegsBeforeRegAlloc( + const MachineFunction &MF) const override { + return true; + } + void lowerDynamicAlloc(MachineBasicBlock::iterator II) const; void lowerDynamicAreaOffset(MachineBasicBlock::iterator II) const; void lowerCRSpilling(MachineBasicBlock::iterator II,