[llvm] [AMDGPU] Fix loss of relocation types during V_MOV_B64 expansion (PR #217205)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 21:13:12 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: Carl Ritson (perlfu)
<details>
<summary>Changes</summary>
Fix loss of ABS64 and other types during relocation expansion.
Expand MIR test to provide full coverage of all expansions and expected results.
---
Full diff: https://github.com/llvm/llvm-project/pull/217205.diff
3 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIInstrInfo.cpp (+24-14)
- (removed) llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr-rel32.mir (-27)
- (added) llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr.mir (+159)
``````````diff
diff --git a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
index 693f557dc7beb..f79709afab3df 100644
--- a/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
@@ -132,32 +132,42 @@ static bool canRemat(const MachineInstr &MI) {
static std::tuple<unsigned, unsigned, unsigned>
splitGlobalAddressRelocFlags(const GCNSubtarget &ST,
const MachineOperand &SrcOp) {
- unsigned SrcFlags = SrcOp.getTargetFlags();
+ const unsigned BaseFlags = SrcOp.getTargetFlags() & ~SIInstrInfo::MO_MASK;
+ const unsigned Reloc = SrcOp.getTargetFlags() & SIInstrInfo::MO_MASK;
// Infer the relocation type from the existing flags on the global operand.
// The relocation type should have been determined earlier in the pipeline.
- unsigned LoReloc = SIInstrInfo::MO_ABS32_LO;
- unsigned HiReloc = SIInstrInfo::MO_ABS32_HI;
-
- if (SrcFlags & SIInstrInfo::MO_REL32) {
+ unsigned LoReloc, HiReloc;
+ switch (Reloc) {
+ case SIInstrInfo::MO_REL32_LO:
+ case SIInstrInfo::MO_REL32_HI:
+ case SIInstrInfo::MO_REL64:
LoReloc = SIInstrInfo::MO_REL32_LO;
HiReloc = SIInstrInfo::MO_REL32_HI;
- } else if (SrcFlags & SIInstrInfo::MO_GOTPCREL32_LO) {
+ break;
+ case SIInstrInfo::MO_GOTPCREL32_LO:
+ case SIInstrInfo::MO_GOTPCREL32_HI:
LoReloc = SIInstrInfo::MO_GOTPCREL32_LO;
HiReloc = SIInstrInfo::MO_GOTPCREL32_HI;
- } else if (SrcFlags & SIInstrInfo::MO_GOTPCREL64) {
+ break;
+ case SIInstrInfo::MO_GOTPCREL:
+ case SIInstrInfo::MO_GOTPCREL64:
// For 64-bit GOT-relative, use the 64-bit relocation.
LoReloc = SIInstrInfo::MO_GOTPCREL64;
HiReloc = SIInstrInfo::MO_GOTPCREL64;
+ break;
+ case SIInstrInfo::MO_ABS32_LO:
+ case SIInstrInfo::MO_ABS32_HI:
+ case SIInstrInfo::MO_ABS64:
+ LoReloc = SIInstrInfo::MO_ABS32_LO;
+ HiReloc = SIInstrInfo::MO_ABS32_HI;
+ break;
+ default:
+ llvm_unreachable("unknown relocation type for global address");
+ break;
}
- unsigned BaseFlags =
- SrcFlags & ~(SIInstrInfo::MO_ABS32_LO | SIInstrInfo::MO_ABS32_HI |
- SIInstrInfo::MO_REL32_LO | SIInstrInfo::MO_REL32_HI |
- SIInstrInfo::MO_GOTPCREL32_LO |
- SIInstrInfo::MO_GOTPCREL32_HI | SIInstrInfo::MO_GOTPCREL64);
-
- return std::make_tuple(BaseFlags, LoReloc, HiReloc);
+ return {BaseFlags, LoReloc, HiReloc};
}
bool SIInstrInfo::isReMaterializableImpl(
diff --git a/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr-rel32.mir b/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr-rel32.mir
deleted file mode 100644
index d1f4b994c6224..0000000000000
--- a/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr-rel32.mir
+++ /dev/null
@@ -1,27 +0,0 @@
-# RUN: llc -mtriple=amdgpu11.00-amd-amdhsa -verify-machineinstrs -run-pass=postrapseudos -o - %s | FileCheck %s
-
-# This test verifies that rel32 target flags on 64-bit global-address pseudos
-# are split into rel32 lo/hi flags when post-RA pseudos are expanded.
-
---- |
- define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_rel32() {
- ret void
- }
-
- @gv = external addrspace(1) global i32
-...
-
----
-name: v_mov_b64_pseudo_globaladdr_rel32
-tracksRegLiveness: true
-body: |
- bb.0:
- liveins: $exec
-
- ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_rel32
- ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-rel32-lo) @gv, implicit $exec
- ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-rel32-hi) @gv, implicit $exec
-
- $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel32-lo) @gv, implicit $exec
-...
-
diff --git a/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr.mir b/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr.mir
new file mode 100644
index 0000000000000..12dee1588d41d
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr.mir
@@ -0,0 +1,159 @@
+# RUN: llc -mtriple=amdgpu11.00-amd-amdhsa -verify-machineinstrs -run-pass=postrapseudos -o - %s | FileCheck %s
+
+# This test verifies that target flags on 64-bit global-address pseudos
+# are split into correct lo/hi flags when post-RA pseudos are expanded.
+
+--- |
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_rel32() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_rel32-hi() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_rel64() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_abs32() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_abs32-hi() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_abs64() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_gotprel() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_gotprel32() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_gotprel32-hi() {
+ ret void
+ }
+ define amdgpu_kernel void @v_mov_b64_pseudo_globaladdr_gotprel64() {
+ ret void
+ }
+
+ @gv = external addrspace(1) global i32
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_rel32
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_rel32
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-rel32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-rel32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel32-lo) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_rel32-hi
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_rel32-hi
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-rel32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-rel32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel32-hi) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_rel64
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_rel64
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-rel32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-rel32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-rel64) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_abs32
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_abs32
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-abs32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-abs32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-abs32-lo) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_abs32-hi
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_abs32-hi
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-abs32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-abs32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-abs32-hi) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_abs64
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_abs64
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-abs32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-abs32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-abs64) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_gotprel
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_gotprel
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-gotprel64) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-gotprel64) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-gotprel) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_gotprel32
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_gotprel32
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-gotprel32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-gotprel32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-gotprel32-lo) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_gotprel32-hi
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_gotprel32-hi
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-gotprel32-lo) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-gotprel32-hi) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-gotprel32-hi) @gv, implicit $exec
+...
+
+---
+name: v_mov_b64_pseudo_globaladdr_gotprel64
+tracksRegLiveness: true
+body: |
+ bb.0:
+ ; CHECK-LABEL: name: v_mov_b64_pseudo_globaladdr_gotprel64
+ ; CHECK: $vgpr0 = V_MOV_B32_e32 target-flags(amdgpu-gotprel64) @gv, implicit $exec
+ ; CHECK-NEXT: $vgpr1 = V_MOV_B32_e32 target-flags(amdgpu-gotprel64) @gv, implicit $exec
+
+ $vgpr0_vgpr1 = V_MOV_B64_PSEUDO target-flags(amdgpu-gotprel64) @gv, implicit $exec
+...
``````````
</details>
https://github.com/llvm/llvm-project/pull/217205
More information about the llvm-commits
mailing list