blob: 061de86de64bafa1b6513a4cdf59ceb2a3201821 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=amdgpu12.50-amd-amdhsa --misched-prera-direction=topdown -o - %s | FileCheck %s
@lds = internal unnamed_addr addrspace(3) global [65536 x i8] poison, align 16
define amdgpu_kernel void @fence_barrier_latency_test(ptr addrspace(1) %global_ptr, i32 %offset, <8 x i32> %tdesc, <4 x i32> %src_desc) #0 {
; CHECK-LABEL: fence_barrier_latency_test:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: global_prefetch_b8 v0, s[0:1] scope:SCOPE_SE
; CHECK-NEXT: v_nop
; CHECK-NEXT: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 25, 1), 1 ; msbs: dst=0 src0=0 src1=0 src2=0
; CHECK-NEXT: s_clause 0x2
; CHECK-NEXT: s_load_b128 s[0:3], s[4:5], 0x40 nv
; CHECK-NEXT: s_load_b96 s[16:18], s[4:5], 0x0 nv
; CHECK-NEXT: s_load_b256 s[8:15], s[4:5], 0x20 nv
; CHECK-NEXT: s_wait_kmcnt 0x0
; CHECK-NEXT: v_dual_mov_b32 v32, 0 :: v_dual_mov_b32 v28, s18
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[8:15]
; CHECK-NEXT: s_barrier_signal -1
; CHECK-NEXT: s_barrier_wait -1
; CHECK-NEXT: ds_load_b128 v[0:3], v28
; CHECK-NEXT: ds_load_b128 v[4:7], v28 offset:32
; CHECK-NEXT: ds_load_b128 v[8:11], v28 offset:64
; CHECK-NEXT: ds_load_b128 v[12:15], v28 offset:96
; CHECK-NEXT: ds_load_b128 v[16:19], v28 offset:128
; CHECK-NEXT: ds_load_b128 v[20:23], v28 offset:160
; CHECK-NEXT: ds_load_b128 v[24:27], v28 offset:192
; CHECK-NEXT: ds_load_b128 v[28:31], v28 offset:224
; CHECK-NEXT: s_wait_dscnt 0x7
; CHECK-NEXT: v_readfirstlane_b32 s4, v3
; CHECK-NEXT: s_wait_dscnt 0x6
; CHECK-NEXT: v_readfirstlane_b32 s5, v7
; CHECK-NEXT: v_readfirstlane_b32 s6, v6
; CHECK-NEXT: v_readfirstlane_b32 s7, v2
; CHECK-NEXT: v_readfirstlane_b32 s18, v5
; CHECK-NEXT: v_readfirstlane_b32 s19, v1
; CHECK-NEXT: v_readfirstlane_b32 s20, v4
; CHECK-NEXT: v_readfirstlane_b32 s21, v0
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_wait_dscnt 0x0
; CHECK-NEXT: s_barrier_signal -1
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_barrier_wait -1
; CHECK-NEXT: tensor_load_to_lds s[0:3], s[8:15]
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: v_dual_add_nc_u32 v0, v11, v15 :: v_dual_add_nc_u32 v1, v10, v14
; CHECK-NEXT: v_dual_add_nc_u32 v2, v9, v13 :: v_dual_add_nc_u32 v3, v8, v12
; CHECK-NEXT: v_dual_add_nc_u32 v4, v19, v23 :: v_dual_add_nc_u32 v5, v18, v22
; CHECK-NEXT: v_dual_add_nc_u32 v6, v17, v21 :: v_dual_add_nc_u32 v7, v16, v20
; CHECK-NEXT: v_dual_add_nc_u32 v8, v27, v31 :: v_dual_add_nc_u32 v9, v26, v30
; CHECK-NEXT: v_dual_add_nc_u32 v10, v25, v29 :: v_dual_add_nc_u32 v11, v24, v28
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s7, s7, s6
; CHECK-NEXT: s_add_co_i32 s4, s4, s5
; CHECK-NEXT: s_add_co_i32 s19, s19, s18
; CHECK-NEXT: s_add_co_i32 s21, s21, s20
; CHECK-NEXT: v_dual_add_nc_u32 v2, s19, v2 :: v_dual_add_nc_u32 v3, s21, v3
; CHECK-NEXT: v_dual_add_nc_u32 v12, s7, v1 :: v_dual_add_nc_u32 v13, s4, v0
; CHECK-NEXT: v_dual_add_nc_u32 v0, v7, v11 :: v_dual_add_nc_u32 v1, v6, v10
; CHECK-NEXT: v_dual_add_nc_u32 v5, v5, v9 :: v_dual_add_nc_u32 v4, v4, v8
; CHECK-NEXT: v_dual_add_nc_u32 v0, v3, v0 :: v_dual_add_nc_u32 v1, v2, v1
; CHECK-NEXT: v_dual_add_nc_u32 v2, v12, v5 :: v_dual_add_nc_u32 v3, v13, v4
; CHECK-NEXT: global_store_b128 v32, v[0:3], s[16:17]
; CHECK-NEXT: s_endpgm
entry:
tail call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %src_desc, <8 x i32> %tdesc, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
fence syncscope("workgroup") release
tail call void @llvm.amdgcn.s.barrier()
fence syncscope("workgroup") acquire
%lds_base = getelementptr i8, ptr addrspace(3) @lds, i32 %offset
%ptr0 = getelementptr i8, ptr addrspace(3) %lds_base, i32 0
%v0 = load <4 x i32>, ptr addrspace(3) %ptr0, align 16
%ptr1 = getelementptr i8, ptr addrspace(3) %lds_base, i32 32
%v1 = load <4 x i32>, ptr addrspace(3) %ptr1, align 16
%ptr2 = getelementptr i8, ptr addrspace(3) %lds_base, i32 64
%v2 = load <4 x i32>, ptr addrspace(3) %ptr2, align 16
%ptr3 = getelementptr i8, ptr addrspace(3) %lds_base, i32 96
%v3 = load <4 x i32>, ptr addrspace(3) %ptr3, align 16
%ptr4 = getelementptr i8, ptr addrspace(3) %lds_base, i32 128
%v4 = load <4 x i32>, ptr addrspace(3) %ptr4, align 16
%ptr5 = getelementptr i8, ptr addrspace(3) %lds_base, i32 160
%v5 = load <4 x i32>, ptr addrspace(3) %ptr5, align 16
%ptr6 = getelementptr i8, ptr addrspace(3) %lds_base, i32 192
%v6 = load <4 x i32>, ptr addrspace(3) %ptr6, align 16
%ptr7 = getelementptr i8, ptr addrspace(3) %lds_base, i32 224
%v7 = load <4 x i32>, ptr addrspace(3) %ptr7, align 16
%sum01_t0 = add <4 x i32> %v0, %v1
%sum01_t1 = add <4 x i32> %sum01_t0, %v1
%sum01_t2 = add <4 x i32> %sum01_t1, %v1
%sum01_t3 = add <4 x i32> %sum01_t2, %v1
%sum01_t4 = add <4 x i32> %sum01_t3, %v1
%sum01_t5 = add <4 x i32> %sum01_t4, %v1
%sum01_t6 = add <4 x i32> %sum01_t5, %v1
%sum01_t7 = add <4 x i32> %sum01_t6, %v1
%sum01_t8 = add <4 x i32> %sum01_t7, %v1
%sum01_t9 = add <4 x i32> %sum01_t8, %v1
%sum01 = add <4 x i32> %sum01_t9, %v1
%sum23 = add <4 x i32> %v2, %v3
%sum45 = add <4 x i32> %v4, %v5
%sum67 = add <4 x i32> %v6, %v7
%sum0123 = add <4 x i32> %sum01, %sum23
%sum4567 = add <4 x i32> %sum45, %sum67
%sum_all = add <4 x i32> %sum0123, %sum4567
fence syncscope("workgroup") release
tail call void @llvm.amdgcn.s.barrier()
fence syncscope("workgroup") acquire
tail call void @llvm.amdgcn.tensor.load.to.lds(<4 x i32> %src_desc, <8 x i32> %tdesc, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer, <8 x i32> zeroinitializer, i32 0)
store <4 x i32> %sum_all, ptr addrspace(1) %global_ptr, align 16
ret void
}
declare void @llvm.amdgcn.s.barrier()
declare void @llvm.amdgcn.tensor.load.to.lds(<4 x i32>, <8 x i32>, <4 x i32>, <4 x i32>, <8 x i32>, i32)
attributes #0 = { "amdgpu-flat-work-group-size"="1,128" "amdgpu-waves-per-eu"="1,1" }