[llvm] [AMDGPU] Prevent VOP3 from receiving 64b relocations as immediates (PR #221932)

Carl Ritson via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 8 02:13:15 PDT 2026


https://github.com/perlfu created https://github.com/llvm/llvm-project/pull/221932

SIInstrInfo::isImmOperandLegal must block 64b immediates on VOP3 instructions, specifically memory addresses (via relocations). This fixes an issues allowing SIFoldOperands to create illegal instructions.

>From 1a45bd81507e6c4936afda06c07ce6dfb7b8739d Mon Sep 17 00:00:00 2001
From: Carl Ritson <carl.ritson at amd.com>
Date: Tue, 8 Sep 2026 18:04:31 +0900
Subject: [PATCH] [AMDGPU] Prevent VOP3 from receiving 64b relocations as
 immediates

SIInstrInfo::isImmOperandLegal must block 64b immediates on VOP3
instructions, specifically memory addresses (via relocations).
This fixes an issues allowing SIFoldOperands to create illegal
instructions.
---
 llvm/lib/Target/AMDGPU/SIInstrInfo.cpp        | 14 +++++
 .../AMDGPU/si-fold-operands-64b-reloc.mir     | 60 +++++++++++++++++++
 2 files changed, 74 insertions(+)
 create mode 100644 llvm/test/CodeGen/AMDGPU/si-fold-operands-64b-reloc.mir

diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index 173c88f6c17fd..9b1fbbdbfbede 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -5032,6 +5032,20 @@ bool SIInstrInfo::isImmOperandLegal(const MCInstrDesc &InstDesc, unsigned OpNo,
 
   assert((MO.isTargetIndex() || MO.isFI() || MO.isGlobal()) &&
          "unexpected imm-like operand kind");
+
+  // VOP3 instructions do not support 64b literals so cannot support 64b relocs
+  if (MO.isGlobal() && SIInstrFlags::isVOP3Like(InstDesc)) {
+    switch (MO.getTargetFlags() & SIInstrInfo::MO_MASK) {
+    case SIInstrInfo::MO_ABS64:
+    case SIInstrInfo::MO_GOTPCREL:
+    case SIInstrInfo::MO_GOTPCREL64:
+    case SIInstrInfo::MO_REL64:
+      return false;
+    default:
+      break;
+    }
+  }
+
   const MCOperandInfo &OpInfo = InstDesc.operands()[OpNo];
   return isLiteralOperandLegal(InstDesc, OpInfo);
 }
diff --git a/llvm/test/CodeGen/AMDGPU/si-fold-operands-64b-reloc.mir b/llvm/test/CodeGen/AMDGPU/si-fold-operands-64b-reloc.mir
new file mode 100644
index 0000000000000..68a9dba012370
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/si-fold-operands-64b-reloc.mir
@@ -0,0 +1,60 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=amdgpu13.10 -run-pass=si-fold-operands -o - %s | FileCheck -check-prefixes=GFX1310
+
+--- |
+  @mem = internal unnamed_addr addrspace(4) constant [4 x <4 x i32>] [<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>]
+
+  define amdgpu_cs void @fold_vop3_abs64_sgpr() { ret void }
+  define amdgpu_cs void @fold_vop3_abs64_vgpr() { ret void }
+  define amdgpu_cs void @fold_vop3_rel64_sgpr() { ret void }
+  define amdgpu_cs void @fold_vop3_rel64_vgpr() { ret void }
+---
+
+# Cannot fold 64b immediates into VOP3 instructions
+---
+name: fold_vop3_abs64_sgpr
+tracksRegLiveness: true
+body: |
+  bb.0:
+    ; GFX1310-LABEL: name: fold_vop3_abs64_sgpr
+    ; GFX1310: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 target-flags(amdgpu-abs64) @mem
+    ; GFX1310-NEXT: %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, [[S_MOV_B64_]], 0, implicit $exec
+    %0:sreg_64 = S_MOV_B64 target-flags(amdgpu-abs64) @mem
+    %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, %0:sreg_64, 0, implicit $exec
+...
+
+---
+name: fold_vop3_abs64_vgpr
+tracksRegLiveness: true
+body: |
+  bb.0:
+    ; GFX1310-LABEL: name: fold_vop3_abs64_vgpr
+    ; GFX1310: [[V_MOV_B:%[0-9]+]]:vreg_64 = V_MOV_B64_PSEUDO target-flags(amdgpu-abs64) @mem, implicit $exec
+    ; GFX1310-NEXT: %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, [[V_MOV_B]], 0, implicit $exec
+    %0:vreg_64 = V_MOV_B64_PSEUDO target-flags(amdgpu-abs64) @mem, implicit $exec
+    %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, %0:vreg_64, 0, implicit $exec
+...
+
+---
+name: fold_vop3_rel64_sgpr
+tracksRegLiveness: true
+body: |
+  bb.0:
+    ; GFX1310-LABEL: name: fold_vop3_rel64_sgpr
+    ; GFX1310: [[S_MOV_B64_:%[0-9]+]]:sreg_64 = S_MOV_B64 target-flags(amdgpu-rel64) @mem
+    ; GFX1310-NEXT: %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, [[S_MOV_B64_]], 0, implicit $exec
+    %0:sreg_64 = S_MOV_B64 target-flags(amdgpu-rel64) @mem
+    %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, %0:sreg_64, 0, implicit $exec
+...
+
+---
+name: fold_vop3_rel64_vgpr
+tracksRegLiveness: true
+body: |
+  bb.0:
+    ; GFX1310-LABEL: name: fold_vop3_rel64_vgpr
+    ; GFX1310: [[V_MOV_B:%[0-9]+]]:vreg_64 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel64) @mem, implicit $exec
+    ; GFX1310-NEXT: %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, [[V_MOV_B]], 0, implicit $exec
+    %0:vreg_64 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel64) @mem, implicit $exec
+    %1:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 0, 0, %0:vreg_64, 0, implicit $exec
+...



More information about the llvm-commits mailing list