Skip to content

[AArch64] Use GenericTable PrimaryKey to remove one of the SearchIndexes for SysRegs. NFC #122001

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 8, 2025

Conversation

topperc
Copy link
Collaborator

@topperc topperc commented Jan 7, 2025

Use PrimaryKeyReturnRange to get all of the registers with the same encoding. This allows AltName to be removed.

…xs for SysRegs. NFC

Use PrimaryKeyReturnRange to get all of the registers with the same
encoding. This allows AltName to be removed.
@llvmbot
Copy link
Member

llvmbot commented Jan 7, 2025

@llvm/pr-subscribers-backend-aarch64

Author: Craig Topper (topperc)

Changes

Use PrimaryKeyReturnRange to get all of the registers with the same encoding. This allows AltName to be removed.


Full diff: https://github.com/llvm/llvm-project/pull/122001.diff

3 Files Affected:

  • (modified) llvm/lib/Target/AArch64/AArch64SystemOperands.td (+7-14)
  • (modified) llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp (+14-15)
  • (modified) llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h (-4)
diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
index c76fc8abeedad5..19388467c15bc7 100644
--- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td
+++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
@@ -998,7 +998,6 @@ defm : TLBI<"VMALLWS2E1OS",  0b100, 0b1000, 0b0101, 0b010, 0>;
 class SysReg<string name, bits<2> op0, bits<3> op1, bits<4> crn, bits<4> crm,
              bits<3> op2> {
   string Name = name;
-  string AltName = name;
   bits<16> Encoding;
   let Encoding{15-14} = op0;
   let Encoding{13-11} = op1;
@@ -1018,8 +1017,11 @@ def SysRegValues : GenericEnum {
 
 def SysRegsList : GenericTable {
   let FilterClass = "SysReg";
-  let Fields = ["Name", "AltName", "Encoding", "Readable", "Writeable",
-                "Requires"];
+  let Fields = ["Name", "Encoding", "Readable", "Writeable", "Requires"];
+
+  let PrimaryKey = ["Encoding"];
+  let PrimaryKeyName = "lookupSysRegByEncoding";
+  let PrimaryKeyReturnRange = true;
 }
 
 def lookupSysRegByName : SearchIndex {
@@ -1027,11 +1029,6 @@ def lookupSysRegByName : SearchIndex {
   let Key = ["Name"];
 }
 
-def lookupSysRegByEncoding : SearchIndex {
-  let Table = SysRegsList;
-  let Key = ["Encoding"];
-}
-
 class RWSysReg<string name, bits<2> op0, bits<3> op1, bits<4> crn, bits<4> crm,
                bits<3> op2>
     : SysReg<name, op0, op1, crn, crm, op2> {
@@ -1317,9 +1314,7 @@ def : RWSysReg<"TTBR0_EL1",          0b11, 0b000, 0b0010, 0b0000, 0b000>;
 def : RWSysReg<"TTBR0_EL3",          0b11, 0b110, 0b0010, 0b0000, 0b000>;
 
 let Requires = [{ {AArch64::FeatureEL2VMSA} }] in {
-def : RWSysReg<"TTBR0_EL2",          0b11, 0b100, 0b0010, 0b0000, 0b000> {
-  let AltName = "VSCTLR_EL2";
-}
+def : RWSysReg<"TTBR0_EL2",          0b11, 0b100, 0b0010, 0b0000, 0b000>;
 def : RWSysReg<"VTTBR_EL2",          0b11, 0b100, 0b0010, 0b0001, 0b000>;
 }
 
@@ -1706,9 +1701,7 @@ def : RWSysReg<"ICH_LR15_EL2",       0b11, 0b100, 0b1100, 0b1101, 0b111>;
 let Requires = [{ {AArch64::HasV8_0rOps} }] in {
 //Virtualization System Control Register
 //                                 Op0   Op1    CRn     CRm     Op2
-def : RWSysReg<"VSCTLR_EL2",       0b11, 0b100, 0b0010, 0b0000, 0b000> {
-  let AltName = "TTBR0_EL2";
-}
+def : RWSysReg<"VSCTLR_EL2",       0b11, 0b100, 0b0010, 0b0000, 0b000>;
 
 //MPU Type Register
 //                                 Op0   Op1    CRn     CRm     Op2
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp
index ae84bc953f359a..875b505549f0ab 100644
--- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp
+++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64InstPrinter.cpp
@@ -1874,26 +1874,25 @@ void AArch64InstPrinter::printBarriernXSOption(const MCInst *MI, unsigned OpNo,
     markup(O, Markup::Immediate) << "#" << Val;
 }
 
-static bool isValidSysReg(const AArch64SysReg::SysReg *Reg, bool Read,
+static bool isValidSysReg(const AArch64SysReg::SysReg &Reg, bool Read,
                           const MCSubtargetInfo &STI) {
-  return (Reg && (Read ? Reg->Readable : Reg->Writeable) &&
-          Reg->haveFeatures(STI.getFeatureBits()));
+  return (Read ? Reg.Readable : Reg.Writeable) &&
+         Reg.haveFeatures(STI.getFeatureBits());
 }
 
-// Looks up a system register either by encoding or by name. Some system
+// Looks up a system register either by encoding. Some system
 // registers share the same encoding between different architectures,
-// therefore a tablegen lookup by encoding will return an entry regardless
-// of the register's predication on a specific subtarget feature. To work
-// around this problem we keep an alternative name for such registers and
-// look them up by that name if the first lookup was unsuccessful.
+// to work around this tablegen will return a range of registers with the same
+// encodings. We need to check each register in the range to see if it valid.
 static const AArch64SysReg::SysReg *lookupSysReg(unsigned Val, bool Read,
                                                  const MCSubtargetInfo &STI) {
-  const AArch64SysReg::SysReg *Reg = AArch64SysReg::lookupSysRegByEncoding(Val);
-
-  if (Reg && !isValidSysReg(Reg, Read, STI))
-    Reg = AArch64SysReg::lookupSysRegByName(Reg->AltName);
+  auto Range = AArch64SysReg::lookupSysRegByEncoding(Val);
+  for (auto &Reg : Range) {
+    if (isValidSysReg(Reg, Read, STI))
+      return &Reg;
+  }
 
-  return Reg;
+  return nullptr;
 }
 
 void AArch64InstPrinter::printMRSSystemRegister(const MCInst *MI, unsigned OpNo,
@@ -1917,7 +1916,7 @@ void AArch64InstPrinter::printMRSSystemRegister(const MCInst *MI, unsigned OpNo,
 
   const AArch64SysReg::SysReg *Reg = lookupSysReg(Val, true /*Read*/, STI);
 
-  if (isValidSysReg(Reg, true /*Read*/, STI))
+  if (Reg)
     O << Reg->Name;
   else
     O << AArch64SysReg::genericRegisterString(Val);
@@ -1944,7 +1943,7 @@ void AArch64InstPrinter::printMSRSystemRegister(const MCInst *MI, unsigned OpNo,
 
   const AArch64SysReg::SysReg *Reg = lookupSysReg(Val, false /*Read*/, STI);
 
-  if (isValidSysReg(Reg, false /*Read*/, STI))
+  if (Reg)
     O << Reg->Name;
   else
     O << AArch64SysReg::genericRegisterString(Val);
diff --git a/llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h b/llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h
index 94bba4e4c35199..b3c95459c55ffa 100644
--- a/llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h
+++ b/llvm/lib/Target/AArch64/Utils/AArch64BaseInfo.h
@@ -720,7 +720,6 @@ AArch64StringToVectorLayout(StringRef LayoutStr) {
 namespace AArch64SysReg {
   struct SysReg {
     const char Name[32];
-    const char AltName[32];
     unsigned Encoding;
     bool Readable;
     bool Writeable;
@@ -736,9 +735,6 @@ namespace AArch64SysReg {
 #define GET_SysRegValues_DECL
 #include "AArch64GenSystemOperands.inc"
 
-  const SysReg *lookupSysRegByName(StringRef);
-  const SysReg *lookupSysRegByEncoding(uint16_t);
-
   uint32_t parseGenericRegister(StringRef Name);
   std::string genericRegisterString(uint32_t Bits);
 }

@topperc topperc requested a review from resistor January 7, 2025 21:55
Copy link
Contributor

@nasherm nasherm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@topperc topperc merged commit b05be2a into llvm:main Jan 8, 2025
8 of 10 checks passed
@topperc topperc deleted the pr/aarch-sysreg branch January 8, 2025 17:27
@llvm-ci
Copy link
Collaborator

llvm-ci commented Jan 8, 2025

LLVM Buildbot has detected a new failure on builder lld-x86_64-ubuntu-fast running on as-builder-4 while building llvm at step 6 "test-build-unified-tree-check-all".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/33/builds/9221

Here is the relevant piece of the build log for the reference
Step 6 (test-build-unified-tree-check-all) failure: test (failure)
******************** TEST 'LLVM :: ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test' FAILED ********************
Exit Code: 134

Command Output (stderr):
--
RUN: at line 1: /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/yaml2obj /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test -o /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp
+ /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/yaml2obj /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test -o /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp
RUN: at line 2: /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink -noexec -abs __ImageBase=0xfff00000  -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096  -check /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp
+ /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink -noexec -abs __ImageBase=0xfff00000 -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 -check /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp
llvm-jitlink error: Resource tracker 0x55ecef42dd40 became defunct
llvm-jitlink: /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/SymbolStringPool.h:285: llvm::orc::SymbolStringPool::~SymbolStringPool(): Assertion `Pool.empty() && "Dangling references at pool destruction time"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink -noexec -abs __ImageBase=0xfff00000 -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 -check /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp
 #0 0x000055ecd3f4a740 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x1169740)
 #1 0x000055ecd3f47b5f llvm::sys::RunSignalHandlers() (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x1166b5f)
 #2 0x000055ecd3f47cb5 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007f3300209520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f330025d9fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #5 0x00007f3300209476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #6 0x00007f33001ef7f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #7 0x00007f33001ef71b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #8 0x00007f3300200e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #9 0x000055ecd351052e (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x72f52e)
#10 0x000055ecd3dee92a llvm::orc::ExecutorProcessControl::~ExecutorProcessControl() (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x100d92a)
#11 0x000055ecd3deeb57 llvm::orc::SelfExecutorProcessControl::~SelfExecutorProcessControl() (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x100db57)
#12 0x000055ecd3d09586 llvm::orc::ExecutionSession::~ExecutionSession() (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0xf28586)
#13 0x000055ecd34d0c77 main (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x6efc77)
#14 0x00007f33001f0d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#15 0x00007f33001f0e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#16 0x000055ecd350ce55 _start (/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink+0x72be55)
/home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.script: line 2: 2155464 Aborted                 (core dumped) /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/bin/llvm-jitlink -noexec -abs __ImageBase=0xfff00000 -slab-allocate 100Kb -slab-address 0xfff00000 -slab-page-size 4096 -check /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/llvm-project/llvm/test/ExecutionEngine/JITLink/x86-64/COFF_addr32nb_reloc.test /home/buildbot/worker/as-builder-4/ramdisk/lld-x86_64/build/test/ExecutionEngine/JITLink/x86-64/Output/COFF_addr32nb_reloc.test.tmp

--

********************


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants