This patch is a NFC that removes debug flag from the test llvm.amdgcn.raw.buffer.atomic.integer-minmax.ll
283 lines
12 KiB
LLVM
283 lines
12 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 -new-reg-bank-select < %s | FileCheck %s
|
|
|
|
define amdgpu_ps float @test1(i32 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_smin v0, v1, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.smin.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps float @test2(i32 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_smax v0, v1, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.smax.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps float @test3(i32 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test3:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_umin v0, v1, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.umin.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps float @test4(i32 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test4:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_umax v0, v1, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.umax.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
|
|
define amdgpu_ps <2 x float> @test5(i64 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test5:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_smin_x2 v[0:1], v2, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.smin.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @test6(i64 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test6:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_smax_x2 v[0:1], v2, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.smax.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @test7(i64 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test7:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_umin_x2 v[0:1], v2, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.umin.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @test8(i64 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: test8:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: buffer_atomic_umax_x2 v[0:1], v2, s[0:3], s4 offen glc
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.umax.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
define amdgpu_ps float @wf_test1(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: wf_test1:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s2, exec_lo
|
|
; CHECK-NEXT: .LBB8_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s4, v1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s5, v2
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v3
|
|
; CHECK-NEXT: v_readfirstlane_b32 s7, v4
|
|
; CHECK-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[1:2]
|
|
; CHECK-NEXT: v_cmp_eq_u64_e64 s1, s[6:7], v[3:4]
|
|
; CHECK-NEXT: s_and_b32 s1, vcc_lo, s1
|
|
; CHECK-NEXT: s_and_saveexec_b32 s1, s1
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_smin v0, v5, s[4:7], s0 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr1
|
|
; CHECK-NEXT: ; implicit-def: $vgpr5
|
|
; CHECK-NEXT: ; implicit-def: $vgpr3_vgpr4
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s1
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB8_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s2
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.smin.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @wf_test2(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 inreg %soffset) {
|
|
; CHECK-LABEL: wf_test2:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s2, exec_lo
|
|
; CHECK-NEXT: .LBB9_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s4, v2
|
|
; CHECK-NEXT: v_readfirstlane_b32 s5, v3
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v4
|
|
; CHECK-NEXT: v_readfirstlane_b32 s7, v5
|
|
; CHECK-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[2:3]
|
|
; CHECK-NEXT: v_cmp_eq_u64_e64 s1, s[6:7], v[4:5]
|
|
; CHECK-NEXT: s_and_b32 s1, vcc_lo, s1
|
|
; CHECK-NEXT: s_and_saveexec_b32 s1, s1
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_smax_x2 v[0:1], v6, s[4:7], s0 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr2
|
|
; CHECK-NEXT: ; implicit-def: $vgpr6
|
|
; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s1
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB9_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s2
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.smax.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
; Waterfall tests - divergent soffset (VGPR soffset)
|
|
define amdgpu_ps float @wf_test3(i32 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 %soffset) {
|
|
; CHECK-LABEL: wf_test3:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s4, exec_lo
|
|
; CHECK-NEXT: .LBB10_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v2
|
|
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc_lo, s6, v2
|
|
; CHECK-NEXT: s_and_saveexec_b32 s5, vcc_lo
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_umin v0, v1, s[0:3], s6 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr2
|
|
; CHECK-NEXT: ; implicit-def: $vgpr1
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s5
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB10_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s4
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.umin.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @wf_test5(i64 %val, <4 x i32> inreg %rsrc, i32 %voffset, i32 %soffset) {
|
|
; CHECK-LABEL: wf_test5:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s4, exec_lo
|
|
; CHECK-NEXT: .LBB11_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v3
|
|
; CHECK-NEXT: v_cmp_eq_u32_e32 vcc_lo, s6, v3
|
|
; CHECK-NEXT: s_and_saveexec_b32 s5, vcc_lo
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_umax_x2 v[0:1], v2, s[0:3], s6 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr3
|
|
; CHECK-NEXT: ; implicit-def: $vgpr2
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s5
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB11_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s4
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.umax.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
; Waterfall tests - both divergent (VGPR rsrc and soffset)
|
|
define amdgpu_ps float @wf_test6(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset) {
|
|
; CHECK-LABEL: wf_test6:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s2, exec_lo
|
|
; CHECK-NEXT: .LBB12_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s4, v1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s5, v2
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v3
|
|
; CHECK-NEXT: v_readfirstlane_b32 s7, v4
|
|
; CHECK-NEXT: v_readfirstlane_b32 s3, v6
|
|
; CHECK-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[1:2]
|
|
; CHECK-NEXT: v_cmp_eq_u64_e64 s0, s[6:7], v[3:4]
|
|
; CHECK-NEXT: v_cmp_eq_u32_e64 s1, s3, v6
|
|
; CHECK-NEXT: s_and_b32 s0, vcc_lo, s0
|
|
; CHECK-NEXT: s_and_b32 s0, s0, s1
|
|
; CHECK-NEXT: s_and_saveexec_b32 s0, s0
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_smin v0, v5, s[4:7], s3 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr1
|
|
; CHECK-NEXT: ; implicit-def: $vgpr6
|
|
; CHECK-NEXT: ; implicit-def: $vgpr5
|
|
; CHECK-NEXT: ; implicit-def: $vgpr3_vgpr4
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s0
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB12_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s2
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i32 @llvm.amdgcn.raw.buffer.atomic.smin.i32(i32 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i32 %ret to float
|
|
ret float %cast
|
|
}
|
|
|
|
define amdgpu_ps <2 x float> @wf_test7(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset) {
|
|
; CHECK-LABEL: wf_test7:
|
|
; CHECK: ; %bb.0:
|
|
; CHECK-NEXT: s_mov_b32 s2, exec_lo
|
|
; CHECK-NEXT: .LBB13_1: ; =>This Inner Loop Header: Depth=1
|
|
; CHECK-NEXT: v_readfirstlane_b32 s4, v2
|
|
; CHECK-NEXT: v_readfirstlane_b32 s5, v3
|
|
; CHECK-NEXT: v_readfirstlane_b32 s6, v4
|
|
; CHECK-NEXT: v_readfirstlane_b32 s7, v5
|
|
; CHECK-NEXT: v_readfirstlane_b32 s3, v7
|
|
; CHECK-NEXT: v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[2:3]
|
|
; CHECK-NEXT: v_cmp_eq_u64_e64 s0, s[6:7], v[4:5]
|
|
; CHECK-NEXT: v_cmp_eq_u32_e64 s1, s3, v7
|
|
; CHECK-NEXT: s_and_b32 s0, vcc_lo, s0
|
|
; CHECK-NEXT: s_and_b32 s0, s0, s1
|
|
; CHECK-NEXT: s_and_saveexec_b32 s0, s0
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: buffer_atomic_umin_x2 v[0:1], v6, s[4:7], s3 offen glc
|
|
; CHECK-NEXT: ; implicit-def: $vgpr2
|
|
; CHECK-NEXT: ; implicit-def: $vgpr7
|
|
; CHECK-NEXT: ; implicit-def: $vgpr6
|
|
; CHECK-NEXT: ; implicit-def: $vgpr4_vgpr5
|
|
; CHECK-NEXT: s_waitcnt_depctr depctr_vm_vsrc(0)
|
|
; CHECK-NEXT: s_xor_b32 exec_lo, exec_lo, s0
|
|
; CHECK-NEXT: s_cbranch_execnz .LBB13_1
|
|
; CHECK-NEXT: ; %bb.2:
|
|
; CHECK-NEXT: s_mov_b32 exec_lo, s2
|
|
; CHECK-NEXT: s_waitcnt vmcnt(0)
|
|
; CHECK-NEXT: ; return to shader part epilog
|
|
%ret = call i64 @llvm.amdgcn.raw.buffer.atomic.umin.i64(i64 %val, <4 x i32> %rsrc, i32 %voffset, i32 %soffset, i32 0)
|
|
%cast = bitcast i64 %ret to <2 x float>
|
|
ret <2 x float> %cast
|
|
}
|
|
|
|
|
|
declare i32 @llvm.amdgcn.raw.buffer.atomic.smin.i32(i32, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i32 @llvm.amdgcn.raw.buffer.atomic.smax.i32(i32, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i32 @llvm.amdgcn.raw.buffer.atomic.umin.i32(i32, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i32 @llvm.amdgcn.raw.buffer.atomic.umax.i32(i32, <4 x i32>, i32, i32, i32 immarg) #0
|
|
|
|
declare i64 @llvm.amdgcn.raw.buffer.atomic.smin.i64(i64, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i64 @llvm.amdgcn.raw.buffer.atomic.smax.i64(i64, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i64 @llvm.amdgcn.raw.buffer.atomic.umin.i64(i64, <4 x i32>, i32, i32, i32 immarg) #0
|
|
declare i64 @llvm.amdgcn.raw.buffer.atomic.umax.i64(i64, <4 x i32>, i32, i32, i32 immarg) #0
|
|
|
|
attributes #0 = { nounwind }
|