<div dir="ltr">So you're defining it to true here and only have an option to set it to true from the front end.<div><br></div><div>How would you turn it off? :)</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 23, 2015 at 8:16 AM Akira Hatanaka <<a href="mailto:ahatanak@gmail.com">ahatanak@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ahatanak created this revision.<br>
ahatanak added reviewers: echristo, dexonsmith.<br>
ahatanak added a subscriber: llvm-commits.<br>
Herald added subscribers: rengolin, aemerson.<br>
<br>
This patch defines a subtarget feature "reserve-x18" and uses it to decide whether X18 should be reserved.<br>
<br>
The clang-side patch which makes changes to pass a subtarget feature instead of a backend option is here: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11462&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=sU_zShEeay9YuJv2d129He0S-10A8oXhaBalCpA01c8&s=J23coh-Z40gm8UFFY0mK8OHkowaEyQPSW2-R-KTojmU&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11462</a><br>
<br>
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D11463&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=sU_zShEeay9YuJv2d129He0S-10A8oXhaBalCpA01c8&s=ETl6QITpKsdZ6LV9CZMplZsJcMKUajlFqlqVLXMKBzg&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D11463</a><br>
<br>
Files:<br>
  lib/Target/AArch64/AArch64.td<br>
  lib/Target/AArch64/AArch64RegisterInfo.cpp<br>
  lib/Target/AArch64/AArch64Subtarget.h<br>
  test/CodeGen/AArch64/arm64-platform-reg.ll<br>
<br>
Index: test/CodeGen/AArch64/arm64-platform-reg.ll<br>
===================================================================<br>
--- test/CodeGen/AArch64/arm64-platform-reg.ll<br>
+++ test/CodeGen/AArch64/arm64-platform-reg.ll<br>
@@ -1,5 +1,5 @@<br>
 ; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18<br>
-; RUN: llc -mtriple=arm64-freebsd-gnu -aarch64-reserve-x18 -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18<br>
+; RUN: llc -mtriple=arm64-freebsd-gnu -mattr=+reserve-x18 -o - %s | FileCheck %s --check-prefix=CHECK-RESERVE-X18<br>
 ; RUN: llc -mtriple=arm64-linux-gnu -o - %s | FileCheck %s<br>
<br>
 ; x18 is reserved as a platform register on Darwin but not on other<br>
Index: lib/Target/AArch64/AArch64Subtarget.h<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64Subtarget.h<br>
+++ lib/Target/AArch64/AArch64Subtarget.h<br>
@@ -51,6 +51,9 @@<br>
   // HasZeroCycleZeroing - Has zero-cycle zeroing instructions.<br>
   bool HasZeroCycleZeroing;<br>
<br>
+  // ReserveX18 - X18 is not available as a general purpose register.<br>
+  bool ReserveX18;<br>
+<br>
   bool IsLittle;<br>
<br>
   /// CPUString - String name of used CPU.<br>
@@ -101,6 +104,7 @@<br>
<br>
   bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; }<br>
<br>
+  bool isX18Reserved() const { return ReserveX18; }<br>
   bool hasFPARMv8() const { return HasFPARMv8; }<br>
   bool hasNEON() const { return HasNEON; }<br>
   bool hasCrypto() const { return HasCrypto; }<br>
Index: lib/Target/AArch64/AArch64RegisterInfo.cpp<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64RegisterInfo.cpp<br>
+++ lib/Target/AArch64/AArch64RegisterInfo.cpp<br>
@@ -34,10 +34,6 @@<br>
 #define GET_REGINFO_TARGET_DESC<br>
 #include "AArch64GenRegisterInfo.inc"<br>
<br>
-static cl::opt<bool><br>
-ReserveX18("aarch64-reserve-x18", cl::Hidden,<br>
-          cl::desc("Reserve X18, making it unavailable as GPR"));<br>
-<br>
 AArch64RegisterInfo::AArch64RegisterInfo(const Triple &TT)<br>
     : AArch64GenRegisterInfo(AArch64::LR), TT(TT) {}<br>
<br>
@@ -104,7 +100,7 @@<br>
     Reserved.set(AArch64::W29);<br>
   }<br>
<br>
-  if (TT.isOSDarwin() || ReserveX18) {<br>
+  if (TT.isOSDarwin() || MF.getSubtarget<AArch64Subtarget>().isX18Reserved()) {<br>
     Reserved.set(AArch64::X18); // Platform register<br>
     Reserved.set(AArch64::W18);<br>
   }<br>
@@ -131,7 +127,8 @@<br>
     return true;<br>
   case AArch64::X18:<br>
   case AArch64::W18:<br>
-    return TT.isOSDarwin() || ReserveX18;<br>
+    return TT.isOSDarwin() ||<br>
+           MF.getSubtarget<AArch64Subtarget>().isX18Reserved();<br>
   case AArch64::FP:<br>
   case AArch64::W29:<br>
     return TFI->hasFP(MF) || TT.isOSDarwin();<br>
@@ -402,9 +399,11 @@<br>
   case AArch64::GPR32commonRegClassID:<br>
   case AArch64::GPR64commonRegClassID:<br>
     return 32 - 1                                // XZR/SP<br>
-           - (TFI->hasFP(MF) || TT.isOSDarwin()) // FP<br>
-           - (TT.isOSDarwin() || ReserveX18) // X18 reserved as platform register<br>
-           - hasBasePointer(MF);           // X19<br>
+      - (TFI->hasFP(MF) || TT.isOSDarwin()) // FP<br>
+      - (TT.isOSDarwin() ||<br>
+         MF.getSubtarget<AArch64Subtarget>()<br>
+             .isX18Reserved()) // X18 reserved as platform register<br>
+      - hasBasePointer(MF);    // X19<br>
   case AArch64::FPR8RegClassID:<br>
   case AArch64::FPR16RegClassID:<br>
   case AArch64::FPR32RegClassID:<br>
Index: lib/Target/AArch64/AArch64.td<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64.td<br>
+++ lib/Target/AArch64/AArch64.td<br>
@@ -40,6 +40,10 @@<br>
 def FeatureZCZeroing : SubtargetFeature<"zcz", "HasZeroCycleZeroing", "true",<br>
                                         "Has zero-cycle zeroing instructions">;<br>
<br>
+def FeatureReserveX18 : SubtargetFeature<"reserve-x18", "ReserveX18", "true",<br>
+                                         "Reserve X18, making it unavailable "<br>
+                                         "as a GPR">;<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 // Architectures.<br>
 //<br>
<br>
<br>
</blockquote></div>