232 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SDAG %s3; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GISEL %s4 5; Load argument depends on waitcnt which should be skipped.6define amdgpu_kernel void @call_memory_arg_load(ptr addrspace(3) %ptr, i32) #0 {7; GCN-LABEL: call_memory_arg_load:8; GCN: ; %bb.0:9; GCN-NEXT: s_load_dword s6, s[6:7], 0x010; GCN-NEXT: s_add_u32 flat_scratch_lo, s8, s1111; GCN-NEXT: s_addc_u32 flat_scratch_hi, s9, 012; GCN-NEXT: s_add_u32 s0, s0, s1113; GCN-NEXT: s_addc_u32 s1, s1, 014; GCN-NEXT: s_waitcnt lgkmcnt(0)15; GCN-NEXT: v_mov_b32_e32 v0, s616; GCN-NEXT: ds_read_b32 v0, v017; GCN-NEXT: s_getpc_b64 s[8:9]18; GCN-NEXT: s_add_u32 s8, s8, func@rel32@lo+419; GCN-NEXT: s_addc_u32 s9, s9, func@rel32@hi+1220; GCN-NEXT: s_mov_b64 s[6:7], s[4:5]21; GCN-NEXT: s_mov_b32 s32, 022; GCN-NEXT: s_swappc_b64 s[30:31], s[8:9]23; GCN-NEXT: s_endpgm24 %vgpr = load volatile i32, ptr addrspace(3) %ptr25 call void @func(i32 %vgpr)26 ret void27}28 29; Memory waitcnt with no register dependence on the call30define amdgpu_kernel void @call_memory_no_dep(ptr addrspace(1) %ptr, i32) #0 {31; SDAG-LABEL: call_memory_no_dep:32; SDAG: ; %bb.0:33; SDAG-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x034; SDAG-NEXT: s_add_u32 flat_scratch_lo, s8, s1135; SDAG-NEXT: s_addc_u32 flat_scratch_hi, s9, 036; SDAG-NEXT: s_add_u32 s0, s0, s1137; SDAG-NEXT: s_addc_u32 s1, s1, 038; SDAG-NEXT: v_mov_b32_e32 v0, 039; SDAG-NEXT: s_getpc_b64 s[8:9]40; SDAG-NEXT: s_add_u32 s8, s8, func@rel32@lo+441; SDAG-NEXT: s_addc_u32 s9, s9, func@rel32@hi+1242; SDAG-NEXT: s_waitcnt lgkmcnt(0)43; SDAG-NEXT: global_store_dword v0, v0, s[6:7]44; SDAG-NEXT: s_mov_b64 s[6:7], s[4:5]45; SDAG-NEXT: v_mov_b32_e32 v0, 046; SDAG-NEXT: s_mov_b32 s32, 047; SDAG-NEXT: s_swappc_b64 s[30:31], s[8:9]48; SDAG-NEXT: s_endpgm49;50; GISEL-LABEL: call_memory_no_dep:51; GISEL: ; %bb.0:52; GISEL-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x053; GISEL-NEXT: s_add_u32 flat_scratch_lo, s8, s1154; GISEL-NEXT: s_addc_u32 flat_scratch_hi, s9, 055; GISEL-NEXT: s_add_u32 s0, s0, s1156; GISEL-NEXT: s_addc_u32 s1, s1, 057; GISEL-NEXT: v_mov_b32_e32 v0, 058; GISEL-NEXT: s_getpc_b64 s[8:9]59; GISEL-NEXT: s_add_u32 s8, s8, func@rel32@lo+460; GISEL-NEXT: s_addc_u32 s9, s9, func@rel32@hi+1261; GISEL-NEXT: s_waitcnt lgkmcnt(0)62; GISEL-NEXT: global_store_dword v0, v0, s[6:7]63; GISEL-NEXT: v_mov_b32_e32 v0, 064; GISEL-NEXT: s_mov_b64 s[6:7], s[4:5]65; GISEL-NEXT: s_mov_b32 s32, 066; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9]67; GISEL-NEXT: s_endpgm68 store i32 0, ptr addrspace(1) %ptr69 call void @func(i32 0)70 ret void71}72 73; Should not wait after the call before memory74define amdgpu_kernel void @call_no_wait_after_call(ptr addrspace(1) %ptr, i32) #0 {75; SDAG-LABEL: call_no_wait_after_call:76; SDAG: ; %bb.0:77; SDAG-NEXT: s_add_u32 flat_scratch_lo, s8, s1178; SDAG-NEXT: s_addc_u32 flat_scratch_hi, s9, 079; SDAG-NEXT: s_load_dwordx2 s[34:35], s[6:7], 0x080; SDAG-NEXT: s_add_u32 s0, s0, s1181; SDAG-NEXT: s_addc_u32 s1, s1, 082; SDAG-NEXT: s_getpc_b64 s[8:9]83; SDAG-NEXT: s_add_u32 s8, s8, func@rel32@lo+484; SDAG-NEXT: s_addc_u32 s9, s9, func@rel32@hi+1285; SDAG-NEXT: s_mov_b64 s[6:7], s[4:5]86; SDAG-NEXT: v_mov_b32_e32 v0, 087; SDAG-NEXT: s_mov_b32 s32, 088; SDAG-NEXT: v_mov_b32_e32 v40, 089; SDAG-NEXT: s_swappc_b64 s[30:31], s[8:9]90; SDAG-NEXT: global_store_dword v40, v40, s[34:35]91; SDAG-NEXT: s_endpgm92;93; GISEL-LABEL: call_no_wait_after_call:94; GISEL: ; %bb.0:95; GISEL-NEXT: s_add_u32 flat_scratch_lo, s8, s1196; GISEL-NEXT: s_addc_u32 flat_scratch_hi, s9, 097; GISEL-NEXT: s_load_dwordx2 s[34:35], s[6:7], 0x098; GISEL-NEXT: s_add_u32 s0, s0, s1199; GISEL-NEXT: s_addc_u32 s1, s1, 0100; GISEL-NEXT: s_getpc_b64 s[8:9]101; GISEL-NEXT: s_add_u32 s8, s8, func@rel32@lo+4102; GISEL-NEXT: s_addc_u32 s9, s9, func@rel32@hi+12103; GISEL-NEXT: v_mov_b32_e32 v0, 0104; GISEL-NEXT: s_mov_b64 s[6:7], s[4:5]105; GISEL-NEXT: s_mov_b32 s32, 0106; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9]107; GISEL-NEXT: v_mov_b32_e32 v0, 0108; GISEL-NEXT: global_store_dword v0, v0, s[34:35]109; GISEL-NEXT: s_endpgm110 call void @func(i32 0)111 store i32 0, ptr addrspace(1) %ptr112 ret void113}114 115define amdgpu_kernel void @call_no_wait_after_call_return_val(ptr addrspace(1) %ptr, i32) #0 {116; SDAG-LABEL: call_no_wait_after_call_return_val:117; SDAG: ; %bb.0:118; SDAG-NEXT: s_add_u32 flat_scratch_lo, s8, s11119; SDAG-NEXT: s_addc_u32 flat_scratch_hi, s9, 0120; SDAG-NEXT: s_load_dwordx2 s[34:35], s[6:7], 0x0121; SDAG-NEXT: s_add_u32 s0, s0, s11122; SDAG-NEXT: s_addc_u32 s1, s1, 0123; SDAG-NEXT: s_getpc_b64 s[8:9]124; SDAG-NEXT: s_add_u32 s8, s8, func.return@rel32@lo+4125; SDAG-NEXT: s_addc_u32 s9, s9, func.return@rel32@hi+12126; SDAG-NEXT: s_mov_b64 s[6:7], s[4:5]127; SDAG-NEXT: v_mov_b32_e32 v0, 0128; SDAG-NEXT: s_mov_b32 s32, 0129; SDAG-NEXT: v_mov_b32_e32 v40, 0130; SDAG-NEXT: s_swappc_b64 s[30:31], s[8:9]131; SDAG-NEXT: global_store_dword v40, v0, s[34:35]132; SDAG-NEXT: s_endpgm133;134; GISEL-LABEL: call_no_wait_after_call_return_val:135; GISEL: ; %bb.0:136; GISEL-NEXT: s_add_u32 flat_scratch_lo, s8, s11137; GISEL-NEXT: s_addc_u32 flat_scratch_hi, s9, 0138; GISEL-NEXT: s_load_dwordx2 s[34:35], s[6:7], 0x0139; GISEL-NEXT: s_add_u32 s0, s0, s11140; GISEL-NEXT: s_addc_u32 s1, s1, 0141; GISEL-NEXT: s_getpc_b64 s[8:9]142; GISEL-NEXT: s_add_u32 s8, s8, func.return@rel32@lo+4143; GISEL-NEXT: s_addc_u32 s9, s9, func.return@rel32@hi+12144; GISEL-NEXT: v_mov_b32_e32 v0, 0145; GISEL-NEXT: s_mov_b64 s[6:7], s[4:5]146; GISEL-NEXT: s_mov_b32 s32, 0147; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9]148; GISEL-NEXT: v_mov_b32_e32 v1, 0149; GISEL-NEXT: global_store_dword v1, v0, s[34:35]150; GISEL-NEXT: s_endpgm151 %rv = call i32 @func.return(i32 0)152 store i32 %rv, ptr addrspace(1) %ptr153 ret void154}155 156; Need to wait for the address dependency157define amdgpu_kernel void @call_got_load(ptr addrspace(1) %ptr, i32) #0 {158; SDAG-LABEL: call_got_load:159; SDAG: ; %bb.0:160; SDAG-NEXT: s_add_u32 flat_scratch_lo, s8, s11161; SDAG-NEXT: s_addc_u32 flat_scratch_hi, s9, 0162; SDAG-NEXT: s_add_u32 s0, s0, s11163; SDAG-NEXT: s_addc_u32 s1, s1, 0164; SDAG-NEXT: s_getpc_b64 s[6:7]165; SDAG-NEXT: s_add_u32 s6, s6, got.func@gotpcrel32@lo+4166; SDAG-NEXT: s_addc_u32 s7, s7, got.func@gotpcrel32@hi+12167; SDAG-NEXT: s_load_dwordx2 s[8:9], s[6:7], 0x0168; SDAG-NEXT: s_mov_b64 s[6:7], s[4:5]169; SDAG-NEXT: v_mov_b32_e32 v0, 0170; SDAG-NEXT: s_mov_b32 s32, 0171; SDAG-NEXT: s_waitcnt lgkmcnt(0)172; SDAG-NEXT: s_swappc_b64 s[30:31], s[8:9]173; SDAG-NEXT: s_endpgm174;175; GISEL-LABEL: call_got_load:176; GISEL: ; %bb.0:177; GISEL-NEXT: s_add_u32 flat_scratch_lo, s8, s11178; GISEL-NEXT: s_addc_u32 flat_scratch_hi, s9, 0179; GISEL-NEXT: s_add_u32 s0, s0, s11180; GISEL-NEXT: s_addc_u32 s1, s1, 0181; GISEL-NEXT: s_getpc_b64 s[6:7]182; GISEL-NEXT: s_add_u32 s6, s6, got.func@gotpcrel32@lo+4183; GISEL-NEXT: s_addc_u32 s7, s7, got.func@gotpcrel32@hi+12184; GISEL-NEXT: s_load_dwordx2 s[8:9], s[6:7], 0x0185; GISEL-NEXT: v_mov_b32_e32 v0, 0186; GISEL-NEXT: s_mov_b64 s[6:7], s[4:5]187; GISEL-NEXT: s_mov_b32 s32, 0188; GISEL-NEXT: s_waitcnt lgkmcnt(0)189; GISEL-NEXT: s_swappc_b64 s[30:31], s[8:9]190; GISEL-NEXT: s_endpgm191 call void @got.func(i32 0)192 ret void193}194 195; Need to wait for the address dependency196define void @tailcall_got_load(ptr addrspace(1) %ptr, i32) #0 {197; GCN-LABEL: tailcall_got_load:198; GCN: ; %bb.0:199; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)200; GCN-NEXT: s_getpc_b64 s[4:5]201; GCN-NEXT: s_add_u32 s4, s4, got.func@gotpcrel32@lo+4202; GCN-NEXT: s_addc_u32 s5, s5, got.func@gotpcrel32@hi+12203; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0204; GCN-NEXT: v_mov_b32_e32 v0, 0205; GCN-NEXT: s_waitcnt lgkmcnt(0)206; GCN-NEXT: s_setpc_b64 s[4:5]207 tail call void @got.func(i32 0)208 ret void209}210 211; No need to wait for the load.212define void @tail_call_memory_arg_load(ptr addrspace(3) %ptr, i32) #0 {213; GCN-LABEL: tail_call_memory_arg_load:214; GCN: ; %bb.0:215; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)216; GCN-NEXT: ds_read_b32 v0, v0217; GCN-NEXT: s_getpc_b64 s[4:5]218; GCN-NEXT: s_add_u32 s4, s4, func@rel32@lo+4219; GCN-NEXT: s_addc_u32 s5, s5, func@rel32@hi+12220; GCN-NEXT: s_setpc_b64 s[4:5]221 %vgpr = load volatile i32, ptr addrspace(3) %ptr222 tail call void @func(i32 %vgpr)223 ret void224}225 226declare hidden void @func(i32) #0227declare hidden i32 @func.return(i32) #0228declare void @got.func(i32) #0229 230attributes #0 = { nounwind "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-cluster-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-cluster-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-cluster-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" }231 232