[llvm] AMDGPU/GlobalISel: Fix assert in selectSMRDBufferSgprImm (PR #213967)

Petar Avramovic via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 5 03:00:18 PDT 2026


================
@@ -1790,10 +2126,132 @@ define amdgpu_ps i32 @s_buffer_load_imm_1028(<4 x i32> inreg %desc) {
 ; GFX1250-NEXT:    s_buffer_load_b32 s0, s[0:3], 0x400 nv
 ; GFX1250-NEXT:    s_wait_kmcnt 0x0
 ; GFX1250-NEXT:    ; return to shader part epilog
+;
+; GFX1250-GISEL-LABEL: s_buffer_load_imm_1028:
+; GFX1250-GISEL:       ; %bb.0:
+; GFX1250-GISEL-NEXT:    global_prefetch_b8 v0, s[0:1] scope:SCOPE_SE
+; GFX1250-GISEL-NEXT:    v_nop
+; GFX1250-GISEL-NEXT:    s_buffer_load_b32 s0, s[0:3], 0x400 nv
+; GFX1250-GISEL-NEXT:    s_wait_kmcnt 0x0
+; GFX1250-GISEL-NEXT:    ; return to shader part epilog
   %load = call i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32> %desc, i32 1024, i32 0)
   ret i32 %load
 }
 
+define amdgpu_ps i32 @s_buffer_load_ptr_soffset(<4 x i32> inreg %desc, ptr addrspace(6) inreg %p) {
+; GFX6-LABEL: s_buffer_load_ptr_soffset:
+; GFX6:       ; %bb.0:
+; GFX6-NEXT:    s_add_i32 s4, s4, 52
+; GFX6-NEXT:    s_nop 3
+; GFX6-NEXT:    s_buffer_load_dword s0, s[0:3], s4
+; GFX6-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX6-NEXT:    ; return to shader part epilog
+;
+; GFX78-LABEL: s_buffer_load_ptr_soffset:
+; GFX78:       ; %bb.0:
+; GFX78-NEXT:    s_add_i32 s4, s4, 52
+; GFX78-NEXT:    s_buffer_load_dword s0, s[0:3], s4
+; GFX78-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX78-NEXT:    ; return to shader part epilog
+;
+; GFX910-LABEL: s_buffer_load_ptr_soffset:
+; GFX910:       ; %bb.0:
+; GFX910-NEXT:    s_add_i32 s4, s4, 52
+; GFX910-NEXT:    s_buffer_load_dword s0, s[0:3], s4 offset:0x0
+; GFX910-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX910-NEXT:    ; return to shader part epilog
+;
+; GFX11-LABEL: s_buffer_load_ptr_soffset:
+; GFX11:       ; %bb.0:
+; GFX11-NEXT:    s_add_i32 s4, s4, 52
+; GFX11-NEXT:    s_buffer_load_b32 s0, s[0:3], s4 offset:0x0
+; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
+; GFX11-NEXT:    ; return to shader part epilog
+;
+; GFX1200-LABEL: s_buffer_load_ptr_soffset:
+; GFX1200:       ; %bb.0:
+; GFX1200-NEXT:    s_add_co_i32 s4, s4, 52
+; GFX1200-NEXT:    s_buffer_load_b32 s0, s[0:3], s4 offset:0x0
+; GFX1200-NEXT:    s_wait_kmcnt 0x0
+; GFX1200-NEXT:    ; return to shader part epilog
+;
+; GFX1250-LABEL: s_buffer_load_ptr_soffset:
+; GFX1250:       ; %bb.0:
+; GFX1250-NEXT:    global_prefetch_b8 v0, s[0:1] scope:SCOPE_SE
+; GFX1250-NEXT:    v_nop
+; GFX1250-NEXT:    s_add_co_i32 s4, s4, 52
+; GFX1250-NEXT:    s_buffer_load_b32 s0, s[0:3], s4 offset:0x0 nv
+; GFX1250-NEXT:    s_wait_kmcnt 0x0
+; GFX1250-NEXT:    ; return to shader part epilog
+;
+; GFX1250-GISEL-LABEL: s_buffer_load_ptr_soffset:
+; GFX1250-GISEL:       ; %bb.0:
+; GFX1250-GISEL-NEXT:    global_prefetch_b8 v0, s[0:1] scope:SCOPE_SE
+; GFX1250-GISEL-NEXT:    v_nop
+; GFX1250-GISEL-NEXT:    s_buffer_load_b32 s0, s[0:3], s4 offset:0x34 nv
+; GFX1250-GISEL-NEXT:    s_wait_kmcnt 0x0
+; GFX1250-GISEL-NEXT:    ; return to shader part epilog
+  %gep = getelementptr i8, ptr addrspace(6) %p, i32 52
+  %soffset = ptrtoint ptr addrspace(6) %gep to i32
+  %load = call i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32> %desc, i32 %soffset, i32 0)
+  ret i32 %load
+}
----------------
petar-avramovic wrote:

the idea was to see effect of fix in the diff, here https://github.com/llvm/llvm-project/pull/213968/changes#diff-10ef63ce93d7a7cbde5eb3904d39c8421eb1996bffdeb65645da15c99352606bR2191
instead of having new test added and having to wonder how it looked before the fix.

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


More information about the llvm-commits mailing list