[llvm] [AMDGPU] GCNRewritePartialRegUses - missing superreg (PR #208718)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 10 06:07:30 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-amdgpu

Author: David Stuttard (dstutt)

<details>
<summary>Changes</summary>

Handle missing super-reg classes gracefully (this was provoked by no
superreg class mask for SGPR_96 and subreg sub3_sub4_sub5.
The change here stops the rewrite gracefully, rather than hitting
unreachable.


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


2 Files Affected:

- (modified) llvm/lib/Target/AMDGPU/GCNRewritePartialRegUses.cpp (+1-1) 
- (added) llvm/test/CodeGen/AMDGPU/part-rewrite-no-super-mask.ll (+35) 


``````````diff
diff --git a/llvm/lib/Target/AMDGPU/GCNRewritePartialRegUses.cpp b/llvm/lib/Target/AMDGPU/GCNRewritePartialRegUses.cpp
index 94f82f2915cef..448413d4ef28d 100644
--- a/llvm/lib/Target/AMDGPU/GCNRewritePartialRegUses.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNRewritePartialRegUses.cpp
@@ -241,7 +241,7 @@ GCNRewritePartialRegUsesImpl::getRegClassWithShiftedSubregs(
     const uint32_t *Mask = NewSubReg ? getSuperRegClassMask(SubRegRC, NewSubReg)
                                      : SubRegRC->getSubClassMask();
     if (!Mask)
-      llvm_unreachable("no register class mask?");
+      return nullptr;
 
     ClassMask.clearBitsNotInMask(Mask);
     // Don't try to early exit because checking if ClassMask has set bits isn't
diff --git a/llvm/test/CodeGen/AMDGPU/part-rewrite-no-super-mask.ll b/llvm/test/CodeGen/AMDGPU/part-rewrite-no-super-mask.ll
new file mode 100644
index 0000000000000..e871c64125f94
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/part-rewrite-no-super-mask.ll
@@ -0,0 +1,35 @@
+; RUN: llc -march=amdgcn -mcpu=gfx1201 -debug-only=rewrite-partial-reg-uses -filetype=null %s 2>&1 | FileCheck %s
+
+; CHECK: Try to rewrite partial reg {{%.*}}:SGPR_1024
+; CHECK-NEXT:  Shift 32, reg align 32
+; CHECK-NEXT:  sub4_sub5_sub6:SGPR_96 -> sub3_sub4_sub5  No improvement achieved
+
+define amdgpu_cs void @_amdgpu_cs_main(i32 %LocalInvocationId) #0 {
+entry:
+  %dx.v32.x01 = alloca [24 x i32], align 4, addrspace(5)
+  %0 = call <2 x i32> @llvm.amdgcn.s.buffer.load.v2i32(<4 x i32> zeroinitializer, i32 208, i32 0)
+  %1 = extractelement <2 x i32> %0, i64 0
+  %2 = insertelement <3 x i32> zeroinitializer, i32 %1, i64 0
+  %3 = call i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32> zeroinitializer, i32 216, i32 0)
+  %4 = insertelement <3 x i32> %2, i32 %3, i64 1
+  %5 = getelementptr i8, ptr addrspace(5) %dx.v32.x01, i32 16
+  store <3 x i32> %4, ptr addrspace(5) %5, align 4
+  br label %loop0.breakc0
+
+loop0.breakc0:                                    ; preds = %loop0.breakc0, %entry
+  %dx.v32.r1.09 = phi float [ 0.000000e+00, %entry ], [ %dx.v32.r27.0, %loop0.breakc0 ]
+  store <3 x i32> zeroinitializer, ptr addrspace(5) %dx.v32.x01, align 4
+  %.idx1024 = shl i32 %LocalInvocationId, 4
+  %6 = getelementptr i8, ptr addrspace(5) %dx.v32.x01, i32 %.idx1024
+  %7 = load <3 x float>, ptr addrspace(5) %6, align 4
+  %8 = extractelement <3 x float> %7, i64 0
+  %9 = fcmp ogt float %8, 0.000000e+00
+  %10 = fadd float %dx.v32.r1.09, 0.000000e+00
+  %dx.v32.r27.0 = select i1 %9, float %10, float %dx.v32.r1.09
+  br label %loop0.breakc0
+}
+
+declare <2 x i32> @llvm.amdgcn.s.buffer.load.v2i32(<4 x i32>, i32, i32 immarg)
+declare i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32>, i32, i32 immarg)
+
+attributes #0 = { denormal_fpenv(float: preservesign) }

``````````

</details>


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


More information about the llvm-commits mailing list