[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