[llvm] [AMDGPU][GlobalISel] Assign bank to vregs created by RegBankCombiner (PR #216270)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 14 01:07:58 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-globalisel

Author: Arseniy Obolenskiy (aobolensk)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/216270.diff


3 Files Affected:

- (modified) llvm/lib/Target/AMDGPU/AMDGPUCombine.td (+1) 
- (modified) llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp (+23-1) 
- (added) llvm/test/CodeGen/AMDGPU/GlobalISel/regbankcombiner-same-val-zero.mir (+71) 


``````````diff
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCombine.td b/llvm/lib/Target/AMDGPU/AMDGPUCombine.td
index 0c348bb647c0c..2737400bb6d20 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUCombine.td
+++ b/llvm/lib/Target/AMDGPU/AMDGPUCombine.td
@@ -271,4 +271,5 @@ def AMDGPURegBankCombiner : GICombiner<
    d16_load, smax_to_minmax3, smin_to_minmax3, umax_to_minmax3,
    umin_to_minmax3, fmax_to_minmax3, fmin_to_minmax3, fmaximum_to_minmax3,
    fminimum_to_minmax3, fmax_ieee_to_minmax3, fmin_ieee_to_minmax3]> {
+  let CombineAllMethodName = "tryCombineAllImpl";
 }
diff --git a/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp b/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp
index e218bdd826bab..433552bdfaff7 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURegBankCombiner.cpp
@@ -45,7 +45,7 @@ class AMDGPURegBankCombinerImpl : public Combiner {
 protected:
   const AMDGPURegBankCombinerImplRuleConfig &RuleConfig;
   const GCNSubtarget &STI;
-  const RegisterBankInfo &RBI;
+  const AMDGPURegisterBankInfo &RBI;
   const TargetRegisterInfo &TRI;
   const SIInstrInfo &TII;
   const CombinerHelper Helper;
@@ -60,6 +60,7 @@ class AMDGPURegBankCombinerImpl : public Combiner {
 
   static const char *getName() { return "AMDGPURegBankCombinerImpl"; }
 
+  bool tryCombineAllImpl(MachineInstr &I) const;
   bool tryCombineAll(MachineInstr &I) const override;
 
   bool isVgprRegBank(Register Reg) const;
@@ -139,6 +140,27 @@ AMDGPURegBankCombinerImpl::AMDGPURegBankCombinerImpl(
 {
 }
 
+bool AMDGPURegBankCombinerImpl::tryCombineAll(MachineInstr &MI) const {
+  unsigned NumRegs = MRI.getNumVirtRegs();
+  if (!tryCombineAllImpl(MI))
+    return false;
+
+  // Generated apply patterns (e.g. same_val_zero) create vregs with no bank,
+  // but every vreg needs one after RegBankSelect, which already ran.
+  for (unsigned Idx = NumRegs, End = MRI.getNumVirtRegs(); Idx != End; ++Idx) {
+    Register Reg = Register::index2VirtReg(Idx);
+    if (MRI.getRegClassOrRegBank(Reg))
+      continue;
+    MachineInstr *Def = MRI.getVRegDef(Reg);
+    if (!Def)
+      continue;
+    unsigned BankID =
+        RBI.isSALUMapping(*Def) ? AMDGPU::SGPRRegBankID : AMDGPU::VGPRRegBankID;
+    MRI.setRegBank(Reg, RBI.getRegBank(BankID));
+  }
+  return true;
+}
+
 bool AMDGPURegBankCombinerImpl::isVgprRegBank(Register Reg) const {
   return RBI.getRegBank(Reg, MRI, TRI)->getID() == AMDGPU::VGPRRegBankID;
 }
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankcombiner-same-val-zero.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankcombiner-same-val-zero.mir
new file mode 100644
index 0000000000000..617558c8f02f5
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankcombiner-same-val-zero.mir
@@ -0,0 +1,71 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=amdgcn -mcpu=gfx1030 -run-pass=amdgpu-regbank-combiner -verify-machineinstrs %s -o - | FileCheck %s
+
+# same_val_zero (xor x, x -> 0) creates a vreg with no bank after RegBankSelect.
+
+---
+name: xor_same_val_v2s16
+legalized: true
+regBankSelected: true
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $sgpr0
+
+    ; CHECK-LABEL: name: xor_same_val_v2s16
+    ; CHECK: liveins: $sgpr0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s16) = G_CONSTANT i16 0
+    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:sgpr(<2 x s16>) = G_BUILD_VECTOR [[C]](s16), [[C]](s16)
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(<2 x s16>) = COPY [[BUILD_VECTOR]](<2 x s16>)
+    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](<2 x s16>)
+    %0:sgpr(<2 x s16>) = COPY $sgpr0
+    %1:vgpr(<2 x s16>) = COPY %0(<2 x s16>)
+    %2:vgpr(<2 x s16>) = COPY %0(<2 x s16>)
+    %3:vgpr(<2 x s16>) = G_XOR %1, %2
+    $vgpr0 = COPY %3(<2 x s16>)
+...
+---
+name: xor_same_val_s32
+legalized: true
+regBankSelected: true
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $vgpr0
+
+    ; CHECK-LABEL: name: xor_same_val_s32
+    ; CHECK: liveins: $vgpr0
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s32) = G_CONSTANT i32 0
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY [[C]](s32)
+    ; CHECK-NEXT: $vgpr0 = COPY [[COPY]](s32)
+    %0:vgpr(s32) = COPY $vgpr0
+    %1:vgpr(s32) = G_XOR %0, %0
+    $vgpr0 = COPY %1(s32)
+...
+---
+name: xor_same_val_s1_vcc
+legalized: true
+regBankSelected: true
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $vgpr0, $vgpr1
+
+    ; CHECK-LABEL: name: xor_same_val_s1_vcc
+    ; CHECK: liveins: $vgpr0, $vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1
+    ; CHECK-NEXT: [[C:%[0-9]+]]:sgpr(s1) = G_CONSTANT i1 false
+    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:vcc(s1) = COPY [[C]](s1)
+    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:vgpr(s32) = G_SELECT [[COPY2]](s1), [[COPY]], [[COPY1]]
+    ; CHECK-NEXT: $vgpr0 = COPY [[SELECT]](s32)
+    %0:vgpr(s32) = COPY $vgpr0
+    %1:vgpr(s32) = COPY $vgpr1
+    %2:vcc(s1) = G_ICMP intpred(eq), %0(s32), %1(s32)
+    %3:vcc(s1) = G_XOR %2, %2
+    %4:vgpr(s32) = G_SELECT %3(s1), %0(s32), %1(s32)
+    $vgpr0 = COPY %4(s32)
+...

``````````

</details>


https://github.com/llvm/llvm-project/pull/216270


More information about the llvm-commits mailing list