[llvm] 4e15bb3 - [AMDGPU] Fix loss of relocation types during V_MOV_B64 expansion (#217205)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 19 01:11:37 PDT 2026
Author: Carl Ritson
Date: 2026-08-19T17:11:32+09:00
New Revision: 4e15bb385af2a117df8b2ec116ff588a72af24e8
URL: https://github.com/llvm/llvm-project/commit/4e15bb385af2a117df8b2ec116ff588a72af24e8
DIFF: https://github.com/llvm/llvm-project/commit/4e15bb385af2a117df8b2ec116ff588a72af24e8.diff
LOG: [AMDGPU] Fix loss of relocation types during V_MOV_B64 expansion (#217205)
Fix loss of ABS64 and other types during relocation expansion.
Expand MIR test to provide full coverage of all expansions and expected
results.
Added:
llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr.mir
Modified:
llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
Removed:
llvm/test/CodeGen/AMDGPU/expand-mov-b64-globaladdr-rel32.mir
################################################################################
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
+...
More information about the llvm-commits
mailing list