[llvm] [llvm-exegesis][AArch64] Disable pauth and ldgm as unsupported instructions (PR #132346)

via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 26 07:08:33 PDT 2025


https://github.com/lakshayk-nv updated https://github.com/llvm/llvm-project/pull/132346

>From f1e1d7ace8910afe37cad2a4834800991ef42b5c Mon Sep 17 00:00:00 2001
From: lakshayk-nv <lakshayk at nvidia.com>
Date: Thu, 20 Mar 2025 23:32:23 -0700
Subject: [PATCH 1/3] [llvm-exegesis] [AArch64] Resolving Illegal Instruction
 Error 1) Checking opcodes specifically for LDGM and AUT opcode instruction
 variants. 2) Gracefully exiting with "<opcode-name> : Unsupported opcode:
 isPointerAuth/isUncheckedAccess" 3) Added corresponding test cases to check
 exit message.

---
 .../AArch64/err_skip_illegal_Instruction.s             |  8 ++++++++
 llvm/tools/llvm-exegesis/lib/Target.cpp                | 10 ++++++++++
 2 files changed, 18 insertions(+)
 create mode 100644 llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s

diff --git a/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s b/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
new file mode 100644
index 0000000000000..74fe5a7c3a60a
--- /dev/null
+++ b/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
@@ -0,0 +1,8 @@
+REQUIRES: aarch64-registered-target
+
+## Check for skipping of illegal instruction errors (AUT and LDGM)
+RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --min-instructions=1 --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1
+CHECK: AUTIA: Unsupported opcode: isPointerAuth/isUncheckedAccess
+
+RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --min-instructions=1 --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1
+CHECK: LDGM: Unsupported opcode: isPointerAuth/isUncheckedAccess
\ No newline at end of file
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index 68d19514bedb2..245d1db5d21e8 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -35,6 +35,14 @@ const ExegesisTarget *ExegesisTarget::lookup(Triple TT) {
   return nullptr;
 }
 
