[llvm] [AMDGPU] Prevent VOP3 from receiving 64b relocations as immediates (PR #221932)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 8 02:13:54 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Carl Ritson (perlfu)
<details>
<summary>Changes</summary>
SIInstrInfo::isImmOperandLegal must block 64b immediates on VOP3 instructions, specifically memory addresses (via relocations). This fixes an issues allowing SIFoldOperands to create illegal instructions.
---
Full diff: https://github.com/llvm/llvm-project/pull/221932.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIInstrInfo.cpp (+14)
- (added) llvm/test/CodeGen/AMDGPU/si-fold-operands-64b-reloc.mir (+60)
``````````diff
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
+...
``````````
</details>
https://github.com/llvm/llvm-project/pull/221932
More information about the llvm-commits
mailing list