mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[AArch64] Define subtarget feature "reserve-x18", which is used to decide
whether register x18 should be reserved. This change is needed because we cannot use a backend option to set cl::opt "aarch64-reserve-x18" when doing LTO. Out-of-tree projects currently using cl::opt option "-aarch64-reserve-x18" to reserve x18 should make changes to add subtarget feature "reserve-x18" to the IR. rdar://problem/21529937 Differential Revision: http://reviews.llvm.org/D11463 llvm-svn: 243186
This commit is contained in:
parent
1744eb89b5
commit
70eb2824e6
@ -40,6 +40,10 @@ def FeatureZCRegMove : SubtargetFeature<"zcm", "HasZeroCycleRegMove", "true",
|
||||
def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true",
|
||||
"Has zero-cycle zeroing instructions">;
|
||||
|
||||
def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true",
|
||||
"Reserve X18, making it unavailable "
|
||||
"as a GPR">;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Architectures.
|
||||
//
|
||||
|
@ -34,10 +34,6 @@ using namespace llvm;
|
||||
#define GET_REGINFO_TARGET_DESC
|
||||
#include "AArch64GenRegisterInfo.inc"
|
||||
|
||||
static cl::opt<bool>
|
||||
ReserveX18("aarch64-reserve-x18", cl::Hidden,
|
||||
cl::desc("Reserve X18, making it unavailable as GPR"));
|
||||
|
||||
AArch64RegisterInfo::AArch64RegisterInfo(const Triple &TT)
|
||||
: AArch64GenRegisterInfo(AArch64::LR), TT(TT) {}
|
||||
|
||||
@ -104,7 +100,7 @@ AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
Reserved.set(AArch64::W29);
|
||||
}
|
||||
|
||||
if (TT.isOSDarwin() || ReserveX18) {
|
||||
if (TT.isOSDarwin() || MF.getSubtarget<AArch64Subtarget>().isX18Reserved()) {
|
||||
Reserved.set(AArch64::X18); // Platform register
|
||||
Reserved.set(AArch64::W18);
|
||||
}
|
||||
@ -131,7 +127,8 @@ bool AArch64RegisterInfo::isReservedReg(const MachineFunction &MF,
|
||||
return true;
|
||||
case AArch64::X18:
|
||||
case AArch64::W18:
|
||||
return TT.isOSDarwin() || ReserveX18;
|
||||
return TT.isOSDarwin() ||
|
||||
MF.getSubtarget<AArch64Subtarget>().isX18Reserved();
|
||||
case AArch64::FP:
|
||||
case AArch64::W29:
|
||||
return TFI->hasFP(MF) || TT.isOSDarwin();
|
||||
@ -402,9 +399,11 @@ unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
|
||||
case AArch64::GPR32commonRegClassID:
|
||||
case AArch64::GPR64commonRegClassID:
|
||||
return 32 - 1 // XZR/SP
|
||||
- (TFI->hasFP(MF) || TT.isOSDarwin()) // FP
|
||||
- (TT.isOSDarwin() || ReserveX18) // X18 reserved as platform register
|
||||
- hasBasePointer(MF); // X19
|
||||
- (TFI->hasFP(MF) || TT.isOSDarwin()) // FP
|
||||
- (TT.isOSDarwin() ||
|
||||
MF.getSubtarget<AArch64Subtarget>()
|
||||
.isX18Reserved()) // X18 reserved as platform register
|
||||
- hasBasePointer(MF); // X19
|
||||
case AArch64::FPR8RegClassID:
|
||||
case AArch64::FPR16RegClassID:
|
||||
case AArch64::FPR32RegClassID:
|
||||
|
@ -48,7 +48,8 @@ AArch64Subtarget::AArch64Subtarget(const Triple &TT, const std::string &CPU,
|
||||
: AArch64GenSubtargetInfo(TT, CPU, FS), ARMProcFamily(Others),
|
||||
HasV8_1aOps(false), HasFPARMv8(false), HasNEON(false), HasCrypto(false),
|
||||
HasCRC(false), HasZeroCycleRegMove(false), HasZeroCycleZeroing(false),
|
||||
IsLittle(LittleEndian), CPUString(CPU), TargetTriple(TT), FrameLowering(),
|
||||
ReserveX18(false), IsLittle(LittleEndian), CPUString(CPU),
|
||||
TargetTriple(TT), FrameLowering(),
|
||||
InstrInfo(initializeSubtargetDependencies(FS)), TSInfo(),
|
||||
TLInfo(TM, *this) {}
|
||||
|
||||
|
@ -51,6 +51,9 @@ protected:
|
||||
// HasZeroCycleZeroing - Has zero-cycle zeroing instructions.
|
||||
bool HasZeroCycleZeroing;
|
||||
|
||||
// ReserveX18 - X18 is not available as a general purpose register.
|
||||
bool ReserveX18;
|
||||
|
||||
bool IsLittle;
|
||||
|
||||
/// CPUString - String name of used CPU.
|
||||
@ -101,6 +104,7 @@ public:
|
||||
|
||||
bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; }
|
||||
|
||||
bool isX18Reserved() const { return ReserveX18; }
|
||||
bool hasFPARMv8() const { return HasFPARMv8; }
|
||||
bool hasNEON() const { return HasNEON; }
|
||||
bool hasCrypto() const { return HasCrypto; }
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18
|
||||
; RUN: llc -mtriple=arm64-freebsd-gnu -aarch64-reserve-x18 -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18
|
||||
; RUN: llc -mtriple=arm64-freebsd-gnu -mattr=+reserve-x18 -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18
|
||||
; RUN: llc -mtriple=arm64-linux-gnu -o - %s | FileCheck %s
|
||||
|
||||
; x18 is reserved as a platform register on Darwin but not on other
|
||||
|
Loading…
Reference in New Issue
Block a user