+static bool isPointerAuthOpcode(unsigned Opcode) {
+  return (Opcode >= 1648 && Opcode <= 1667); // AUT instruction class range
+}
+
+static bool isUncheckedAccessOpcode(unsigned Opcode) {
+  return Opcode == 4694; // LDGM instruction
+}
+
 const char *
 ExegesisTarget::getIgnoredOpcodeReasonOrNull(const LLVMState &State,
                                              unsigned Opcode) const {
@@ -45,6 +53,8 @@ ExegesisTarget::getIgnoredOpcodeReasonOrNull(const LLVMState &State,
     return "Unsupported opcode: isBranch/isIndirectBranch";
   if (InstrDesc.isCall() || InstrDesc.isReturn())
     return "Unsupported opcode: isCall/isReturn";
+  if (isPointerAuthOpcode(Opcode) || isUncheckedAccessOpcode(Opcode))
+    return "Unsupported opcode: isPointerAuth/isUncheckedAccess";
   return nullptr;
 }
 

>From 5039c2b1e1c63c4900b113bf6db662303faf7f53 Mon Sep 17 00:00:00 2001
From: lakshayk-nv <lakshayk at nvidia.com>
Date: Mon, 24 Mar 2025 02:29:41 -0700
Subject: [PATCH 2/3] [llvm-exegesis] [AArch64] Use enum values for opcode
 validation

- Replace hardcoded opcode ranges with AArch64::* enum values for pointer auth and
unchecked access instructions.
- Add required AArch64 headers and update tests.
- Style changes for corresponding testcases.
---
 .../AArch64/err_skip_illegal_Instruction.s    | 12 +++----
 llvm/tools/llvm-exegesis/lib/CMakeLists.txt   |  4 +++
 llvm/tools/llvm-exegesis/lib/Target.cpp       | 31 +++++++++++++++++--
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s b/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
index 74fe5a7c3a60a..3e95bf9a376c7 100644
--- a/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
+++ b/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
@@ -1,8 +1,8 @@
-REQUIRES: aarch64-registered-target
+# REQUIRES: aarch64-registered-target
 
-## Check for skipping of illegal instruction errors (AUT and LDGM)
-RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --min-instructions=1 --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1
-CHECK: AUTIA: Unsupported opcode: isPointerAuth/isUncheckedAccess
+# Check for skipping of illegal instruction errors (AUT and LDGM)
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1
+# CHECK: AUTIA: Unsupported opcode: isPointerAuth/isUncheckedAccess
 
-RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --min-instructions=1 --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1
-CHECK: LDGM: Unsupported opcode: isPointerAuth/isUncheckedAccess
\ No newline at end of file
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1
+# CHECK: LDGM: Unsupported opcode: isPointerAuth/isUncheckedAccess
diff --git a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
index d95c37ff5426b..2de073eda3810 100644
--- a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
+++ b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
@@ -1,3 +1,7 @@
+include_directories(
+  ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64
+  ${LLVM_BINARY_DIR}/lib/Target/AArch64
+  )
 
 set(LLVM_EXEGESIS_TARGETS)
 if (LLVM_TARGETS_TO_BUILD MATCHES "X86")
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index 245d1db5d21e8..b6a98ec5aa31f 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -15,6 +15,8 @@
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/Error.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
+#include "AArch64.h"
+#include "AArch64RegisterInfo.h"
 
 namespace llvm {
 namespace exegesis {
@@ -36,12 +38,35 @@ const ExegesisTarget *ExegesisTarget::lookup(Triple TT) {
 }
 
 static bool isPointerAuthOpcode(unsigned Opcode) {
-  return (Opcode >= 1648 && Opcode <= 1667); // AUT instruction class range
+  switch (Opcode) {
+    case AArch64::AUTDA:
+    case AArch64::AUTDB:
+    case AArch64::AUTDZA:
+    case AArch64::AUTDZB:
+    case AArch64::AUTIA:
+    case AArch64::AUTIA1716:
+    case AArch64::AUTIASP:
+    case AArch64::AUTIAZ:
+    case AArch64::AUTIB:
+    case AArch64::AUTIB1716:
+    case AArch64::AUTIBSP:
+    case AArch64::AUTIBZ:
+    case AArch64::AUTIZA:
+    case AArch64::AUTIZB:
+      return true;
+    default:
+      return false;
+  }
 }
 
 static bool isUncheckedAccessOpcode(unsigned Opcode) {
-  return Opcode == 4694; // LDGM instruction
-}
+  switch (Opcode) {
+    case AArch64::LDGM:
+      return true;
+    default:
+      return false;
+  }
+  }
 
 const char *
 ExegesisTarget::getIgnoredOpcodeReasonOrNull(const LLVMState &State,

>From 6b81e65c64a3946274c642a46906b6cad54e2d8a Mon Sep 17 00:00:00 2001
From: lakshayk-nv <lakshayk at nvidia.com>
Date: Wed, 26 Mar 2025 07:03:08 -0700
Subject: [PATCH 3/3] [llvm-exegesis][AArch64] Disable pauth and ldgm as
 unsupported instructions. 1) Change location of isPointerAuth and
 isLoadTagMultiple function across file for correct implementation 2) Style
 nits changes in test cases.

---
 .../AArch64/err_skip_illegal_Instruction.s    |  8 ---
 .../AArch64/skip_unsupported_instructions.s   |  8 +++
 .../llvm-exegesis/lib/AArch64/Target.cpp      | 38 +++++++++++++
 llvm/tools/llvm-exegesis/lib/CMakeLists.txt   |  4 --
 llvm/tools/llvm-exegesis/lib/Target.cpp       | 57 ++++++-------------
 llvm/tools/llvm-exegesis/lib/Target.h         |  3 +
 6 files changed, 65 insertions(+), 53 deletions(-)
 delete mode 100644 llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
 create mode 100644 llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s

diff --git a/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s b/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
deleted file mode 100644
index 3e95bf9a376c7..0000000000000
--- a/llvm/test/tools/llvm-exegesis/AArch64/err_skip_illegal_Instruction.s
+++ /dev/null
@@ -1,8 +0,0 @@
-# REQUIRES: aarch64-registered-target
-
-# Check for skipping of illegal instruction errors (AUT and LDGM)
-# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1
-# CHECK: AUTIA: Unsupported opcode: isPointerAuth/isUncheckedAccess
-
-# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1
-# CHECK: LDGM: Unsupported opcode: isPointerAuth/isUncheckedAccess
diff --git a/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s b/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s
new file mode 100644
index 0000000000000..df92cb7430980
--- /dev/null
+++ b/llvm/test/tools/llvm-exegesis/AArch64/skip_unsupported_instructions.s
@@ -0,0 +1,8 @@
+# REQUIRES: aarch64-registered-target
+
+# Check for skipping of illegal instruction errors (AUT and LDGM)
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=AUTIA --benchmark-phase=assemble-measured-code 2>&1 | FileCheck %s --check-prefix=CHECK-AUTIA
+# CHECK-AUTIA: AUTIA: Unsupported opcode: isPointerAuth
+
+# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --opcode-name=LDGM --benchmark-phase=assemble-measured-code 2>&1 | FileCheck %s --check-prefix=CHECK-LDGM
+# CHECK-LDGM: LDGM: Unsupported opcode: load tag multiple 
diff --git a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
index bf2b053003ce3..f491f3652c12d 100644
--- a/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
@@ -147,5 +147,43 @@ void InitializeAArch64ExegesisTarget() {
   ExegesisTarget::registerTarget(getTheExegesisAArch64Target());
 }
 
+bool isPointerAuth(unsigned Opcode) {
+  switch (Opcode) {
+  default:
+    return false;
+
+  // FIXME: Pointer Authentication instructions.
+  // We would like to measure these instructions, but they can behave differently on
+  // different platforms, and maybe the snippets need to look different for these instructions,
+  // so let's disable this for now. 
+  case AArch64::AUTDA:
+  case AArch64::AUTDB:
+  case AArch64::AUTDZA:
+  case AArch64::AUTDZB:
+  case AArch64::AUTIA:
+  case AArch64::AUTIA1716:
+  case AArch64::AUTIASP:
+  case AArch64::AUTIAZ:
+  case AArch64::AUTIB:
+  case AArch64::AUTIB1716:
+  case AArch64::AUTIBSP:
+  case AArch64::AUTIBZ:
+  case AArch64::AUTIZA:
+  case AArch64::AUTIZB:
+    return true;
+  }
+}
+
+bool isLoadTagMultiple(unsigned Opcode) {
+  switch (Opcode) {
+  default:
+    return false;
+
+  // Load tag multiple instruction
+  case AArch64::LDGM:
+    return true;
+  }
+}
+
 } // namespace exegesis
 } // namespace llvm
