diff options
Diffstat (limited to 'llvm/lib/Target/ARM/ARMSubtarget.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMSubtarget.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/llvm/lib/Target/ARM/ARMSubtarget.cpp b/llvm/lib/Target/ARM/ARMSubtarget.cpp index eb4d39b01cb..7a57376a689 100644 --- a/llvm/lib/Target/ARM/ARMSubtarget.cpp +++ b/llvm/lib/Target/ARM/ARMSubtarget.cpp @@ -98,8 +98,9 @@ ARMSubtarget::ARMSubtarget(const Triple &TT, const std::string &CPU, const ARMBaseTargetMachine &TM, bool IsLittle, bool MinSize) : ARMGenSubtargetInfo(TT, CPU, FS), UseMulOps(UseFusedMulOps), - CPUString(CPU), OptMinSize(MinSize), IsLittle(IsLittle), - TargetTriple(TT), Options(TM.Options), TM(TM), + ReservedGPRegisters(ARM::GPRRegClass.getNumRegs()), CPUString(CPU), + OptMinSize(MinSize), IsLittle(IsLittle), TargetTriple(TT), + Options(TM.Options), TM(TM), FrameLowering(initializeFrameLowering(CPU, FS)), // At this point initializeSubtargetDependencies has been called so // we can query directly. @@ -253,8 +254,18 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) { (Options.UnsafeFPMath || isTargetDarwin())) UseNEONForSinglePrecisionFP = true; - if (isRWPI()) - ReserveR9 = true; + if (isRWPI() || (isTargetMachO() && !HasV6Ops)) + ReservedGPRegisters.set(9); + + // Throw an error when trying to reserve a target's FP register. It may + // be used by the compiler even when frame pointer elimination is enabled. + // FIXME: Throw this error if -frame-pointer=none is not set; otherwise + // only emit a warning. + const int restFP = (useR7AsFramePointer()) ? 7 : 11; + if (isGPRegisterReserved(restFP)) + report_fatal_error( + "Register r" + std::to_string(restFP) + + " has been specified but is used as the frame pointer for this target."); // If MVEVectorCostFactor is still 0 (has not been set to anything else), default it to 2 if (MVEVectorCostFactor == 0) |