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

via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 3 23:06:28 PST 2026


Author: Phoebe Wang
Date: 2026-03-04T15:06:23+08:00
New Revision: 6fae863eba8a72cdd82f37e7111a46a70be525e0

URL: https://github.com/llvm/llvm-project/commit/6fae863eba8a72cdd82f37e7111a46a70be525e0
DIFF: https://github.com/llvm/llvm-project/commit/6fae863eba8a72cdd82f37e7111a46a70be525e0.diff

LOG: [X86][APX] Add a few pseudo opcodes support EGPR (#184550)

Found in post testing in #180242

Added: 
    

Modified: 
    llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h
    llvm/test/CodeGen/X86/reserveRreg.ll

Removed: 
    


################################################################################
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:


        


More information about the llvm-commits mailing list