1076 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -mattr=-flat-for-global -enable-ipra=0 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,FIJI %s3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-ipra=0 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,HAWAII %s4; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -mattr=-flat-for-global -enable-ipra=0 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,GFX9 %s5 6; FIXME: Why is this commuted only sometimes?7define fastcc i32 @i32_fastcc_i32_i32(i32 %arg0, i32 %arg1) #1 {8; FIJI-LABEL: i32_fastcc_i32_i32:9; FIJI: ; %bb.0:10; FIJI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v112; FIJI-NEXT: s_setpc_b64 s[30:31]13;14; HAWAII-LABEL: i32_fastcc_i32_i32:15; HAWAII: ; %bb.0:16; HAWAII-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)17; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v118; HAWAII-NEXT: s_setpc_b64 s[30:31]19;20; GFX9-LABEL: i32_fastcc_i32_i32:21; GFX9: ; %bb.0:22; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)23; GFX9-NEXT: v_add_u32_e32 v0, v0, v124; GFX9-NEXT: s_setpc_b64 s[30:31]25 %add0 = add i32 %arg0, %arg126 ret i32 %add027}28 29define fastcc i32 @i32_fastcc_i32_i32_stack_object(i32 %arg0, i32 %arg1) #1 {30; FIJI-LABEL: i32_fastcc_i32_i32_stack_object:31; FIJI: ; %bb.0:32; FIJI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)33; FIJI-NEXT: v_mov_b32_e32 v2, 934; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v135; FIJI-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:2036; FIJI-NEXT: s_waitcnt vmcnt(0)37; FIJI-NEXT: s_setpc_b64 s[30:31]38;39; HAWAII-LABEL: i32_fastcc_i32_i32_stack_object:40; HAWAII: ; %bb.0:41; HAWAII-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)42; HAWAII-NEXT: v_mov_b32_e32 v2, 943; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v144; HAWAII-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:2045; HAWAII-NEXT: s_waitcnt vmcnt(0)46; HAWAII-NEXT: s_setpc_b64 s[30:31]47;48; GFX9-LABEL: i32_fastcc_i32_i32_stack_object:49; GFX9: ; %bb.0:50; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)51; GFX9-NEXT: v_mov_b32_e32 v2, 952; GFX9-NEXT: v_add_u32_e32 v0, v0, v153; GFX9-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:2054; GFX9-NEXT: s_waitcnt vmcnt(0)55; GFX9-NEXT: s_setpc_b64 s[30:31]56 %alloca = alloca [16 x i32], align 4, addrspace(5)57 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 558 store volatile i32 9, ptr addrspace(5) %gep59 %add0 = add i32 %arg0, %arg160 ret i32 %add061}62 63define hidden fastcc i32 @sibling_call_i32_fastcc_i32_i32(i32 %a, i32 %b, i32 %c) #1 {64; GCN-LABEL: sibling_call_i32_fastcc_i32_i32:65; GCN: ; %bb.0: ; %entry66; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)67; GCN-NEXT: s_getpc_b64 s[4:5]68; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32@gotpcrel32@lo+469; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32@gotpcrel32@hi+1270; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x071; GCN-NEXT: s_waitcnt lgkmcnt(0)72; GCN-NEXT: s_setpc_b64 s[4:5]73entry:74 %ret = tail call fastcc i32 @i32_fastcc_i32_i32(i32 %a, i32 %b)75 ret i32 %ret76}77 78define fastcc i32 @sibling_call_i32_fastcc_i32_i32_stack_object(i32 %a, i32 %b, i32 %c) #1 {79; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_stack_object:80; GCN: ; %bb.0: ; %entry81; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)82; GCN-NEXT: s_getpc_b64 s[4:5]83; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32@gotpcrel32@lo+484; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32@gotpcrel32@hi+1285; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x086; GCN-NEXT: v_mov_b32_e32 v2, 987; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:2088; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)89; GCN-NEXT: s_setpc_b64 s[4:5]90entry:91 %alloca = alloca [16 x i32], align 4, addrspace(5)92 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 593 store volatile i32 9, ptr addrspace(5) %gep94 %ret = tail call fastcc i32 @i32_fastcc_i32_i32(i32 %a, i32 %b)95 ret i32 %ret96}97 98define fastcc i32 @sibling_call_i32_fastcc_i32_i32_callee_stack_object(i32 %a, i32 %b, i32 %c) #1 {99; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_callee_stack_object:100; GCN: ; %bb.0: ; %entry101; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)102; GCN-NEXT: s_getpc_b64 s[4:5]103; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_stack_object@gotpcrel32@lo+4104; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_stack_object@gotpcrel32@hi+12105; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0106; GCN-NEXT: v_mov_b32_e32 v2, 9107; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:20108; GCN-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)109; GCN-NEXT: s_setpc_b64 s[4:5]110entry:111 %alloca = alloca [16 x i32], align 4, addrspace(5)112 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 5113 store volatile i32 9, ptr addrspace(5) %gep114 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_stack_object(i32 %a, i32 %b)115 ret i32 %ret116}117 118define fastcc void @sibling_call_i32_fastcc_i32_i32_unused_result(i32 %a, i32 %b, i32 %c) #1 {119; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_unused_result:120; GCN: ; %bb.0: ; %entry121; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)122; GCN-NEXT: s_getpc_b64 s[4:5]123; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32@gotpcrel32@lo+4124; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32@gotpcrel32@hi+12125; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0126; GCN-NEXT: s_waitcnt lgkmcnt(0)127; GCN-NEXT: s_setpc_b64 s[4:5]128entry:129 %ret = tail call fastcc i32 @i32_fastcc_i32_i32(i32 %a, i32 %b)130 ret void131}132 133; It doesn't make sense to do a tail from a kernel134define amdgpu_kernel void @kernel_call_i32_fastcc_i32_i32_unused_result(i32 %a, i32 %b, i32 %c) #1 {135; FIJI-LABEL: kernel_call_i32_fastcc_i32_i32_unused_result:136; FIJI: ; %bb.0: ; %entry137; FIJI-NEXT: s_add_i32 s6, s6, s9138; FIJI-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8139; FIJI-NEXT: s_add_u32 s0, s0, s9140; FIJI-NEXT: s_addc_u32 s1, s1, 0141; FIJI-NEXT: s_mov_b32 flat_scratch_lo, s7142; FIJI-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0143; FIJI-NEXT: s_getpc_b64 s[6:7]144; FIJI-NEXT: s_add_u32 s6, s6, i32_fastcc_i32_i32@gotpcrel32@lo+4145; FIJI-NEXT: s_addc_u32 s7, s7, i32_fastcc_i32_i32@gotpcrel32@hi+12146; FIJI-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0147; FIJI-NEXT: s_mov_b32 s32, 0148; FIJI-NEXT: s_waitcnt lgkmcnt(0)149; FIJI-NEXT: v_mov_b32_e32 v0, s4150; FIJI-NEXT: v_mov_b32_e32 v1, s5151; FIJI-NEXT: s_swappc_b64 s[30:31], s[6:7]152; FIJI-NEXT: s_endpgm153;154; HAWAII-LABEL: kernel_call_i32_fastcc_i32_i32_unused_result:155; HAWAII: ; %bb.0: ; %entry156; HAWAII-NEXT: s_add_i32 s6, s6, s9157; HAWAII-NEXT: s_lshr_b32 flat_scratch_hi, s6, 8158; HAWAII-NEXT: s_add_u32 s0, s0, s9159; HAWAII-NEXT: s_addc_u32 s1, s1, 0160; HAWAII-NEXT: s_mov_b32 flat_scratch_lo, s7161; HAWAII-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0162; HAWAII-NEXT: s_getpc_b64 s[6:7]163; HAWAII-NEXT: s_add_u32 s6, s6, i32_fastcc_i32_i32@gotpcrel32@lo+4164; HAWAII-NEXT: s_addc_u32 s7, s7, i32_fastcc_i32_i32@gotpcrel32@hi+12165; HAWAII-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0166; HAWAII-NEXT: s_mov_b32 s32, 0167; HAWAII-NEXT: s_waitcnt lgkmcnt(0)168; HAWAII-NEXT: v_mov_b32_e32 v0, s4169; HAWAII-NEXT: v_mov_b32_e32 v1, s5170; HAWAII-NEXT: s_swappc_b64 s[30:31], s[6:7]171; HAWAII-NEXT: s_endpgm172;173; GFX9-LABEL: kernel_call_i32_fastcc_i32_i32_unused_result:174; GFX9: ; %bb.0: ; %entry175; GFX9-NEXT: s_add_u32 flat_scratch_lo, s6, s9176; GFX9-NEXT: s_addc_u32 flat_scratch_hi, s7, 0177; GFX9-NEXT: s_add_u32 s0, s0, s9178; GFX9-NEXT: s_addc_u32 s1, s1, 0179; GFX9-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0180; GFX9-NEXT: s_getpc_b64 s[6:7]181; GFX9-NEXT: s_add_u32 s6, s6, i32_fastcc_i32_i32@gotpcrel32@lo+4182; GFX9-NEXT: s_addc_u32 s7, s7, i32_fastcc_i32_i32@gotpcrel32@hi+12183; GFX9-NEXT: s_load_dwordx2 s[6:7], s[6:7], 0x0184; GFX9-NEXT: s_mov_b32 s32, 0185; GFX9-NEXT: s_waitcnt lgkmcnt(0)186; GFX9-NEXT: v_mov_b32_e32 v0, s4187; GFX9-NEXT: v_mov_b32_e32 v1, s5188; GFX9-NEXT: s_swappc_b64 s[30:31], s[6:7]189; GFX9-NEXT: s_endpgm190entry:191 %ret = tail call fastcc i32 @i32_fastcc_i32_i32(i32 %a, i32 %b)192 ret void193}194 195define hidden fastcc i32 @i32_fastcc_i32_byval_i32(i32 %arg0, ptr addrspace(5) byval(i32) align 4 %arg1) #1 {196; FIJI-LABEL: i32_fastcc_i32_byval_i32:197; FIJI: ; %bb.0:198; FIJI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)199; FIJI-NEXT: buffer_load_dword v1, off, s[0:3], s32200; FIJI-NEXT: s_waitcnt vmcnt(0)201; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v1202; FIJI-NEXT: s_setpc_b64 s[30:31]203;204; HAWAII-LABEL: i32_fastcc_i32_byval_i32:205; HAWAII: ; %bb.0:206; HAWAII-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)207; HAWAII-NEXT: buffer_load_dword v1, off, s[0:3], s32208; HAWAII-NEXT: s_waitcnt vmcnt(0)209; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v1210; HAWAII-NEXT: s_setpc_b64 s[30:31]211;212; GFX9-LABEL: i32_fastcc_i32_byval_i32:213; GFX9: ; %bb.0:214; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)215; GFX9-NEXT: buffer_load_dword v1, off, s[0:3], s32216; GFX9-NEXT: s_waitcnt vmcnt(0)217; GFX9-NEXT: v_add_u32_e32 v0, v0, v1218; GFX9-NEXT: s_setpc_b64 s[30:31]219 %arg1.load = load i32, ptr addrspace(5) %arg1, align 4220 %add0 = add i32 %arg0, %arg1.load221 ret i32 %add0222}223 224; Tail call disallowed with byval in parent.225define fastcc i32 @sibling_call_i32_fastcc_i32_byval_i32_byval_parent(i32 %a, ptr addrspace(5) byval(i32) %b.byval, i32 %c) #1 {226; GCN-LABEL: sibling_call_i32_fastcc_i32_byval_i32_byval_parent:227; GCN: ; %bb.0: ; %entry228; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)229; GCN-NEXT: s_mov_b32 s4, s33230; GCN-NEXT: s_mov_b32 s33, s32231; GCN-NEXT: s_or_saveexec_b64 s[6:7], -1232; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill233; GCN-NEXT: s_mov_b64 exec, s[6:7]234; GCN-NEXT: buffer_load_dword v1, off, s[0:3], s33235; GCN-NEXT: v_writelane_b32 v40, s4, 2236; GCN-NEXT: s_addk_i32 s32, 0x400237; GCN-NEXT: v_writelane_b32 v40, s30, 0238; GCN-NEXT: s_getpc_b64 s[4:5]239; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_byval_i32@rel32@lo+4240; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_byval_i32@rel32@hi+12241; GCN-NEXT: v_writelane_b32 v40, s31, 1242; GCN-NEXT: s_waitcnt vmcnt(0)243; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32244; GCN-NEXT: s_swappc_b64 s[30:31], s[4:5]245; GCN-NEXT: v_readlane_b32 s31, v40, 1246; GCN-NEXT: v_readlane_b32 s30, v40, 0247; GCN-NEXT: s_mov_b32 s32, s33248; GCN-NEXT: v_readlane_b32 s4, v40, 2249; GCN-NEXT: s_or_saveexec_b64 s[6:7], -1250; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload251; GCN-NEXT: s_mov_b64 exec, s[6:7]252; GCN-NEXT: s_mov_b32 s33, s4253; GCN-NEXT: s_waitcnt vmcnt(0)254; GCN-NEXT: s_setpc_b64 s[30:31]255entry:256 %ret = tail call fastcc i32 @i32_fastcc_i32_byval_i32(i32 %a, ptr addrspace(5) byval(i32) %b.byval)257 ret i32 %ret258}259 260; Tail call disallowed with byval in parent, not callee. The stack261; usage of incoming arguments must be <= the outgoing stack262; arguments.263define fastcc i32 @sibling_call_i32_fastcc_i32_byval_i32(i32 %a, [32 x i32] %large) #1 {264; GCN-LABEL: sibling_call_i32_fastcc_i32_byval_i32:265; GCN: ; %bb.0: ; %entry266; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GCN-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:16268; GCN-NEXT: s_getpc_b64 s[4:5]269; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_byval_i32@rel32@lo+4270; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_byval_i32@rel32@hi+12271; GCN-NEXT: s_waitcnt vmcnt(0)272; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32273; GCN-NEXT: s_setpc_b64 s[4:5]274entry:275 %ret = tail call fastcc i32 @i32_fastcc_i32_byval_i32(i32 %a, ptr addrspace(5) byval(i32) inttoptr (i32 16 to ptr addrspace(5)))276 ret i32 %ret277}278 279define fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %arg0, i32 %arg1, [32 x i32] %large) #1 {280; FIJI-LABEL: i32_fastcc_i32_i32_a32i32:281; FIJI: ; %bb.0:282; FIJI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)283; FIJI-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:4284; FIJI-NEXT: buffer_load_dword v3, off, s[0:3], s32 offset:8285; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v1286; FIJI-NEXT: s_waitcnt vmcnt(1)287; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v2288; FIJI-NEXT: s_waitcnt vmcnt(0)289; FIJI-NEXT: v_add_u32_e32 v0, vcc, v0, v3290; FIJI-NEXT: s_setpc_b64 s[30:31]291;292; HAWAII-LABEL: i32_fastcc_i32_i32_a32i32:293; HAWAII: ; %bb.0:294; HAWAII-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)295; HAWAII-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:4296; HAWAII-NEXT: buffer_load_dword v3, off, s[0:3], s32 offset:8297; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v1298; HAWAII-NEXT: s_waitcnt vmcnt(1)299; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v2300; HAWAII-NEXT: s_waitcnt vmcnt(0)301; HAWAII-NEXT: v_add_i32_e32 v0, vcc, v0, v3302; HAWAII-NEXT: s_setpc_b64 s[30:31]303;304; GFX9-LABEL: i32_fastcc_i32_i32_a32i32:305; GFX9: ; %bb.0:306; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)307; GFX9-NEXT: buffer_load_dword v2, off, s[0:3], s32 offset:8308; GFX9-NEXT: buffer_load_dword v3, off, s[0:3], s32 offset:4309; GFX9-NEXT: v_add_u32_e32 v0, v0, v1310; GFX9-NEXT: s_waitcnt vmcnt(0)311; GFX9-NEXT: v_add3_u32 v0, v0, v3, v2312; GFX9-NEXT: s_setpc_b64 s[30:31]313 %val_firststack = extractvalue [32 x i32] %large, 30314 %val_laststack = extractvalue [32 x i32] %large, 31315 %add0 = add i32 %arg0, %arg1316 %add1 = add i32 %add0, %val_firststack317 %add2 = add i32 %add1, %val_laststack318 ret i32 %add2319}320 321; FIXME: Why load and store same location for stack args?322define fastcc i32 @sibling_call_i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] %c) #1 {323; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_a32i32:324; GCN: ; %bb.0: ; %entry325; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)326; GCN-NEXT: buffer_load_dword v31, off, s[0:3], s32327; GCN-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:4328; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:8329; GCN-NEXT: s_getpc_b64 s[4:5]330; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_a32i32@gotpcrel32@lo+4331; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_a32i32@gotpcrel32@hi+12332; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0333; GCN-NEXT: s_waitcnt vmcnt(2)334; GCN-NEXT: buffer_store_dword v31, off, s[0:3], s32335; GCN-NEXT: s_waitcnt vmcnt(2)336; GCN-NEXT: buffer_store_dword v32, off, s[0:3], s32 offset:4337; GCN-NEXT: s_waitcnt vmcnt(2)338; GCN-NEXT: buffer_store_dword v33, off, s[0:3], s32 offset:8339; GCN-NEXT: s_waitcnt lgkmcnt(0)340; GCN-NEXT: s_setpc_b64 s[4:5]341entry:342 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] %c)343 ret i32 %ret344}345 346define fastcc i32 @sibling_call_i32_fastcc_i32_i32_a32i32_stack_object(i32 %a, i32 %b, [32 x i32] %c) #1 {347; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_a32i32_stack_object:348; GCN: ; %bb.0: ; %entry349; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)350; GCN-NEXT: buffer_load_dword v31, off, s[0:3], s32351; GCN-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:4352; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:8353; GCN-NEXT: s_getpc_b64 s[4:5]354; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_a32i32@gotpcrel32@lo+4355; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_a32i32@gotpcrel32@hi+12356; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0357; GCN-NEXT: v_mov_b32_e32 v34, 9358; GCN-NEXT: buffer_store_dword v34, off, s[0:3], s32 offset:32359; GCN-NEXT: s_waitcnt vmcnt(0)360; GCN-NEXT: buffer_store_dword v31, off, s[0:3], s32361; GCN-NEXT: buffer_store_dword v32, off, s[0:3], s32 offset:4362; GCN-NEXT: buffer_store_dword v33, off, s[0:3], s32 offset:8363; GCN-NEXT: s_waitcnt lgkmcnt(0)364; GCN-NEXT: s_setpc_b64 s[4:5]365entry:366 %alloca = alloca [16 x i32], align 4, addrspace(5)367 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 5368 store volatile i32 9, ptr addrspace(5) %gep369 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] %c)370 ret i32 %ret371}372 373; If the callee requires more stack argument space than the caller,374; don't do a tail call.375; TODO: Do we really need this restriction?376define fastcc i32 @no_sibling_call_callee_more_stack_space(i32 %a, i32 %b) #1 {377; GCN-LABEL: no_sibling_call_callee_more_stack_space:378; GCN: ; %bb.0: ; %entry379; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)380; GCN-NEXT: s_mov_b32 s4, s33381; GCN-NEXT: s_mov_b32 s33, s32382; GCN-NEXT: s_or_saveexec_b64 s[6:7], -1383; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill384; GCN-NEXT: s_mov_b64 exec, s[6:7]385; GCN-NEXT: s_addk_i32 s32, 0x400386; GCN-NEXT: v_writelane_b32 v40, s4, 2387; GCN-NEXT: s_getpc_b64 s[4:5]388; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_a32i32@gotpcrel32@lo+4389; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_a32i32@gotpcrel32@hi+12390; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0391; GCN-NEXT: v_mov_b32_e32 v2, 0392; GCN-NEXT: v_writelane_b32 v40, s30, 0393; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32394; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:4395; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:8396; GCN-NEXT: v_mov_b32_e32 v2, 0397; GCN-NEXT: v_mov_b32_e32 v3, 0398; GCN-NEXT: v_mov_b32_e32 v4, 0399; GCN-NEXT: v_mov_b32_e32 v5, 0400; GCN-NEXT: v_mov_b32_e32 v6, 0401; GCN-NEXT: v_mov_b32_e32 v7, 0402; GCN-NEXT: v_mov_b32_e32 v8, 0403; GCN-NEXT: v_mov_b32_e32 v9, 0404; GCN-NEXT: v_mov_b32_e32 v10, 0405; GCN-NEXT: v_mov_b32_e32 v11, 0406; GCN-NEXT: v_mov_b32_e32 v12, 0407; GCN-NEXT: v_mov_b32_e32 v13, 0408; GCN-NEXT: v_mov_b32_e32 v14, 0409; GCN-NEXT: v_mov_b32_e32 v15, 0410; GCN-NEXT: v_mov_b32_e32 v16, 0411; GCN-NEXT: v_mov_b32_e32 v17, 0412; GCN-NEXT: v_mov_b32_e32 v18, 0413; GCN-NEXT: v_mov_b32_e32 v19, 0414; GCN-NEXT: v_mov_b32_e32 v20, 0415; GCN-NEXT: v_mov_b32_e32 v21, 0416; GCN-NEXT: v_mov_b32_e32 v22, 0417; GCN-NEXT: v_mov_b32_e32 v23, 0418; GCN-NEXT: v_mov_b32_e32 v24, 0419; GCN-NEXT: v_mov_b32_e32 v25, 0420; GCN-NEXT: v_mov_b32_e32 v26, 0421; GCN-NEXT: v_mov_b32_e32 v27, 0422; GCN-NEXT: v_mov_b32_e32 v28, 0423; GCN-NEXT: v_mov_b32_e32 v29, 0424; GCN-NEXT: v_mov_b32_e32 v30, 0425; GCN-NEXT: v_writelane_b32 v40, s31, 1426; GCN-NEXT: s_waitcnt lgkmcnt(0)427; GCN-NEXT: s_swappc_b64 s[30:31], s[4:5]428; GCN-NEXT: v_readlane_b32 s31, v40, 1429; GCN-NEXT: v_readlane_b32 s30, v40, 0430; GCN-NEXT: s_mov_b32 s32, s33431; GCN-NEXT: v_readlane_b32 s4, v40, 2432; GCN-NEXT: s_or_saveexec_b64 s[6:7], -1433; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload434; GCN-NEXT: s_mov_b64 exec, s[6:7]435; GCN-NEXT: s_mov_b32 s33, s4436; GCN-NEXT: s_waitcnt vmcnt(0)437; GCN-NEXT: s_setpc_b64 s[30:31]438entry:439 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] zeroinitializer)440 ret i32 %ret441}442 443; Have another non-tail in the function444define fastcc i32 @sibling_call_i32_fastcc_i32_i32_other_call(i32 %a, i32 %b, i32 %c) #1 {445; GCN-LABEL: sibling_call_i32_fastcc_i32_i32_other_call:446; GCN: ; %bb.0: ; %entry447; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)448; GCN-NEXT: s_mov_b32 s4, s33449; GCN-NEXT: s_mov_b32 s33, s32450; GCN-NEXT: s_or_saveexec_b64 s[6:7], -1451; GCN-NEXT: buffer_store_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill452; GCN-NEXT: s_mov_b64 exec, s[6:7]453; GCN-NEXT: s_addk_i32 s32, 0x400454; GCN-NEXT: v_writelane_b32 v42, s4, 2455; GCN-NEXT: s_getpc_b64 s[4:5]456; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32@gotpcrel32@lo+4457; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32@gotpcrel32@hi+12458; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0459; GCN-NEXT: v_writelane_b32 v42, s30, 0460; GCN-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill461; GCN-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill462; GCN-NEXT: v_writelane_b32 v42, s31, 1463; GCN-NEXT: v_mov_b32_e32 v40, v1464; GCN-NEXT: v_mov_b32_e32 v41, v0465; GCN-NEXT: s_waitcnt lgkmcnt(0)466; GCN-NEXT: s_swappc_b64 s[30:31], s[4:5]467; GCN-NEXT: v_mov_b32_e32 v2, v0468; GCN-NEXT: v_mov_b32_e32 v0, v41469; GCN-NEXT: v_mov_b32_e32 v1, v40470; GCN-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload471; GCN-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload472; GCN-NEXT: s_getpc_b64 s[4:5]473; GCN-NEXT: s_add_u32 s4, s4, sibling_call_i32_fastcc_i32_i32@rel32@lo+4474; GCN-NEXT: s_addc_u32 s5, s5, sibling_call_i32_fastcc_i32_i32@rel32@hi+12475; GCN-NEXT: v_readlane_b32 s31, v42, 1476; GCN-NEXT: v_readlane_b32 s30, v42, 0477; GCN-NEXT: s_mov_b32 s32, s33478; GCN-NEXT: v_readlane_b32 s6, v42, 2479; GCN-NEXT: s_or_saveexec_b64 s[8:9], -1480; GCN-NEXT: buffer_load_dword v42, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload481; GCN-NEXT: s_mov_b64 exec, s[8:9]482; GCN-NEXT: s_mov_b32 s33, s6483; GCN-NEXT: s_setpc_b64 s[4:5]484entry:485 %other.call = tail call fastcc i32 @i32_fastcc_i32_i32(i32 %a, i32 %b)486 %ret = tail call fastcc i32 @sibling_call_i32_fastcc_i32_i32(i32 %a, i32 %b, i32 %other.call)487 ret i32 %ret488}489 490; Have stack object in caller and stack passed arguments. SP should be491; in same place at function exit.492define fastcc i32 @sibling_call_stack_objecti32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] %c) #1 {493; GCN-LABEL: sibling_call_stack_objecti32_fastcc_i32_i32_a32i32:494; GCN: ; %bb.0: ; %entry495; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)496; GCN-NEXT: buffer_load_dword v31, off, s[0:3], s32497; GCN-NEXT: buffer_load_dword v32, off, s[0:3], s32 offset:4498; GCN-NEXT: buffer_load_dword v33, off, s[0:3], s32 offset:8499; GCN-NEXT: s_getpc_b64 s[4:5]500; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_a32i32@gotpcrel32@lo+4501; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_a32i32@gotpcrel32@hi+12502; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0503; GCN-NEXT: v_mov_b32_e32 v34, 9504; GCN-NEXT: buffer_store_dword v34, off, s[0:3], s32 offset:32505; GCN-NEXT: s_waitcnt vmcnt(0)506; GCN-NEXT: buffer_store_dword v31, off, s[0:3], s32507; GCN-NEXT: buffer_store_dword v32, off, s[0:3], s32 offset:4508; GCN-NEXT: buffer_store_dword v33, off, s[0:3], s32 offset:8509; GCN-NEXT: s_waitcnt lgkmcnt(0)510; GCN-NEXT: s_setpc_b64 s[4:5]511entry:512 %alloca = alloca [16 x i32], align 4, addrspace(5)513 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 5514 store volatile i32 9, ptr addrspace(5) %gep515 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] %c)516 ret i32 %ret517}518 519define fastcc i32 @sibling_call_stack_objecti32_fastcc_i32_i32_a32i32_larger_arg_area(i32 %a, i32 %b, [36 x i32] %c) #1 {520; GCN-LABEL: sibling_call_stack_objecti32_fastcc_i32_i32_a32i32_larger_arg_area:521; GCN: ; %bb.0: ; %entry522; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)523; GCN-NEXT: s_getpc_b64 s[4:5]524; GCN-NEXT: s_add_u32 s4, s4, i32_fastcc_i32_i32_a32i32@gotpcrel32@lo+4525; GCN-NEXT: s_addc_u32 s5, s5, i32_fastcc_i32_i32_a32i32@gotpcrel32@hi+12526; GCN-NEXT: s_load_dwordx2 s[4:5], s[4:5], 0x0527; GCN-NEXT: v_mov_b32_e32 v2, 9528; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:48529; GCN-NEXT: s_waitcnt vmcnt(0)530; GCN-NEXT: v_mov_b32_e32 v2, 0531; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32532; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:4533; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:8534; GCN-NEXT: v_mov_b32_e32 v2, 0535; GCN-NEXT: v_mov_b32_e32 v3, 0536; GCN-NEXT: v_mov_b32_e32 v4, 0537; GCN-NEXT: v_mov_b32_e32 v5, 0538; GCN-NEXT: v_mov_b32_e32 v6, 0539; GCN-NEXT: v_mov_b32_e32 v7, 0540; GCN-NEXT: v_mov_b32_e32 v8, 0541; GCN-NEXT: v_mov_b32_e32 v9, 0542; GCN-NEXT: v_mov_b32_e32 v10, 0543; GCN-NEXT: v_mov_b32_e32 v11, 0544; GCN-NEXT: v_mov_b32_e32 v12, 0545; GCN-NEXT: v_mov_b32_e32 v13, 0546; GCN-NEXT: v_mov_b32_e32 v14, 0547; GCN-NEXT: v_mov_b32_e32 v15, 0548; GCN-NEXT: v_mov_b32_e32 v16, 0549; GCN-NEXT: v_mov_b32_e32 v17, 0550; GCN-NEXT: v_mov_b32_e32 v18, 0551; GCN-NEXT: v_mov_b32_e32 v19, 0552; GCN-NEXT: v_mov_b32_e32 v20, 0553; GCN-NEXT: v_mov_b32_e32 v21, 0554; GCN-NEXT: v_mov_b32_e32 v22, 0555; GCN-NEXT: v_mov_b32_e32 v23, 0556; GCN-NEXT: v_mov_b32_e32 v24, 0557; GCN-NEXT: v_mov_b32_e32 v25, 0558; GCN-NEXT: v_mov_b32_e32 v26, 0559; GCN-NEXT: v_mov_b32_e32 v27, 0560; GCN-NEXT: v_mov_b32_e32 v28, 0561; GCN-NEXT: v_mov_b32_e32 v29, 0562; GCN-NEXT: v_mov_b32_e32 v30, 0563; GCN-NEXT: s_waitcnt lgkmcnt(0)564; GCN-NEXT: s_setpc_b64 s[4:5]565entry:566 %alloca = alloca [16 x i32], align 4, addrspace(5)567 %gep = getelementptr inbounds [16 x i32], ptr addrspace(5) %alloca, i32 0, i32 5568 store volatile i32 9, ptr addrspace(5) %gep569 %ret = tail call fastcc i32 @i32_fastcc_i32_i32_a32i32(i32 %a, i32 %b, [32 x i32] zeroinitializer)570 ret i32 %ret571}572 573@func_ptr_gv = external unnamed_addr addrspace(4) constant ptr, align 4574 575; Do support tail calls with a uniform, but unknown, callee.576define hidden fastcc i32 @indirect_uniform_sibling_call_i32_fastcc_i32_i32(i32 %a, i32 %b, i32 %c) #1 {577; GCN-LABEL: indirect_uniform_sibling_call_i32_fastcc_i32_i32:578; GCN: ; %bb.0: ; %entry579; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)580; GCN-NEXT: s_getpc_b64 s[16:17]581; GCN-NEXT: s_add_u32 s16, s16, func_ptr_gv@gotpcrel32@lo+4582; GCN-NEXT: s_addc_u32 s17, s17, func_ptr_gv@gotpcrel32@hi+12583; GCN-NEXT: s_load_dwordx2 s[16:17], s[16:17], 0x0584; GCN-NEXT: s_waitcnt lgkmcnt(0)585; GCN-NEXT: s_load_dwordx2 s[16:17], s[16:17], 0x0586; GCN-NEXT: s_waitcnt lgkmcnt(0)587; GCN-NEXT: s_setpc_b64 s[16:17]588entry:589 %func.ptr.load = load ptr, ptr addrspace(4) @func_ptr_gv590 %ret = tail call fastcc i32 %func.ptr.load(i32 %a, i32 %b)591 ret i32 %ret592}593 594; We can't support a tail call to a divergent target. Use a waterfall595; loop around a regular call596define hidden fastcc i32 @indirect_divergent_sibling_call_i32_fastcc_i32_i32(ptr %func.ptr, i32 %a, i32 %b, i32 %c) #1 {597; FIJI-LABEL: indirect_divergent_sibling_call_i32_fastcc_i32_i32:598; FIJI: ; %bb.0: ; %entry599; FIJI-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)600; FIJI-NEXT: s_mov_b32 s16, s33601; FIJI-NEXT: s_mov_b32 s33, s32602; FIJI-NEXT: s_or_saveexec_b64 s[18:19], -1603; FIJI-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill604; FIJI-NEXT: s_mov_b64 exec, s[18:19]605; FIJI-NEXT: v_writelane_b32 v40, s16, 18606; FIJI-NEXT: v_writelane_b32 v40, s30, 0607; FIJI-NEXT: v_writelane_b32 v40, s31, 1608; FIJI-NEXT: v_writelane_b32 v40, s34, 2609; FIJI-NEXT: v_writelane_b32 v40, s35, 3610; FIJI-NEXT: v_writelane_b32 v40, s36, 4611; FIJI-NEXT: v_writelane_b32 v40, s37, 5612; FIJI-NEXT: v_writelane_b32 v40, s38, 6613; FIJI-NEXT: v_writelane_b32 v40, s39, 7614; FIJI-NEXT: v_writelane_b32 v40, s48, 8615; FIJI-NEXT: v_writelane_b32 v40, s49, 9616; FIJI-NEXT: v_writelane_b32 v40, s50, 10617; FIJI-NEXT: v_writelane_b32 v40, s51, 11618; FIJI-NEXT: v_writelane_b32 v40, s52, 12619; FIJI-NEXT: v_writelane_b32 v40, s53, 13620; FIJI-NEXT: v_writelane_b32 v40, s54, 14621; FIJI-NEXT: v_writelane_b32 v40, s55, 15622; FIJI-NEXT: v_writelane_b32 v40, s64, 16623; FIJI-NEXT: s_mov_b32 s50, s15624; FIJI-NEXT: s_mov_b32 s51, s14625; FIJI-NEXT: s_mov_b32 s52, s13626; FIJI-NEXT: s_mov_b32 s53, s12627; FIJI-NEXT: s_mov_b64 s[34:35], s[10:11]628; FIJI-NEXT: s_mov_b64 s[36:37], s[8:9]629; FIJI-NEXT: s_mov_b64 s[38:39], s[6:7]630; FIJI-NEXT: s_mov_b64 s[48:49], s[4:5]631; FIJI-NEXT: v_add_u32_e32 v3, vcc, v3, v4632; FIJI-NEXT: s_mov_b64 s[54:55], exec633; FIJI-NEXT: s_addk_i32 s32, 0x400634; FIJI-NEXT: v_writelane_b32 v40, s65, 17635; FIJI-NEXT: .LBB18_1: ; =>This Inner Loop Header: Depth=1636; FIJI-NEXT: v_readfirstlane_b32 s16, v0637; FIJI-NEXT: v_readfirstlane_b32 s17, v1638; FIJI-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1]639; FIJI-NEXT: s_and_saveexec_b64 s[64:65], vcc640; FIJI-NEXT: s_mov_b64 s[4:5], s[48:49]641; FIJI-NEXT: s_mov_b64 s[6:7], s[38:39]642; FIJI-NEXT: s_mov_b64 s[8:9], s[36:37]643; FIJI-NEXT: s_mov_b64 s[10:11], s[34:35]644; FIJI-NEXT: s_mov_b32 s12, s53645; FIJI-NEXT: s_mov_b32 s13, s52646; FIJI-NEXT: s_mov_b32 s14, s51647; FIJI-NEXT: s_mov_b32 s15, s50648; FIJI-NEXT: v_mov_b32_e32 v0, v2649; FIJI-NEXT: v_mov_b32_e32 v1, v3650; FIJI-NEXT: s_swappc_b64 s[30:31], s[16:17]651; FIJI-NEXT: v_mov_b32_e32 v4, v0652; FIJI-NEXT: ; implicit-def: $vgpr0_vgpr1653; FIJI-NEXT: ; implicit-def: $vgpr31654; FIJI-NEXT: ; implicit-def: $vgpr2655; FIJI-NEXT: ; implicit-def: $vgpr3656; FIJI-NEXT: s_xor_b64 exec, exec, s[64:65]657; FIJI-NEXT: s_cbranch_execnz .LBB18_1658; FIJI-NEXT: ; %bb.2:659; FIJI-NEXT: s_mov_b64 exec, s[54:55]660; FIJI-NEXT: v_mov_b32_e32 v0, v4661; FIJI-NEXT: v_readlane_b32 s65, v40, 17662; FIJI-NEXT: v_readlane_b32 s64, v40, 16663; FIJI-NEXT: v_readlane_b32 s55, v40, 15664; FIJI-NEXT: v_readlane_b32 s54, v40, 14665; FIJI-NEXT: v_readlane_b32 s53, v40, 13666; FIJI-NEXT: v_readlane_b32 s52, v40, 12667; FIJI-NEXT: v_readlane_b32 s51, v40, 11668; FIJI-NEXT: v_readlane_b32 s50, v40, 10669; FIJI-NEXT: v_readlane_b32 s49, v40, 9670; FIJI-NEXT: v_readlane_b32 s48, v40, 8671; FIJI-NEXT: v_readlane_b32 s39, v40, 7672; FIJI-NEXT: v_readlane_b32 s38, v40, 6673; FIJI-NEXT: v_readlane_b32 s37, v40, 5674; FIJI-NEXT: v_readlane_b32 s36, v40, 4675; FIJI-NEXT: v_readlane_b32 s35, v40, 3676; FIJI-NEXT: v_readlane_b32 s34, v40, 2677; FIJI-NEXT: v_readlane_b32 s31, v40, 1678; FIJI-NEXT: v_readlane_b32 s30, v40, 0679; FIJI-NEXT: s_mov_b32 s32, s33680; FIJI-NEXT: v_readlane_b32 s4, v40, 18681; FIJI-NEXT: s_or_saveexec_b64 s[6:7], -1682; FIJI-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload683; FIJI-NEXT: s_mov_b64 exec, s[6:7]684; FIJI-NEXT: s_mov_b32 s33, s4685; FIJI-NEXT: s_waitcnt vmcnt(0)686; FIJI-NEXT: s_setpc_b64 s[30:31]687;688; HAWAII-LABEL: indirect_divergent_sibling_call_i32_fastcc_i32_i32:689; HAWAII: ; %bb.0: ; %entry690; HAWAII-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)691; HAWAII-NEXT: s_mov_b32 s16, s33692; HAWAII-NEXT: s_mov_b32 s33, s32693; HAWAII-NEXT: s_or_saveexec_b64 s[18:19], -1694; HAWAII-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill695; HAWAII-NEXT: s_mov_b64 exec, s[18:19]696; HAWAII-NEXT: v_writelane_b32 v40, s16, 18697; HAWAII-NEXT: v_writelane_b32 v40, s30, 0698; HAWAII-NEXT: v_writelane_b32 v40, s31, 1699; HAWAII-NEXT: v_writelane_b32 v40, s34, 2700; HAWAII-NEXT: v_writelane_b32 v40, s35, 3701; HAWAII-NEXT: v_writelane_b32 v40, s36, 4702; HAWAII-NEXT: v_writelane_b32 v40, s37, 5703; HAWAII-NEXT: v_writelane_b32 v40, s38, 6704; HAWAII-NEXT: v_writelane_b32 v40, s39, 7705; HAWAII-NEXT: v_writelane_b32 v40, s48, 8706; HAWAII-NEXT: v_writelane_b32 v40, s49, 9707; HAWAII-NEXT: v_writelane_b32 v40, s50, 10708; HAWAII-NEXT: v_writelane_b32 v40, s51, 11709; HAWAII-NEXT: v_writelane_b32 v40, s52, 12710; HAWAII-NEXT: v_writelane_b32 v40, s53, 13711; HAWAII-NEXT: v_writelane_b32 v40, s54, 14712; HAWAII-NEXT: v_writelane_b32 v40, s55, 15713; HAWAII-NEXT: v_writelane_b32 v40, s64, 16714; HAWAII-NEXT: s_mov_b32 s50, s15715; HAWAII-NEXT: s_mov_b32 s51, s14716; HAWAII-NEXT: s_mov_b32 s52, s13717; HAWAII-NEXT: s_mov_b32 s53, s12718; HAWAII-NEXT: s_mov_b64 s[34:35], s[10:11]719; HAWAII-NEXT: s_mov_b64 s[36:37], s[8:9]720; HAWAII-NEXT: s_mov_b64 s[38:39], s[6:7]721; HAWAII-NEXT: s_mov_b64 s[48:49], s[4:5]722; HAWAII-NEXT: v_add_i32_e32 v3, vcc, v3, v4723; HAWAII-NEXT: s_mov_b64 s[54:55], exec724; HAWAII-NEXT: s_addk_i32 s32, 0x400725; HAWAII-NEXT: v_writelane_b32 v40, s65, 17726; HAWAII-NEXT: .LBB18_1: ; =>This Inner Loop Header: Depth=1727; HAWAII-NEXT: v_readfirstlane_b32 s16, v0728; HAWAII-NEXT: v_readfirstlane_b32 s17, v1729; HAWAII-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1]730; HAWAII-NEXT: s_and_saveexec_b64 s[64:65], vcc731; HAWAII-NEXT: s_mov_b64 s[4:5], s[48:49]732; HAWAII-NEXT: s_mov_b64 s[6:7], s[38:39]733; HAWAII-NEXT: s_mov_b64 s[8:9], s[36:37]734; HAWAII-NEXT: s_mov_b64 s[10:11], s[34:35]735; HAWAII-NEXT: s_mov_b32 s12, s53736; HAWAII-NEXT: s_mov_b32 s13, s52737; HAWAII-NEXT: s_mov_b32 s14, s51738; HAWAII-NEXT: s_mov_b32 s15, s50739; HAWAII-NEXT: v_mov_b32_e32 v0, v2740; HAWAII-NEXT: v_mov_b32_e32 v1, v3741; HAWAII-NEXT: s_swappc_b64 s[30:31], s[16:17]742; HAWAII-NEXT: v_mov_b32_e32 v4, v0743; HAWAII-NEXT: ; implicit-def: $vgpr0_vgpr1744; HAWAII-NEXT: ; implicit-def: $vgpr31745; HAWAII-NEXT: ; implicit-def: $vgpr2746; HAWAII-NEXT: ; implicit-def: $vgpr3747; HAWAII-NEXT: s_xor_b64 exec, exec, s[64:65]748; HAWAII-NEXT: s_cbranch_execnz .LBB18_1749; HAWAII-NEXT: ; %bb.2:750; HAWAII-NEXT: s_mov_b64 exec, s[54:55]751; HAWAII-NEXT: v_mov_b32_e32 v0, v4752; HAWAII-NEXT: v_readlane_b32 s65, v40, 17753; HAWAII-NEXT: v_readlane_b32 s64, v40, 16754; HAWAII-NEXT: v_readlane_b32 s55, v40, 15755; HAWAII-NEXT: v_readlane_b32 s54, v40, 14756; HAWAII-NEXT: v_readlane_b32 s53, v40, 13757; HAWAII-NEXT: v_readlane_b32 s52, v40, 12758; HAWAII-NEXT: v_readlane_b32 s51, v40, 11759; HAWAII-NEXT: v_readlane_b32 s50, v40, 10760; HAWAII-NEXT: v_readlane_b32 s49, v40, 9761; HAWAII-NEXT: v_readlane_b32 s48, v40, 8762; HAWAII-NEXT: v_readlane_b32 s39, v40, 7763; HAWAII-NEXT: v_readlane_b32 s38, v40, 6764; HAWAII-NEXT: v_readlane_b32 s37, v40, 5765; HAWAII-NEXT: v_readlane_b32 s36, v40, 4766; HAWAII-NEXT: v_readlane_b32 s35, v40, 3767; HAWAII-NEXT: v_readlane_b32 s34, v40, 2768; HAWAII-NEXT: v_readlane_b32 s31, v40, 1769; HAWAII-NEXT: v_readlane_b32 s30, v40, 0770; HAWAII-NEXT: s_mov_b32 s32, s33771; HAWAII-NEXT: v_readlane_b32 s4, v40, 18772; HAWAII-NEXT: s_or_saveexec_b64 s[6:7], -1773; HAWAII-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload774; HAWAII-NEXT: s_mov_b64 exec, s[6:7]775; HAWAII-NEXT: s_mov_b32 s33, s4776; HAWAII-NEXT: s_waitcnt vmcnt(0)777; HAWAII-NEXT: s_setpc_b64 s[30:31]778;779; GFX9-LABEL: indirect_divergent_sibling_call_i32_fastcc_i32_i32:780; GFX9: ; %bb.0: ; %entry781; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)782; GFX9-NEXT: s_mov_b32 s16, s33783; GFX9-NEXT: s_mov_b32 s33, s32784; GFX9-NEXT: s_or_saveexec_b64 s[18:19], -1785; GFX9-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill786; GFX9-NEXT: s_mov_b64 exec, s[18:19]787; GFX9-NEXT: v_writelane_b32 v40, s16, 18788; GFX9-NEXT: v_writelane_b32 v40, s30, 0789; GFX9-NEXT: v_writelane_b32 v40, s31, 1790; GFX9-NEXT: v_writelane_b32 v40, s34, 2791; GFX9-NEXT: v_writelane_b32 v40, s35, 3792; GFX9-NEXT: v_writelane_b32 v40, s36, 4793; GFX9-NEXT: v_writelane_b32 v40, s37, 5794; GFX9-NEXT: v_writelane_b32 v40, s38, 6795; GFX9-NEXT: v_writelane_b32 v40, s39, 7796; GFX9-NEXT: v_writelane_b32 v40, s48, 8797; GFX9-NEXT: v_writelane_b32 v40, s49, 9798; GFX9-NEXT: v_writelane_b32 v40, s50, 10799; GFX9-NEXT: v_writelane_b32 v40, s51, 11800; GFX9-NEXT: v_writelane_b32 v40, s52, 12801; GFX9-NEXT: v_writelane_b32 v40, s53, 13802; GFX9-NEXT: v_writelane_b32 v40, s54, 14803; GFX9-NEXT: v_writelane_b32 v40, s55, 15804; GFX9-NEXT: v_writelane_b32 v40, s64, 16805; GFX9-NEXT: s_mov_b32 s50, s15806; GFX9-NEXT: s_mov_b32 s51, s14807; GFX9-NEXT: s_mov_b32 s52, s13808; GFX9-NEXT: s_mov_b32 s53, s12809; GFX9-NEXT: s_mov_b64 s[34:35], s[10:11]810; GFX9-NEXT: s_mov_b64 s[36:37], s[8:9]811; GFX9-NEXT: s_mov_b64 s[38:39], s[6:7]812; GFX9-NEXT: s_mov_b64 s[48:49], s[4:5]813; GFX9-NEXT: v_add_u32_e32 v3, v3, v4814; GFX9-NEXT: s_mov_b64 s[54:55], exec815; GFX9-NEXT: s_addk_i32 s32, 0x400816; GFX9-NEXT: v_writelane_b32 v40, s65, 17817; GFX9-NEXT: .LBB18_1: ; =>This Inner Loop Header: Depth=1818; GFX9-NEXT: v_readfirstlane_b32 s16, v0819; GFX9-NEXT: v_readfirstlane_b32 s17, v1820; GFX9-NEXT: v_cmp_eq_u64_e32 vcc, s[16:17], v[0:1]821; GFX9-NEXT: s_and_saveexec_b64 s[64:65], vcc822; GFX9-NEXT: s_mov_b64 s[4:5], s[48:49]823; GFX9-NEXT: s_mov_b64 s[6:7], s[38:39]824; GFX9-NEXT: s_mov_b64 s[8:9], s[36:37]825; GFX9-NEXT: s_mov_b64 s[10:11], s[34:35]826; GFX9-NEXT: s_mov_b32 s12, s53827; GFX9-NEXT: s_mov_b32 s13, s52828; GFX9-NEXT: s_mov_b32 s14, s51829; GFX9-NEXT: s_mov_b32 s15, s50830; GFX9-NEXT: v_mov_b32_e32 v0, v2831; GFX9-NEXT: v_mov_b32_e32 v1, v3832; GFX9-NEXT: s_swappc_b64 s[30:31], s[16:17]833; GFX9-NEXT: v_mov_b32_e32 v4, v0834; GFX9-NEXT: ; implicit-def: $vgpr0_vgpr1835; GFX9-NEXT: ; implicit-def: $vgpr31836; GFX9-NEXT: ; implicit-def: $vgpr2837; GFX9-NEXT: ; implicit-def: $vgpr3838; GFX9-NEXT: s_xor_b64 exec, exec, s[64:65]839; GFX9-NEXT: s_cbranch_execnz .LBB18_1840; GFX9-NEXT: ; %bb.2:841; GFX9-NEXT: s_mov_b64 exec, s[54:55]842; GFX9-NEXT: v_mov_b32_e32 v0, v4843; GFX9-NEXT: v_readlane_b32 s65, v40, 17844; GFX9-NEXT: v_readlane_b32 s64, v40, 16845; GFX9-NEXT: v_readlane_b32 s55, v40, 15846; GFX9-NEXT: v_readlane_b32 s54, v40, 14847; GFX9-NEXT: v_readlane_b32 s53, v40, 13848; GFX9-NEXT: v_readlane_b32 s52, v40, 12849; GFX9-NEXT: v_readlane_b32 s51, v40, 11850; GFX9-NEXT: v_readlane_b32 s50, v40, 10851; GFX9-NEXT: v_readlane_b32 s49, v40, 9852; GFX9-NEXT: v_readlane_b32 s48, v40, 8853; GFX9-NEXT: v_readlane_b32 s39, v40, 7854; GFX9-NEXT: v_readlane_b32 s38, v40, 6855; GFX9-NEXT: v_readlane_b32 s37, v40, 5856; GFX9-NEXT: v_readlane_b32 s36, v40, 4857; GFX9-NEXT: v_readlane_b32 s35, v40, 3858; GFX9-NEXT: v_readlane_b32 s34, v40, 2859; GFX9-NEXT: v_readlane_b32 s31, v40, 1860; GFX9-NEXT: v_readlane_b32 s30, v40, 0861; GFX9-NEXT: s_mov_b32 s32, s33862; GFX9-NEXT: v_readlane_b32 s4, v40, 18863; GFX9-NEXT: s_or_saveexec_b64 s[6:7], -1864; GFX9-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload865; GFX9-NEXT: s_mov_b64 exec, s[6:7]866; GFX9-NEXT: s_mov_b32 s33, s4867; GFX9-NEXT: s_waitcnt vmcnt(0)868; GFX9-NEXT: s_setpc_b64 s[30:31]869entry:870 %add = add i32 %b, %c871 %ret = tail call fastcc i32 %func.ptr(i32 %a, i32 %add)872 ret i32 %ret873}874 875declare hidden fastcc void @void_fastcc_multi_byval(i32 %a, ptr addrspace(5) byval([3 x i32]) align 16, ptr addrspace(5) byval([2 x i64]))876 877define fastcc void @sibling_call_fastcc_multi_byval(i32 %a, [64 x i32]) #1 {878; GCN-LABEL: sibling_call_fastcc_multi_byval:879; GCN: ; %bb.0: ; %entry880; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)881; GCN-NEXT: v_mov_b32_e32 v1, 9882; GCN-NEXT: v_mov_b32_e32 v2, 0883; GCN-NEXT: s_getpc_b64 s[16:17]884; GCN-NEXT: s_add_u32 s16, s16, void_fastcc_multi_byval@rel32@lo+4885; GCN-NEXT: s_addc_u32 s17, s17, void_fastcc_multi_byval@rel32@hi+12886; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:148887; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:144888; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:152889; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:172890; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:168891; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:164892; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:160893; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:4894; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32895; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:28896; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:24897; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:20898; GCN-NEXT: buffer_store_dword v2, off, s[0:3], s32 offset:16899; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:8900; GCN-NEXT: s_setpc_b64 s[16:17]901entry:902 %alloca0 = alloca [3 x i32], align 16, addrspace(5)903 %alloca1 = alloca [2 x i64], align 8, addrspace(5)904 store [3 x i32] [i32 9, i32 9, i32 9], ptr addrspace(5) %alloca0905 store [2 x i64] zeroinitializer, ptr addrspace(5) %alloca1906 tail call fastcc void @void_fastcc_multi_byval(i32 %a, ptr addrspace(5) byval([3 x i32]) %alloca0, ptr addrspace(5) byval([2 x i64]) %alloca1)907 ret void908}909 910declare hidden fastcc void @void_fastcc_byval_and_stack_passed(ptr addrspace(5) byval([3 x i32]) align 16, [32 x i32], i32)911 912; Callee has a byval and non-byval stack passed argument913define fastcc void @sibling_call_byval_and_stack_passed(i32 %stack.out.arg, [64 x i32]) #1 {914; GCN-LABEL: sibling_call_byval_and_stack_passed:915; GCN: ; %bb.0: ; %entry916; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)917; GCN-NEXT: v_mov_b32_e32 v1, 9918; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:148919; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:144920; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:152921; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:4922; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32923; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:8924; GCN-NEXT: v_mov_b32_e32 v1, 0925; GCN-NEXT: buffer_store_dword v1, off, s[0:3], s32 offset:12926; GCN-NEXT: buffer_store_dword v0, off, s[0:3], s32 offset:16927; GCN-NEXT: s_getpc_b64 s[16:17]928; GCN-NEXT: s_add_u32 s16, s16, void_fastcc_byval_and_stack_passed@rel32@lo+4929; GCN-NEXT: s_addc_u32 s17, s17, void_fastcc_byval_and_stack_passed@rel32@hi+12930; GCN-NEXT: v_mov_b32_e32 v0, 0931; GCN-NEXT: v_mov_b32_e32 v1, 0932; GCN-NEXT: v_mov_b32_e32 v2, 0933; GCN-NEXT: v_mov_b32_e32 v3, 0934; GCN-NEXT: v_mov_b32_e32 v4, 0935; GCN-NEXT: v_mov_b32_e32 v5, 0936; GCN-NEXT: v_mov_b32_e32 v6, 0937; GCN-NEXT: v_mov_b32_e32 v7, 0938; GCN-NEXT: v_mov_b32_e32 v8, 0939; GCN-NEXT: v_mov_b32_e32 v9, 0940; GCN-NEXT: v_mov_b32_e32 v10, 0941; GCN-NEXT: v_mov_b32_e32 v11, 0942; GCN-NEXT: v_mov_b32_e32 v12, 0943; GCN-NEXT: v_mov_b32_e32 v13, 0944; GCN-NEXT: v_mov_b32_e32 v14, 0945; GCN-NEXT: v_mov_b32_e32 v15, 0946; GCN-NEXT: v_mov_b32_e32 v16, 0947; GCN-NEXT: v_mov_b32_e32 v17, 0948; GCN-NEXT: v_mov_b32_e32 v18, 0949; GCN-NEXT: v_mov_b32_e32 v19, 0950; GCN-NEXT: v_mov_b32_e32 v20, 0951; GCN-NEXT: v_mov_b32_e32 v21, 0952; GCN-NEXT: v_mov_b32_e32 v22, 0953; GCN-NEXT: v_mov_b32_e32 v23, 0954; GCN-NEXT: v_mov_b32_e32 v24, 0955; GCN-NEXT: v_mov_b32_e32 v25, 0956; GCN-NEXT: v_mov_b32_e32 v26, 0957; GCN-NEXT: v_mov_b32_e32 v27, 0958; GCN-NEXT: v_mov_b32_e32 v28, 0959; GCN-NEXT: v_mov_b32_e32 v29, 0960; GCN-NEXT: v_mov_b32_e32 v30, 0961; GCN-NEXT: s_setpc_b64 s[16:17]962entry:963 %alloca = alloca [3 x i32], align 16, addrspace(5)964 store [3 x i32] [i32 9, i32 9, i32 9], ptr addrspace(5) %alloca965 tail call fastcc void @void_fastcc_byval_and_stack_passed(ptr addrspace(5) byval([3 x i32]) %alloca, [32 x i32] zeroinitializer, i32 %stack.out.arg)966 ret void967}968 969declare hidden fastcc i64 @i64_fastcc_i64(i64 %arg0)970 971define hidden fastcc i64 @sibling_call_i64_fastcc_i64(i64 %a) #1 {972; GCN-LABEL: sibling_call_i64_fastcc_i64:973; GCN: ; %bb.0: ; %entry974; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)975; GCN-NEXT: s_getpc_b64 s[16:17]976; GCN-NEXT: s_add_u32 s16, s16, i64_fastcc_i64@rel32@lo+4977; GCN-NEXT: s_addc_u32 s17, s17, i64_fastcc_i64@rel32@hi+12978; GCN-NEXT: s_setpc_b64 s[16:17]979entry:980 %ret = tail call fastcc i64 @i64_fastcc_i64(i64 %a)981 ret i64 %ret982}983 984declare hidden fastcc ptr addrspace(1) @p1i8_fastcc_p1i8(ptr addrspace(1) %arg0)985 986define hidden fastcc ptr addrspace(1) @sibling_call_p1i8_fastcc_p1i8(ptr addrspace(1) %a) #1 {987; GCN-LABEL: sibling_call_p1i8_fastcc_p1i8:988; GCN: ; %bb.0: ; %entry989; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)990; GCN-NEXT: s_getpc_b64 s[16:17]991; GCN-NEXT: s_add_u32 s16, s16, p1i8_fastcc_p1i8@rel32@lo+4992; GCN-NEXT: s_addc_u32 s17, s17, p1i8_fastcc_p1i8@rel32@hi+12993; GCN-NEXT: s_setpc_b64 s[16:17]994entry:995 %ret = tail call fastcc ptr addrspace(1) @p1i8_fastcc_p1i8(ptr addrspace(1) %a)996 ret ptr addrspace(1) %ret997}998 999declare hidden fastcc i16 @i16_fastcc_i16(i16 %arg0)1000 1001define hidden fastcc i16 @sibling_call_i16_fastcc_i16(i16 %a) #1 {1002; GCN-LABEL: sibling_call_i16_fastcc_i16:1003; GCN: ; %bb.0: ; %entry1004; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1005; GCN-NEXT: s_getpc_b64 s[16:17]1006; GCN-NEXT: s_add_u32 s16, s16, i16_fastcc_i16@rel32@lo+41007; GCN-NEXT: s_addc_u32 s17, s17, i16_fastcc_i16@rel32@hi+121008; GCN-NEXT: s_setpc_b64 s[16:17]1009entry:1010 %ret = tail call fastcc i16 @i16_fastcc_i16(i16 %a)1011 ret i16 %ret1012}1013 1014declare hidden fastcc half @f16_fastcc_f16(half %arg0)1015 1016define hidden fastcc half @sibling_call_f16_fastcc_f16(half %a) #1 {1017; GCN-LABEL: sibling_call_f16_fastcc_f16:1018; GCN: ; %bb.0: ; %entry1019; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1020; GCN-NEXT: s_getpc_b64 s[16:17]1021; GCN-NEXT: s_add_u32 s16, s16, f16_fastcc_f16@rel32@lo+41022; GCN-NEXT: s_addc_u32 s17, s17, f16_fastcc_f16@rel32@hi+121023; GCN-NEXT: s_setpc_b64 s[16:17]1024entry:1025 %ret = tail call fastcc half @f16_fastcc_f16(half %a)1026 ret half %ret1027}1028 1029declare hidden fastcc <3 x i16> @v3i16_fastcc_v3i16(<3 x i16> %arg0)1030 1031define hidden fastcc <3 x i16> @sibling_call_v3i16_fastcc_v3i16(<3 x i16> %a) #1 {1032; GCN-LABEL: sibling_call_v3i16_fastcc_v3i16:1033; GCN: ; %bb.0: ; %entry1034; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1035; GCN-NEXT: s_getpc_b64 s[16:17]1036; GCN-NEXT: s_add_u32 s16, s16, v3i16_fastcc_v3i16@rel32@lo+41037; GCN-NEXT: s_addc_u32 s17, s17, v3i16_fastcc_v3i16@rel32@hi+121038; GCN-NEXT: s_setpc_b64 s[16:17]1039entry:1040 %ret = tail call fastcc <3 x i16> @v3i16_fastcc_v3i16(<3 x i16> %a)1041 ret <3 x i16> %ret1042}1043 1044declare hidden fastcc <4 x i16> @v4i16_fastcc_v4i16(<4 x i16> %arg0)1045 1046define hidden fastcc <4 x i16> @sibling_call_v4i16_fastcc_v4i16(<4 x i16> %a) #1 {1047; GCN-LABEL: sibling_call_v4i16_fastcc_v4i16:1048; GCN: ; %bb.0: ; %entry1049; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1050; GCN-NEXT: s_getpc_b64 s[16:17]1051; GCN-NEXT: s_add_u32 s16, s16, v4i16_fastcc_v4i16@rel32@lo+41052; GCN-NEXT: s_addc_u32 s17, s17, v4i16_fastcc_v4i16@rel32@hi+121053; GCN-NEXT: s_setpc_b64 s[16:17]1054entry:1055 %ret = tail call fastcc <4 x i16> @v4i16_fastcc_v4i16(<4 x i16> %a)1056 ret <4 x i16> %ret1057}1058 1059declare hidden fastcc <2 x i64> @v2i64_fastcc_v2i64(<2 x i64> %arg0)1060 1061define hidden fastcc <2 x i64> @sibling_call_v2i64_fastcc_v2i64(<2 x i64> %a) #1 {1062; GCN-LABEL: sibling_call_v2i64_fastcc_v2i64:1063; GCN: ; %bb.0: ; %entry1064; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1065; GCN-NEXT: s_getpc_b64 s[16:17]1066; GCN-NEXT: s_add_u32 s16, s16, v2i64_fastcc_v2i64@rel32@lo+41067; GCN-NEXT: s_addc_u32 s17, s17, v2i64_fastcc_v2i64@rel32@hi+121068; GCN-NEXT: s_setpc_b64 s[16:17]1069entry:1070 %ret = tail call fastcc <2 x i64> @v2i64_fastcc_v2i64(<2 x i64> %a)1071 ret <2 x i64> %ret1072}1073 1074attributes #0 = { nounwind }1075attributes #1 = { nounwind noinline "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-heap-ptr" "amdgpu-no-hostcall-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "amdgpu-no-multigrid-sync-arg" "amdgpu-no-queue-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" }1076