diff --git a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
index 2de073eda3810..d95c37ff5426b 100644
--- a/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
+++ b/llvm/tools/llvm-exegesis/lib/CMakeLists.txt
@@ -1,7 +1,3 @@
-include_directories(
-  ${LLVM_MAIN_SRC_DIR}/lib/Target/AArch64
-  ${LLVM_BINARY_DIR}/lib/Target/AArch64
-  )
 
 set(LLVM_EXEGESIS_TARGETS)
 if (LLVM_TARGETS_TO_BUILD MATCHES "X86")
diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp
index b6a98ec5aa31f..01899a1a67dfe 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.cpp
+++ b/llvm/tools/llvm-exegesis/lib/Target.cpp
@@ -15,8 +15,6 @@
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/Error.h"
 #include "llvm/TargetParser/SubtargetFeature.h"
-#include "AArch64.h"
-#include "AArch64RegisterInfo.h"
 
 namespace llvm {
 namespace exegesis {
@@ -37,49 +35,26 @@ const ExegesisTarget *ExegesisTarget::lookup(Triple TT) {
   return nullptr;
 }
 
-static bool isPointerAuthOpcode(unsigned Opcode) {
-  switch (Opcode) {
-    case AArch64::AUTDA:
-    case AArch64::AUTDB:
-    case AArch64::AUTDZA:
-    case AArch64::AUTDZB:
-    case AArch64::AUTIA:
-    case AArch64::AUTIA1716:
-    case AArch64::AUTIASP:
-    case AArch64::AUTIAZ:
-    case AArch64::AUTIB:
-    case AArch64::AUTIB1716:
-    case AArch64::AUTIBSP:
-    case AArch64::AUTIBZ:
-    case AArch64::AUTIZA:
-    case AArch64::AUTIZB:
-      return true;
-    default:
-      return false;
-  }
-}
-
-static bool isUncheckedAccessOpcode(unsigned Opcode) {
-  switch (Opcode) {
-    case AArch64::LDGM:
-      return true;
-    default:
-      return false;
-  }
-  }
-
 const char *
 ExegesisTarget::getIgnoredOpcodeReasonOrNull(const LLVMState &State,
                                              unsigned Opcode) const {
   const MCInstrDesc &InstrDesc = State.getIC().getInstr(Opcode).Description;
-  if (InstrDesc.isPseudo() || InstrDesc.usesCustomInsertionHook())
-    return "Unsupported opcode: isPseudo/usesCustomInserter";
-  if (InstrDesc.isBranch() || InstrDesc.isIndirectBranch())
-    return "Unsupported opcode: isBranch/isIndirectBranch";
-  if (InstrDesc.isCall() || InstrDesc.isReturn())
-    return "Unsupported opcode: isCall/isReturn";
-  if (isPointerAuthOpcode(Opcode) || isUncheckedAccessOpcode(Opcode))
-    return "Unsupported opcode: isPointerAuth/isUncheckedAccess";
+  if (InstrDesc.isPseudo())
+    return "Unsupported opcode: isPseudo";
+  if ( InstrDesc.usesCustomInsertionHook())
+    return "Unsupported opcode: usesCustomInserter";
+  if (InstrDesc.isBranch())
+    return "Unsupported opcode: isBranch";
+  if (InstrDesc.isIndirectBranch())
+    return "Unsupported opcode: isIndirectBranch";
+  if (InstrDesc.isCall())
+    return "Unsupported opcode: isCall";
+  if (InstrDesc.isReturn())
+    return "Unsupported opcode: isReturn";
+  if (isPointerAuth(Opcode))
+    return "Unsupported opcode: isPointerAuth";
+  if (isLoadTagMultiple(Opcode))
+    return "Unsupported opcode: load tag multiple";
   return nullptr;
 }
 
diff --git a/llvm/tools/llvm-exegesis/lib/Target.h b/llvm/tools/llvm-exegesis/lib/Target.h
index 77fbaa6e95412..08f4d74a9c77e 100644
--- a/llvm/tools/llvm-exegesis/lib/Target.h
+++ b/llvm/tools/llvm-exegesis/lib/Target.h
@@ -335,6 +335,9 @@ class ExegesisTarget {
   const OpcodeAvailabilityChecker IsOpcodeAvailable;
 };
 
+bool isPointerAuth(unsigned Opcode);
+bool isLoadTagMultiple(unsigned Opcode);
+
 } // namespace exegesis
 } // namespace llvm
 



More information about the llvm-commits mailing list