summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/AArch64/AArch64.td4
-rw-r--r--llvm/lib/Target/AArch64/AArch64ISelLowering.cpp8
-rw-r--r--llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp14
-rw-r--r--llvm/lib/Target/AArch64/AArch64Subtarget.h4
4 files changed, 25 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64.td b/llvm/lib/Target/AArch64/AArch64.td
index c324dfbd2b5..c8cde5ecd59 100644
--- a/llvm/lib/Target/AArch64/AArch64.td
+++ b/llvm/lib/Target/AArch64/AArch64.td
@@ -76,6 +76,10 @@ def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true",
"Reserve X18, making it unavailable "
"as a GPR">;
+def FeatureReserveX20 : SubtargetFeature<"reserve-x20", "ReserveX20", "true",
+ "Reserve X20, making it unavailable "
+ "as a GPR">;
+
def FeatureUseAA : SubtargetFeature<"use-aa", "UseAA", "true",
"Use alias analysis during codegen">;
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 66f1b63a0ec..70a19f6bcdb 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -4930,9 +4930,13 @@ unsigned AArch64TargetLowering::getRegisterByName(const char* RegName, EVT VT,
.Case("sp", AArch64::SP)
.Case("x18", AArch64::X18)
.Case("w18", AArch64::W18)
+ .Case("x20", AArch64::X20)
+ .Case("w20", AArch64::W20)
.Default(0);
- if ((Reg == AArch64::X18 || Reg == AArch64::W18) &&
- !Subtarget->isX18Reserved())
+ if (((Reg == AArch64::X18 || Reg == AArch64::W18) &&
+ !Subtarget->isX18Reserved()) ||
+ ((Reg == AArch64::X20 || Reg == AArch64::W20) &&
+ !Subtarget->isX20Reserved()))
Reg = 0;
if (Reg)
return Reg;
diff --git a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
index 84f1500609a..9779f41804d 100644
--- a/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp
@@ -137,6 +137,9 @@ AArch64RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
if (MF.getSubtarget<AArch64Subtarget>().isX18Reserved())
markSuperRegs(Reserved, AArch64::W18); // Platform register
+ if (MF.getSubtarget<AArch64Subtarget>().isX20Reserved())
+ markSuperRegs(Reserved, AArch64::W20); // Platform register
+
if (hasBasePointer(MF))
markSuperRegs(Reserved, AArch64::W19);
@@ -159,12 +162,15 @@ bool AArch64RegisterInfo::isReservedReg(const MachineFunction &MF,
case AArch64::X18:
case AArch64::W18:
return MF.getSubtarget<AArch64Subtarget>().isX18Reserved();
+ case AArch64::X19:
+ case AArch64::W19:
+ return hasBasePointer(MF);
+ case AArch64::X20:
+ case AArch64::W20:
+ return MF.getSubtarget<AArch64Subtarget>().isX20Reserved();
case AArch64::FP:
case AArch64::W29:
return TFI->hasFP(MF) || TT.isOSDarwin();
- case AArch64::W19:
- case AArch64::X19:
- return hasBasePointer(MF);
}
return false;
@@ -432,6 +438,8 @@ unsigned AArch64RegisterInfo::getRegPressureLimit(const TargetRegisterClass *RC,
- (TFI->hasFP(MF) || TT.isOSDarwin()) // FP
- MF.getSubtarget<AArch64Subtarget>()
.isX18Reserved() // X18 reserved as platform register
+ - MF.getSubtarget<AArch64Subtarget>()
+ .isX20Reserved() // X20 reserved as platform register
- hasBasePointer(MF); // X19
case AArch64::FPR8RegClassID:
case AArch64::FPR16RegClassID:
diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h
index 356e084e856..c6a1aa190f9 100644
--- a/llvm/lib/Target/AArch64/AArch64Subtarget.h
+++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h
@@ -131,6 +131,9 @@ protected:
// ReserveX18 - X18 is not available as a general purpose register.
bool ReserveX18;
+ // ReserveX20 - X20 is not available as a general purpose register.
+ bool ReserveX20 = false;
+
bool IsLittle;
/// TargetTriple - What processor and OS we're targeting.
@@ -216,6 +219,7 @@ public:
}
bool isX18Reserved() const { return ReserveX18; }
+ bool isX20Reserved() const { return ReserveX20; }
bool hasFPARMv8() const { return HasFPARMv8; }
bool hasNEON() const { return HasNEON; }
bool hasCrypto() const { return HasCrypto; }
OpenPOWER on IntegriCloud