294 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck -check-prefixes=GFX12,GFX12-GISEL %s4 5@bar = internal addrspace(3) global target("amdgcn.named.barrier", 0) poison6@bar2 = internal addrspace(3) global target("amdgcn.named.barrier", 0) poison7@bar3 = internal addrspace(3) global target("amdgcn.named.barrier", 0) poison8 9define void @func1() {10; GFX12-SDAG-LABEL: func1:11; GFX12-SDAG: ; %bb.0:12; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x013; GFX12-SDAG-NEXT: s_wait_expcnt 0x014; GFX12-SDAG-NEXT: s_wait_samplecnt 0x015; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x016; GFX12-SDAG-NEXT: s_wait_kmcnt 0x017; GFX12-SDAG-NEXT: s_mov_b32 m0, 318; GFX12-SDAG-NEXT: s_barrier_join m019; GFX12-SDAG-NEXT: s_mov_b32 m0, 0x7000320; GFX12-SDAG-NEXT: s_barrier_signal m021; GFX12-SDAG-NEXT: s_barrier_wait 122; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]23;24; GFX12-GISEL-LABEL: func1:25; GFX12-GISEL: ; %bb.0:26; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x027; GFX12-GISEL-NEXT: s_wait_expcnt 0x028; GFX12-GISEL-NEXT: s_wait_samplecnt 0x029; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x030; GFX12-GISEL-NEXT: s_wait_kmcnt 0x031; GFX12-GISEL-NEXT: s_mov_b32 m0, 0x7000332; GFX12-GISEL-NEXT: s_barrier_join 333; GFX12-GISEL-NEXT: s_barrier_signal m034; GFX12-GISEL-NEXT: s_barrier_wait 135; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]36 call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) @bar3)37 call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) @bar3, i32 7)38 call void @llvm.amdgcn.s.barrier.wait(i16 1)39 ret void40}41 42define void @func2() {43; GFX12-SDAG-LABEL: func2:44; GFX12-SDAG: ; %bb.0:45; GFX12-SDAG-NEXT: s_wait_loadcnt_dscnt 0x046; GFX12-SDAG-NEXT: s_wait_expcnt 0x047; GFX12-SDAG-NEXT: s_wait_samplecnt 0x048; GFX12-SDAG-NEXT: s_wait_bvhcnt 0x049; GFX12-SDAG-NEXT: s_wait_kmcnt 0x050; GFX12-SDAG-NEXT: s_mov_b32 m0, 151; GFX12-SDAG-NEXT: s_barrier_join m052; GFX12-SDAG-NEXT: s_mov_b32 m0, 0x7000153; GFX12-SDAG-NEXT: s_barrier_signal m054; GFX12-SDAG-NEXT: s_barrier_wait 155; GFX12-SDAG-NEXT: s_setpc_b64 s[30:31]56;57; GFX12-GISEL-LABEL: func2:58; GFX12-GISEL: ; %bb.0:59; GFX12-GISEL-NEXT: s_wait_loadcnt_dscnt 0x060; GFX12-GISEL-NEXT: s_wait_expcnt 0x061; GFX12-GISEL-NEXT: s_wait_samplecnt 0x062; GFX12-GISEL-NEXT: s_wait_bvhcnt 0x063; GFX12-GISEL-NEXT: s_wait_kmcnt 0x064; GFX12-GISEL-NEXT: s_mov_b32 m0, 0x7000165; GFX12-GISEL-NEXT: s_barrier_join 166; GFX12-GISEL-NEXT: s_barrier_signal m067; GFX12-GISEL-NEXT: s_barrier_wait 168; GFX12-GISEL-NEXT: s_setpc_b64 s[30:31]69 call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) @bar2)70 call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) @bar2, i32 7)71 call void @llvm.amdgcn.s.barrier.wait(i16 1)72 ret void73}74 75define amdgpu_kernel void @kernel1(ptr addrspace(1) %out, ptr addrspace(3) %in) #0 {76; GFX12-SDAG-LABEL: kernel1:77; GFX12-SDAG: ; %bb.0:78; GFX12-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]79; GFX12-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]80; GFX12-SDAG-NEXT: s_load_b32 s2, s[4:5], 0x2c81; GFX12-SDAG-NEXT: s_mov_b32 m0, 0xc000282; GFX12-SDAG-NEXT: v_mov_b32_e32 v31, v083; GFX12-SDAG-NEXT: s_barrier_init m084; GFX12-SDAG-NEXT: s_add_nc_u64 s[8:9], s[4:5], 4885; GFX12-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]86; GFX12-SDAG-NEXT: s_mov_b32 s32, 087; GFX12-SDAG-NEXT: s_wait_kmcnt 0x088; GFX12-SDAG-NEXT: s_lshr_b32 s2, s2, 489; GFX12-SDAG-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)90; GFX12-SDAG-NEXT: s_and_b32 s2, s2, 6391; GFX12-SDAG-NEXT: s_or_b32 s3, 0x90000, s292; GFX12-SDAG-NEXT: s_cmp_eq_u32 0, 093; GFX12-SDAG-NEXT: s_mov_b32 m0, s394; GFX12-SDAG-NEXT: s_barrier_init m095; GFX12-SDAG-NEXT: s_mov_b32 m0, 0xc000296; GFX12-SDAG-NEXT: s_barrier_signal m097; GFX12-SDAG-NEXT: s_mov_b32 m0, s398; GFX12-SDAG-NEXT: s_barrier_signal m099; GFX12-SDAG-NEXT: s_mov_b32 m0, s2100; GFX12-SDAG-NEXT: s_barrier_signal -1101; GFX12-SDAG-NEXT: s_barrier_join m0102; GFX12-SDAG-NEXT: s_mov_b32 m0, 2103; GFX12-SDAG-NEXT: s_barrier_signal_isfirst -1104; GFX12-SDAG-NEXT: s_barrier_wait 1105; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0106; GFX12-SDAG-NEXT: s_barrier_leave107; GFX12-SDAG-NEXT: s_get_barrier_state s3, m0108; GFX12-SDAG-NEXT: s_mov_b32 m0, s2109; GFX12-SDAG-NEXT: s_get_barrier_state s2, m0110; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0111; GFX12-SDAG-NEXT: s_getpc_b64 s[2:3]112; GFX12-SDAG-NEXT: s_sext_i32_i16 s3, s3113; GFX12-SDAG-NEXT: s_add_co_u32 s2, s2, func1@gotpcrel32@lo+8114; GFX12-SDAG-NEXT: s_add_co_ci_u32 s3, s3, func1@gotpcrel32@hi+16115; GFX12-SDAG-NEXT: s_barrier_signal -1116; GFX12-SDAG-NEXT: s_load_b64 s[2:3], s[2:3], 0x0117; GFX12-SDAG-NEXT: s_barrier_wait -1118; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0119; GFX12-SDAG-NEXT: s_swappc_b64 s[30:31], s[2:3]120; GFX12-SDAG-NEXT: s_getpc_b64 s[2:3]121; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)122; GFX12-SDAG-NEXT: s_sext_i32_i16 s3, s3123; GFX12-SDAG-NEXT: s_add_co_u32 s2, s2, func2@gotpcrel32@lo+12124; GFX12-SDAG-NEXT: s_wait_alu depctr_sa_sdst(0)125; GFX12-SDAG-NEXT: s_add_co_ci_u32 s3, s3, func2@gotpcrel32@hi+24126; GFX12-SDAG-NEXT: s_load_b64 s[2:3], s[2:3], 0x0127; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0128; GFX12-SDAG-NEXT: s_swappc_b64 s[30:31], s[2:3]129; GFX12-SDAG-NEXT: s_get_barrier_state s0, -1130; GFX12-SDAG-NEXT: s_endpgm131;132; GFX12-GISEL-LABEL: kernel1:133; GFX12-GISEL: ; %bb.0:134; GFX12-GISEL-NEXT: s_mov_b64 s[12:13], s[4:5]135; GFX12-GISEL-NEXT: s_mov_b64 s[4:5], s[0:1]136; GFX12-GISEL-NEXT: s_load_b32 s0, s[12:13], 0x2c137; GFX12-GISEL-NEXT: s_mov_b32 m0, 0xc0002138; GFX12-GISEL-NEXT: v_mov_b32_e32 v31, v0139; GFX12-GISEL-NEXT: s_barrier_init m0140; GFX12-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]141; GFX12-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]142; GFX12-GISEL-NEXT: s_mov_b32 s32, 0143; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0144; GFX12-GISEL-NEXT: s_lshr_b32 s0, s0, 4145; GFX12-GISEL-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)146; GFX12-GISEL-NEXT: s_and_b32 s0, s0, 63147; GFX12-GISEL-NEXT: s_or_b32 s1, s0, 0x90000148; GFX12-GISEL-NEXT: s_cmp_eq_u32 0, 0149; GFX12-GISEL-NEXT: s_mov_b32 m0, s1150; GFX12-GISEL-NEXT: s_barrier_init m0151; GFX12-GISEL-NEXT: s_mov_b32 m0, 0xc0002152; GFX12-GISEL-NEXT: s_barrier_signal m0153; GFX12-GISEL-NEXT: s_mov_b32 m0, s1154; GFX12-GISEL-NEXT: s_barrier_signal m0155; GFX12-GISEL-NEXT: s_mov_b32 m0, s0156; GFX12-GISEL-NEXT: s_barrier_signal -1157; GFX12-GISEL-NEXT: s_barrier_join m0158; GFX12-GISEL-NEXT: s_barrier_signal_isfirst -1159; GFX12-GISEL-NEXT: s_barrier_wait 1160; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0161; GFX12-GISEL-NEXT: s_barrier_leave162; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0163; GFX12-GISEL-NEXT: s_add_co_u32 s8, s12, 48164; GFX12-GISEL-NEXT: s_get_barrier_state s0, 2165; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0166; GFX12-GISEL-NEXT: s_get_barrier_state s0, m0167; GFX12-GISEL-NEXT: s_add_co_ci_u32 s9, s13, 0168; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0169; GFX12-GISEL-NEXT: s_getpc_b64 s[0:1]170; GFX12-GISEL-NEXT: s_sext_i32_i16 s1, s1171; GFX12-GISEL-NEXT: s_add_co_u32 s0, s0, func1@gotpcrel32@lo+8172; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s1, func1@gotpcrel32@hi+16173; GFX12-GISEL-NEXT: s_barrier_signal -1174; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x0175; GFX12-GISEL-NEXT: s_barrier_wait -1176; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0177; GFX12-GISEL-NEXT: s_swappc_b64 s[30:31], s[0:1]178; GFX12-GISEL-NEXT: s_add_co_u32 s8, s12, 48179; GFX12-GISEL-NEXT: s_add_co_ci_u32 s9, s13, 0180; GFX12-GISEL-NEXT: s_getpc_b64 s[0:1]181; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)182; GFX12-GISEL-NEXT: s_sext_i32_i16 s1, s1183; GFX12-GISEL-NEXT: s_add_co_u32 s0, s0, func2@gotpcrel32@lo+12184; GFX12-GISEL-NEXT: s_wait_alu depctr_sa_sdst(0)185; GFX12-GISEL-NEXT: s_add_co_ci_u32 s1, s1, func2@gotpcrel32@hi+24186; GFX12-GISEL-NEXT: s_load_b64 s[0:1], s[0:1], 0x0187; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0188; GFX12-GISEL-NEXT: s_swappc_b64 s[30:31], s[0:1]189; GFX12-GISEL-NEXT: s_get_barrier_state s0, -1190; GFX12-GISEL-NEXT: s_endpgm191 call void @llvm.amdgcn.s.barrier.init(ptr addrspace(3) @bar, i32 12)192 call void @llvm.amdgcn.s.barrier.init(ptr addrspace(3) %in, i32 9)193 call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) @bar, i32 12)194 call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) %in, i32 9)195 call void @llvm.amdgcn.s.barrier.signal(i32 -1)196 call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) %in)197 %isfirst = call i1 @llvm.amdgcn.s.barrier.signal.isfirst(i32 -1)198 call void @llvm.amdgcn.s.barrier.wait(i16 1)199 call void @llvm.amdgcn.s.barrier.leave(i16 1)200 %state = call i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3) @bar)201 %state2 = call i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3) %in)202 call void @llvm.amdgcn.s.barrier()203 call void @func1()204 call void @func2()205 %state3 = call i32 @llvm.amdgcn.s.get.barrier.state(i32 -1)206 ret void207}208 209define amdgpu_kernel void @kernel2(ptr addrspace(1) %out, ptr addrspace(3) %in) #0 {210; GFX12-SDAG-LABEL: kernel2:211; GFX12-SDAG: ; %bb.0:212; GFX12-SDAG-NEXT: s_mov_b64 s[10:11], s[6:7]213; GFX12-SDAG-NEXT: s_getpc_b64 s[6:7]214; GFX12-SDAG-NEXT: s_sext_i32_i16 s7, s7215; GFX12-SDAG-NEXT: s_add_co_u32 s6, s6, func2@gotpcrel32@lo+8216; GFX12-SDAG-NEXT: s_add_co_ci_u32 s7, s7, func2@gotpcrel32@hi+16217; GFX12-SDAG-NEXT: v_mov_b32_e32 v31, v0218; GFX12-SDAG-NEXT: s_load_b64 s[12:13], s[6:7], 0x0219; GFX12-SDAG-NEXT: s_mov_b32 m0, 0x70002220; GFX12-SDAG-NEXT: s_add_nc_u64 s[8:9], s[4:5], 48221; GFX12-SDAG-NEXT: s_barrier_signal m0222; GFX12-SDAG-NEXT: s_mov_b32 m0, 2223; GFX12-SDAG-NEXT: s_mov_b64 s[4:5], s[0:1]224; GFX12-SDAG-NEXT: s_mov_b64 s[6:7], s[2:3]225; GFX12-SDAG-NEXT: s_mov_b32 s32, 0226; GFX12-SDAG-NEXT: s_barrier_join m0227; GFX12-SDAG-NEXT: s_barrier_wait 1228; GFX12-SDAG-NEXT: s_wait_kmcnt 0x0229; GFX12-SDAG-NEXT: s_swappc_b64 s[30:31], s[12:13]230; GFX12-SDAG-NEXT: s_endpgm231;232; GFX12-GISEL-LABEL: kernel2:233; GFX12-GISEL: ; %bb.0:234; GFX12-GISEL-NEXT: s_add_co_u32 s8, s4, 48235; GFX12-GISEL-NEXT: s_add_co_ci_u32 s9, s5, 0236; GFX12-GISEL-NEXT: s_getpc_b64 s[4:5]237; GFX12-GISEL-NEXT: s_sext_i32_i16 s5, s5238; GFX12-GISEL-NEXT: s_add_co_u32 s4, s4, func2@gotpcrel32@lo+8239; GFX12-GISEL-NEXT: s_add_co_ci_u32 s5, s5, func2@gotpcrel32@hi+16240; GFX12-GISEL-NEXT: v_mov_b32_e32 v31, v0241; GFX12-GISEL-NEXT: s_load_b64 s[12:13], s[4:5], 0x0242; GFX12-GISEL-NEXT: s_mov_b64 s[10:11], s[6:7]243; GFX12-GISEL-NEXT: s_mov_b32 m0, 0x70002244; GFX12-GISEL-NEXT: s_mov_b64 s[4:5], s[0:1]245; GFX12-GISEL-NEXT: s_mov_b64 s[6:7], s[2:3]246; GFX12-GISEL-NEXT: s_mov_b32 s32, 0247; GFX12-GISEL-NEXT: s_barrier_signal m0248; GFX12-GISEL-NEXT: s_barrier_join 2249; GFX12-GISEL-NEXT: s_barrier_wait 1250; GFX12-GISEL-NEXT: s_wait_kmcnt 0x0251; GFX12-GISEL-NEXT: s_swappc_b64 s[30:31], s[12:13]252; GFX12-GISEL-NEXT: s_endpgm253 call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) @bar, i32 7)254 call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) @bar)255 call void @llvm.amdgcn.s.barrier.wait(i16 1)256 257 call void @func2()258 ret void259}260 261define amdgpu_ps void @test_barrier_leave_write_to_scc(i32 inreg %val, ptr addrspace(1) %out) {262; GFX12-LABEL: test_barrier_leave_write_to_scc:263; GFX12: ; %bb.0:264; GFX12-NEXT: s_barrier_leave265; GFX12-NEXT: s_wait_kmcnt 0x0266; GFX12-NEXT: s_cmp_lg_u32 s0, 0267; GFX12-NEXT: s_movk_i32 s0, 0x7b268; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)269; GFX12-NEXT: s_cselect_b32 s0, s0, 0x1c8270; GFX12-NEXT: v_mov_b32_e32 v2, s0271; GFX12-NEXT: global_store_b32 v[0:1], v2, off272; GFX12-NEXT: s_endpgm273 call void @llvm.amdgcn.s.barrier.leave(i16 1)274 %cmp = icmp ne i32 %val, 0275 %ret = select i1 %cmp, i32 123, i32 456276 store i32 %ret, ptr addrspace(1) %out277 ret void278}279 280declare void @llvm.amdgcn.s.barrier() #1281declare void @llvm.amdgcn.s.barrier.wait(i16) #1282declare void @llvm.amdgcn.s.barrier.signal(i32) #1283declare void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3), i32) #1284declare i1 @llvm.amdgcn.s.barrier.signal.isfirst(i32) #1285declare void @llvm.amdgcn.s.barrier.init(ptr addrspace(3), i32) #1286declare void @llvm.amdgcn.s.barrier.join(ptr addrspace(3)) #1287declare void @llvm.amdgcn.s.barrier.leave(i16) #1288declare i32 @llvm.amdgcn.s.get.barrier.state(i32) #1289declare i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3)) #1290 291attributes #0 = { nounwind }292attributes #1 = { convergent nounwind }293attributes #2 = { nounwind readnone }294