[llvm] [X86][APX] Add a few pseudo opcodes support EGPR (PR #184550)

via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 22:05:16 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Phoebe Wang (phoebewang)

<details>
<summary>Changes</summary>

Found in post testing in #<!-- -->180242

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


2 Files Affected:

- (modified) llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h (+29-8) 
- (modified) llvm/test/CodeGen/X86/reserveRreg.ll (+1-1) 


``````````diff
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
index 569484704a249..06b13c0982d21 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
@@ -1265,14 +1265,35 @@ inline bool canUseApxExtendedReg(const MCInstrDesc &Desc) {
     return true;
 
   unsigned Opcode = Desc.Opcode;
-  // MOV32r0 is always expanded to XOR32rr
-  if (Opcode == X86::MOV32r0)
-    return true;
-  // To be conservative, egpr is not used for all pseudo instructions
-  // because we are not sure what instruction it will become.
-  // FIXME: Could we improve it in X86ExpandPseudo?
-  if (isPseudo(TSFlags))
-    return false;
+  if (isPseudo(TSFlags)) {
+    switch (Opcode) {
+    default:
+      // To be conservative, egpr is not used for all pseudo instructions
+      // because we are not sure what instruction it will become.
+      // FIXME: Could we improve it in X86ExpandPseudo?
+      return false;
+    case X86::MOV32r0:
+    case X86::MOV32r1:
+    case X86::MOV32r_1:
+      // They are always expanded to XOR32rr.
+      return true;
+    case X86::MOV32ri64:
+      // MOV32ri64 is always expanded to MOV32ri.
+      return true;
+    case X86::ADD8rr_DB:
+    case X86::ADD16rr_DB:
+    case X86::ADD32rr_DB:
+    case X86::ADD64rr_DB:
+      // They are always expanded to ORNrr.
+      return true;
+    case X86::ADD8ri_DB:
+    case X86::ADD16ri_DB:
+    case X86::ADD32ri_DB:
+    case X86::ADD64ri32_DB:
+      // They are always expanded to ORNri.
+      return true;
+    }
+  }
 
   // MAP OB/TB in legacy encoding space can always use egpr except
   // XSAVE*/XRSTOR*.
diff --git a/llvm/test/CodeGen/X86/reserveRreg.ll b/llvm/test/CodeGen/X86/reserveRreg.ll
index b6b10ad5169a4..1a28f10b05681 100644
--- a/llvm/test/CodeGen/X86/reserveRreg.ll
+++ b/llvm/test/CodeGen/X86/reserveRreg.ll
@@ -1,7 +1,7 @@
 ;; Check if manually reserved registers are always excluded from being saved by
 ;; the function prolog/epilog, even for callee-saved ones, as per GCC behavior.
 
-; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs | FileCheck %s
 
 define preserve_mostcc void @t8() "target-features"="+reserve-r8" {
 ; CHECK-LABEL: t8:

``````````

</details>


https://github.com/llvm/llvm-project/pull/184550


More information about the llvm-commits mailing list