84 lines
3.2 KiB
Diff
84 lines
3.2 KiB
Diff
Pull in r226664 from upstream llvm trunk (by Tim Northover):
|
|
|
|
AArch64: add backend option to reserve x18 (platform register)
|
|
|
|
AAPCS64 says that it's up to the platform to specify whether x18 is
|
|
reserved, and a first step on that way is to add a flag controlling
|
|
it.
|
|
|
|
From: Andrew Turner <andrew@fubar.geek.nz>
|
|
|
|
Introduced here: http://svnweb.freebsd.org/changeset/base/277774
|
|
|
|
Index: lib/Target/AArch64/AArch64RegisterInfo.cpp
|
|
===================================================================
|
|
--- lib/Target/AArch64/AArch64RegisterInfo.cpp
|
|
+++ lib/Target/AArch64/AArch64RegisterInfo.cpp
|
|
@@ -33,6 +33,10 @@ 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 AArch64InstrInfo *tii,
|
|
const AArch64Subtarget *sti)
|
|
: AArch64GenRegisterInfo(AArch64::LR), TII(tii), STI(sti) {}
|
|
@@ -90,7 +94,7 @@ AArch64RegisterInfo::getReservedRegs(const Machine
|
|
Reserved.set(AArch64::W29);
|
|
}
|
|
|
|
- if (STI->isTargetDarwin()) {
|
|
+ if (STI->isTargetDarwin() || ReserveX18) {
|
|
Reserved.set(AArch64::X18); // Platform register
|
|
Reserved.set(AArch64::W18);
|
|
}
|
|
@@ -117,7 +121,7 @@ bool AArch64RegisterInfo::isReservedReg(const Mach
|
|
return true;
|
|
case AArch64::X18:
|
|
case AArch64::W18:
|
|
- return STI->isTargetDarwin();
|
|
+ return STI->isTargetDarwin() || ReserveX18;
|
|
case AArch64::FP:
|
|
case AArch64::W29:
|
|
return TFI->hasFP(MF) || STI->isTargetDarwin();
|
|
@@ -379,7 +383,7 @@ unsigned AArch64RegisterInfo::getRegPressureLimit(
|
|
case AArch64::GPR64commonRegClassID:
|
|
return 32 - 1 // XZR/SP
|
|
- (TFI->hasFP(MF) || STI->isTargetDarwin()) // FP
|
|
- - STI->isTargetDarwin() // X18 reserved as platform register
|
|
+ - (STI->isTargetDarwin() || ReserveX18) // X18 reserved as platform register
|
|
- hasBasePointer(MF); // X19
|
|
case AArch64::FPR8RegClassID:
|
|
case AArch64::FPR16RegClassID:
|
|
Index: test/CodeGen/AArch64/arm64-platform-reg.ll
|
|
===================================================================
|
|
--- test/CodeGen/AArch64/arm64-platform-reg.ll
|
|
+++ test/CodeGen/AArch64/arm64-platform-reg.ll
|
|
@@ -1,4 +1,5 @@
|
|
-; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s --check-prefix=CHECK-DARWIN
|
|
+; 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-linux-gnu -o - %s | FileCheck %s
|
|
|
|
; x18 is reserved as a platform register on Darwin but not on other
|
|
@@ -16,11 +17,11 @@ define void @keep_live() {
|
|
; CHECK: ldr x18
|
|
; CHECK: str x18
|
|
|
|
-; CHECK-DARWIN-NOT: ldr fp
|
|
-; CHECK-DARWIN-NOT: ldr x18
|
|
-; CHECK-DARWIN: Spill
|
|
-; CHECK-DARWIN-NOT: ldr fp
|
|
-; CHECK-DARWIN-NOT: ldr x18
|
|
-; CHECK-DARWIN: ret
|
|
+; CHECK-RESERVE-X18-NOT: ldr fp
|
|
+; CHECK-RESERVE-X18-NOT: ldr x18
|
|
+; CHECK-RESERVE-X18: Spill
|
|
+; CHECK-RESERVE-X18-NOT: ldr fp
|
|
+; CHECK-RESERVE-X18-NOT: ldr x18
|
|
+; CHECK-RESERVE-X18: ret
|
|
ret void
|
|
}
|