1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -o - %s | FileCheck -enable-var-scope -check-prefix=MUBUF %s 3; RUN: llc -global-isel -amdgpu-enable-flat-scratch -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs -o - %s | FileCheck -enable-var-scope -check-prefix=FLATSCR %s 4 5; Test end-to-end codegen for outgoing arguments passed on the 6; stack. This test is likely redundant when all DAG and GlobalISel 7; tests are unified. 8 9declare hidden void @external_void_func_v16i32_v16i32_v4i32(<16 x i32>, <16 x i32>, <4 x i32>) #0 10declare hidden void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32])) #0 11 12define amdgpu_kernel void @kernel_caller_stack() { 13; MUBUF-LABEL: kernel_caller_stack: 14; MUBUF: ; %bb.0: 15; MUBUF-NEXT: s_add_u32 flat_scratch_lo, s4, s7 16; MUBUF-NEXT: s_addc_u32 flat_scratch_hi, s5, 0 17; MUBUF-NEXT: s_mov_b32 s32, 0 18; MUBUF-NEXT: s_add_u32 s0, s0, s7 19; MUBUF-NEXT: s_addc_u32 s1, s1, 0 20; MUBUF-NEXT: v_lshrrev_b32_e64 v0, 6, s32 21; MUBUF-NEXT: v_mov_b32_e32 v1, 9 22; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:4 23; MUBUF-NEXT: v_mov_b32_e32 v1, 10 24; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:8 25; MUBUF-NEXT: v_mov_b32_e32 v1, 11 26; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:12 27; MUBUF-NEXT: v_mov_b32_e32 v1, 12 28; MUBUF-NEXT: buffer_store_dword v0, v0, s[0:3], 0 offen 29; MUBUF-NEXT: s_getpc_b64 s[4:5] 30; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4 31; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12 32; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:16 33; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5] 34; MUBUF-NEXT: s_endpgm 35; 36; FLATSCR-LABEL: kernel_caller_stack: 37; FLATSCR: ; %bb.0: 38; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s0, s3 39; FLATSCR-NEXT: s_mov_b32 s32, 0 40; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s1, 0 41; FLATSCR-NEXT: scratch_store_dword off, v0, s32 42; FLATSCR-NEXT: v_mov_b32_e32 v0, 9 43; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:4 44; FLATSCR-NEXT: v_mov_b32_e32 v0, 10 45; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:8 46; FLATSCR-NEXT: v_mov_b32_e32 v0, 11 47; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:12 48; FLATSCR-NEXT: v_mov_b32_e32 v0, 12 49; FLATSCR-NEXT: s_getpc_b64 s[0:1] 50; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4 51; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12 52; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:16 53; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1] 54; FLATSCR-NEXT: s_endpgm 55 call void @external_void_func_v16i32_v16i32_v4i32(<16 x i32> undef, <16 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>) 56 ret void 57} 58 59define amdgpu_kernel void @kernel_caller_byval() { 60; MUBUF-LABEL: kernel_caller_byval: 61; MUBUF: ; %bb.0: 62; MUBUF-NEXT: s_add_u32 flat_scratch_lo, s4, s7 63; MUBUF-NEXT: s_addc_u32 flat_scratch_hi, s5, 0 64; MUBUF-NEXT: s_add_u32 s0, s0, s7 65; MUBUF-NEXT: s_addc_u32 s1, s1, 0 66; MUBUF-NEXT: v_mov_b32_e32 v0, 0 67; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:8 68; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:12 69; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:16 70; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:20 71; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:24 72; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:28 73; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:32 74; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:36 75; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:40 76; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:44 77; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:48 78; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:52 79; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:56 80; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:60 81; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:64 82; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:68 83; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:72 84; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:76 85; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:80 86; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:84 87; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:88 88; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:92 89; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:96 90; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:100 91; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:104 92; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:108 93; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:112 94; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:116 95; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:120 96; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:124 97; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:128 98; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], 0 offset:132 99; MUBUF-NEXT: buffer_load_dword v0, off, s[0:3], 0 offset:8 100; MUBUF-NEXT: s_nop 0 101; MUBUF-NEXT: buffer_load_dword v1, off, s[0:3], 0 offset:12 102; MUBUF-NEXT: buffer_load_dword v2, off, s[0:3], 0 offset:16 103; MUBUF-NEXT: buffer_load_dword v3, off, s[0:3], 0 offset:20 104; MUBUF-NEXT: buffer_load_dword v4, off, s[0:3], 0 offset:24 105; MUBUF-NEXT: buffer_load_dword v5, off, s[0:3], 0 offset:28 106; MUBUF-NEXT: buffer_load_dword v6, off, s[0:3], 0 offset:32 107; MUBUF-NEXT: buffer_load_dword v7, off, s[0:3], 0 offset:36 108; MUBUF-NEXT: buffer_load_dword v8, off, s[0:3], 0 offset:40 109; MUBUF-NEXT: buffer_load_dword v9, off, s[0:3], 0 offset:44 110; MUBUF-NEXT: buffer_load_dword v10, off, s[0:3], 0 offset:48 111; MUBUF-NEXT: buffer_load_dword v11, off, s[0:3], 0 offset:52 112; MUBUF-NEXT: buffer_load_dword v12, off, s[0:3], 0 offset:56 113; MUBUF-NEXT: buffer_load_dword v13, off, s[0:3], 0 offset:60 114; MUBUF-NEXT: buffer_load_dword v14, off, s[0:3], 0 offset:64 115; MUBUF-NEXT: buffer_load_dword v15, off, s[0:3], 0 offset:68 116; MUBUF-NEXT: s_movk_i32 s32, 0x1400 117; MUBUF-NEXT: v_lshrrev_b32_e64 v16, 6, s32 118; MUBUF-NEXT: s_getpc_b64 s[4:5] 119; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_byval@rel32@lo+4 120; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_byval@rel32@hi+12 121; MUBUF-NEXT: s_waitcnt vmcnt(15) 122; MUBUF-NEXT: buffer_store_dword v0, v16, s[0:3], 0 offen 123; MUBUF-NEXT: s_waitcnt vmcnt(15) 124; MUBUF-NEXT: buffer_store_dword v1, v16, s[0:3], 0 offen offset:4 125; MUBUF-NEXT: s_waitcnt vmcnt(15) 126; MUBUF-NEXT: buffer_store_dword v2, v16, s[0:3], 0 offen offset:8 127; MUBUF-NEXT: s_waitcnt vmcnt(15) 128; MUBUF-NEXT: buffer_store_dword v3, v16, s[0:3], 0 offen offset:12 129; MUBUF-NEXT: s_waitcnt vmcnt(15) 130; MUBUF-NEXT: buffer_store_dword v4, v16, s[0:3], 0 offen offset:16 131; MUBUF-NEXT: s_waitcnt vmcnt(15) 132; MUBUF-NEXT: buffer_store_dword v5, v16, s[0:3], 0 offen offset:20 133; MUBUF-NEXT: s_waitcnt vmcnt(15) 134; MUBUF-NEXT: buffer_store_dword v6, v16, s[0:3], 0 offen offset:24 135; MUBUF-NEXT: s_waitcnt vmcnt(15) 136; MUBUF-NEXT: buffer_store_dword v7, v16, s[0:3], 0 offen offset:28 137; MUBUF-NEXT: s_waitcnt vmcnt(15) 138; MUBUF-NEXT: buffer_store_dword v8, v16, s[0:3], 0 offen offset:32 139; MUBUF-NEXT: s_waitcnt vmcnt(15) 140; MUBUF-NEXT: buffer_store_dword v9, v16, s[0:3], 0 offen offset:36 141; MUBUF-NEXT: s_waitcnt vmcnt(15) 142; MUBUF-NEXT: buffer_store_dword v10, v16, s[0:3], 0 offen offset:40 143; MUBUF-NEXT: s_waitcnt vmcnt(15) 144; MUBUF-NEXT: buffer_store_dword v11, v16, s[0:3], 0 offen offset:44 145; MUBUF-NEXT: s_waitcnt vmcnt(15) 146; MUBUF-NEXT: buffer_store_dword v12, v16, s[0:3], 0 offen offset:48 147; MUBUF-NEXT: s_waitcnt vmcnt(15) 148; MUBUF-NEXT: buffer_store_dword v13, v16, s[0:3], 0 offen offset:52 149; MUBUF-NEXT: s_waitcnt vmcnt(15) 150; MUBUF-NEXT: buffer_store_dword v14, v16, s[0:3], 0 offen offset:56 151; MUBUF-NEXT: s_waitcnt vmcnt(15) 152; MUBUF-NEXT: buffer_store_dword v15, v16, s[0:3], 0 offen offset:60 153; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5] 154; MUBUF-NEXT: s_endpgm 155; 156; FLATSCR-LABEL: kernel_caller_byval: 157; FLATSCR: ; %bb.0: 158; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s0, s3 159; FLATSCR-NEXT: v_mov_b32_e32 v0, 0 160; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s1, 0 161; FLATSCR-NEXT: v_mov_b32_e32 v1, 0 162; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 163; FLATSCR-NEXT: s_mov_b32 s33, 0 164; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:8 165; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 166; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:72 167; FLATSCR-NEXT: s_mov_b32 s33, 0 168; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:16 169; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 170; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:80 171; FLATSCR-NEXT: s_mov_b32 s33, 0 172; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:24 173; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 174; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:88 175; FLATSCR-NEXT: s_mov_b32 s33, 0 176; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:32 177; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 178; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:96 179; FLATSCR-NEXT: s_mov_b32 s33, 0 180; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:40 181; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 182; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:104 183; FLATSCR-NEXT: s_mov_b32 s33, 0 184; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:48 185; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 186; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:112 187; FLATSCR-NEXT: s_mov_b32 s33, 0 188; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:56 189; FLATSCR-NEXT: s_mov_b32 vcc_hi, 0 190; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:120 191; FLATSCR-NEXT: s_mov_b32 s33, 0 192; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], vcc_hi offset:64 193; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s33 offset:128 194; FLATSCR-NEXT: s_mov_b32 s33, 0 195; FLATSCR-NEXT: scratch_load_dwordx2 v[0:1], off, s33 offset:8 196; FLATSCR-NEXT: s_mov_b32 s33, 0 197; FLATSCR-NEXT: scratch_load_dwordx2 v[2:3], off, s33 offset:16 198; FLATSCR-NEXT: s_mov_b32 s33, 0 199; FLATSCR-NEXT: scratch_load_dwordx2 v[4:5], off, s33 offset:24 200; FLATSCR-NEXT: s_mov_b32 s33, 0 201; FLATSCR-NEXT: scratch_load_dwordx2 v[6:7], off, s33 offset:32 202; FLATSCR-NEXT: s_mov_b32 s33, 0 203; FLATSCR-NEXT: scratch_load_dwordx2 v[8:9], off, s33 offset:40 204; FLATSCR-NEXT: s_mov_b32 s33, 0 205; FLATSCR-NEXT: scratch_load_dwordx2 v[10:11], off, s33 offset:48 206; FLATSCR-NEXT: s_mov_b32 s33, 0 207; FLATSCR-NEXT: scratch_load_dwordx2 v[12:13], off, s33 offset:56 208; FLATSCR-NEXT: s_mov_b32 s33, 0 209; FLATSCR-NEXT: scratch_load_dwordx2 v[14:15], off, s33 offset:64 210; FLATSCR-NEXT: s_movk_i32 s32, 0x50 211; FLATSCR-NEXT: s_getpc_b64 s[0:1] 212; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_byval@rel32@lo+4 213; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_byval@rel32@hi+12 214; FLATSCR-NEXT: s_waitcnt vmcnt(7) 215; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s32 216; FLATSCR-NEXT: s_waitcnt vmcnt(7) 217; FLATSCR-NEXT: scratch_store_dwordx2 off, v[2:3], s32 offset:8 218; FLATSCR-NEXT: s_waitcnt vmcnt(7) 219; FLATSCR-NEXT: scratch_store_dwordx2 off, v[4:5], s32 offset:16 220; FLATSCR-NEXT: s_waitcnt vmcnt(7) 221; FLATSCR-NEXT: scratch_store_dwordx2 off, v[6:7], s32 offset:24 222; FLATSCR-NEXT: s_waitcnt vmcnt(7) 223; FLATSCR-NEXT: scratch_store_dwordx2 off, v[8:9], s32 offset:32 224; FLATSCR-NEXT: s_waitcnt vmcnt(7) 225; FLATSCR-NEXT: scratch_store_dwordx2 off, v[10:11], s32 offset:40 226; FLATSCR-NEXT: s_waitcnt vmcnt(7) 227; FLATSCR-NEXT: scratch_store_dwordx2 off, v[12:13], s32 offset:48 228; FLATSCR-NEXT: s_waitcnt vmcnt(7) 229; FLATSCR-NEXT: scratch_store_dwordx2 off, v[14:15], s32 offset:56 230; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1] 231; FLATSCR-NEXT: s_endpgm 232 %alloca = alloca [16 x i32], align 4, addrspace(5) 233 %cast = bitcast [16 x i32] addrspace(5)* %alloca to i8 addrspace(5)* 234 call void @llvm.memset.p5i8.i32(i8 addrspace(5)* align 4 %cast, i8 0, i32 128, i1 false) 235 call void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32]) %alloca) 236 ret void 237} 238 239define void @func_caller_stack() { 240; MUBUF-LABEL: func_caller_stack: 241; MUBUF: ; %bb.0: 242; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 243; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -1 244; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 245; MUBUF-NEXT: s_mov_b64 exec, s[4:5] 246; MUBUF-NEXT: v_writelane_b32 v40, s33, 2 247; MUBUF-NEXT: s_mov_b32 s33, s32 248; MUBUF-NEXT: s_addk_i32 s32, 0x400 249; MUBUF-NEXT: v_lshrrev_b32_e64 v0, 6, s32 250; MUBUF-NEXT: v_mov_b32_e32 v1, 9 251; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:4 252; MUBUF-NEXT: v_mov_b32_e32 v1, 10 253; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:8 254; MUBUF-NEXT: v_mov_b32_e32 v1, 11 255; MUBUF-NEXT: v_writelane_b32 v40, s30, 0 256; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:12 257; MUBUF-NEXT: v_mov_b32_e32 v1, 12 258; MUBUF-NEXT: v_writelane_b32 v40, s31, 1 259; MUBUF-NEXT: buffer_store_dword v0, v0, s[0:3], 0 offen 260; MUBUF-NEXT: s_getpc_b64 s[4:5] 261; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4 262; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12 263; MUBUF-NEXT: buffer_store_dword v1, v0, s[0:3], 0 offen offset:16 264; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5] 265; MUBUF-NEXT: v_readlane_b32 s4, v40, 0 266; MUBUF-NEXT: v_readlane_b32 s5, v40, 1 267; MUBUF-NEXT: s_addk_i32 s32, 0xfc00 268; MUBUF-NEXT: v_readlane_b32 s33, v40, 2 269; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1 270; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 271; MUBUF-NEXT: s_mov_b64 exec, s[6:7] 272; MUBUF-NEXT: s_waitcnt vmcnt(0) 273; MUBUF-NEXT: s_setpc_b64 s[4:5] 274; 275; FLATSCR-LABEL: func_caller_stack: 276; FLATSCR: ; %bb.0: 277; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 278; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -1 279; FLATSCR-NEXT: scratch_store_dword off, v40, s32 ; 4-byte Folded Spill 280; FLATSCR-NEXT: s_mov_b64 exec, s[0:1] 281; FLATSCR-NEXT: v_writelane_b32 v40, s33, 2 282; FLATSCR-NEXT: s_mov_b32 s33, s32 283; FLATSCR-NEXT: s_add_i32 s32, s32, 16 284; FLATSCR-NEXT: scratch_store_dword off, v0, s32 285; FLATSCR-NEXT: v_mov_b32_e32 v0, 9 286; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:4 287; FLATSCR-NEXT: v_mov_b32_e32 v0, 10 288; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:8 289; FLATSCR-NEXT: v_mov_b32_e32 v0, 11 290; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0 291; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:12 292; FLATSCR-NEXT: v_mov_b32_e32 v0, 12 293; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1 294; FLATSCR-NEXT: s_getpc_b64 s[0:1] 295; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_v16i32_v16i32_v4i32@rel32@lo+4 296; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_v16i32_v16i32_v4i32@rel32@hi+12 297; FLATSCR-NEXT: scratch_store_dword off, v0, s32 offset:16 298; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1] 299; FLATSCR-NEXT: v_readlane_b32 s0, v40, 0 300; FLATSCR-NEXT: v_readlane_b32 s1, v40, 1 301; FLATSCR-NEXT: s_add_i32 s32, s32, -16 302; FLATSCR-NEXT: v_readlane_b32 s33, v40, 2 303; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1 304; FLATSCR-NEXT: scratch_load_dword v40, off, s32 ; 4-byte Folded Reload 305; FLATSCR-NEXT: s_mov_b64 exec, s[2:3] 306; FLATSCR-NEXT: s_waitcnt vmcnt(0) 307; FLATSCR-NEXT: s_setpc_b64 s[0:1] 308 call void @external_void_func_v16i32_v16i32_v4i32(<16 x i32> undef, <16 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>) 309 ret void 310} 311 312define void @func_caller_byval([16 x i32] addrspace(5)* %argptr) { 313; MUBUF-LABEL: func_caller_byval: 314; MUBUF: ; %bb.0: 315; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 316; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -1 317; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill 318; MUBUF-NEXT: s_mov_b64 exec, s[4:5] 319; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen 320; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:4 321; MUBUF-NEXT: v_writelane_b32 v40, s33, 2 322; MUBUF-NEXT: s_mov_b32 s33, s32 323; MUBUF-NEXT: s_addk_i32 s32, 0x400 324; MUBUF-NEXT: v_lshrrev_b32_e64 v3, 6, s32 325; MUBUF-NEXT: v_writelane_b32 v40, s30, 0 326; MUBUF-NEXT: v_writelane_b32 v40, s31, 1 327; MUBUF-NEXT: s_getpc_b64 s[4:5] 328; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_byval@rel32@lo+4 329; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_byval@rel32@hi+12 330; MUBUF-NEXT: s_waitcnt vmcnt(1) 331; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen 332; MUBUF-NEXT: s_waitcnt vmcnt(1) 333; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:4 334; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:8 335; MUBUF-NEXT: s_nop 0 336; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:12 337; MUBUF-NEXT: s_waitcnt vmcnt(1) 338; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:8 339; MUBUF-NEXT: s_waitcnt vmcnt(1) 340; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:12 341; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:16 342; MUBUF-NEXT: s_nop 0 343; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:20 344; MUBUF-NEXT: s_waitcnt vmcnt(1) 345; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:16 346; MUBUF-NEXT: s_waitcnt vmcnt(1) 347; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:20 348; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:24 349; MUBUF-NEXT: s_nop 0 350; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:28 351; MUBUF-NEXT: s_waitcnt vmcnt(1) 352; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:24 353; MUBUF-NEXT: s_waitcnt vmcnt(1) 354; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:28 355; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:32 356; MUBUF-NEXT: s_nop 0 357; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:36 358; MUBUF-NEXT: s_waitcnt vmcnt(1) 359; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:32 360; MUBUF-NEXT: s_waitcnt vmcnt(1) 361; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:36 362; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:40 363; MUBUF-NEXT: s_nop 0 364; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:44 365; MUBUF-NEXT: s_waitcnt vmcnt(1) 366; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:40 367; MUBUF-NEXT: s_waitcnt vmcnt(1) 368; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:44 369; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:48 370; MUBUF-NEXT: s_nop 0 371; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:52 372; MUBUF-NEXT: s_waitcnt vmcnt(1) 373; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:48 374; MUBUF-NEXT: s_waitcnt vmcnt(1) 375; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:52 376; MUBUF-NEXT: buffer_load_dword v1, v0, s[0:3], 0 offen offset:56 377; MUBUF-NEXT: s_nop 0 378; MUBUF-NEXT: buffer_load_dword v2, v0, s[0:3], 0 offen offset:60 379; MUBUF-NEXT: s_waitcnt vmcnt(1) 380; MUBUF-NEXT: buffer_store_dword v1, v3, s[0:3], 0 offen offset:56 381; MUBUF-NEXT: s_waitcnt vmcnt(1) 382; MUBUF-NEXT: buffer_store_dword v2, v3, s[0:3], 0 offen offset:60 383; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5] 384; MUBUF-NEXT: v_readlane_b32 s4, v40, 0 385; MUBUF-NEXT: v_readlane_b32 s5, v40, 1 386; MUBUF-NEXT: s_addk_i32 s32, 0xfc00 387; MUBUF-NEXT: v_readlane_b32 s33, v40, 2 388; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1 389; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload 390; MUBUF-NEXT: s_mov_b64 exec, s[6:7] 391; MUBUF-NEXT: s_waitcnt vmcnt(0) 392; MUBUF-NEXT: s_setpc_b64 s[4:5] 393; 394; FLATSCR-LABEL: func_caller_byval: 395; FLATSCR: ; %bb.0: 396; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) 397; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -1 398; FLATSCR-NEXT: scratch_store_dword off, v40, s32 ; 4-byte Folded Spill 399; FLATSCR-NEXT: s_mov_b64 exec, s[0:1] 400; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off 401; FLATSCR-NEXT: v_writelane_b32 v40, s33, 2 402; FLATSCR-NEXT: s_mov_b32 s33, s32 403; FLATSCR-NEXT: s_add_i32 s32, s32, 16 404; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0 405; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1 406; FLATSCR-NEXT: s_getpc_b64 s[0:1] 407; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_byval@rel32@lo+4 408; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_byval@rel32@hi+12 409; FLATSCR-NEXT: s_waitcnt vmcnt(0) 410; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 411; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:8 412; FLATSCR-NEXT: s_waitcnt vmcnt(0) 413; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:8 414; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:16 415; FLATSCR-NEXT: s_waitcnt vmcnt(0) 416; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:16 417; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:24 418; FLATSCR-NEXT: s_waitcnt vmcnt(0) 419; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:24 420; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:32 421; FLATSCR-NEXT: s_waitcnt vmcnt(0) 422; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:32 423; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:40 424; FLATSCR-NEXT: s_waitcnt vmcnt(0) 425; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:40 426; FLATSCR-NEXT: scratch_load_dwordx2 v[1:2], v0, off offset:48 427; FLATSCR-NEXT: s_waitcnt vmcnt(0) 428; FLATSCR-NEXT: scratch_store_dwordx2 off, v[1:2], s32 offset:48 429; FLATSCR-NEXT: scratch_load_dwordx2 v[0:1], v0, off offset:56 430; FLATSCR-NEXT: s_waitcnt vmcnt(0) 431; FLATSCR-NEXT: scratch_store_dwordx2 off, v[0:1], s32 offset:56 432; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1] 433; FLATSCR-NEXT: v_readlane_b32 s0, v40, 0 434; FLATSCR-NEXT: v_readlane_b32 s1, v40, 1 435; FLATSCR-NEXT: s_add_i32 s32, s32, -16 436; FLATSCR-NEXT: v_readlane_b32 s33, v40, 2 437; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1 438; FLATSCR-NEXT: scratch_load_dword v40, off, s32 ; 4-byte Folded Reload 439; FLATSCR-NEXT: s_mov_b64 exec, s[2:3] 440; FLATSCR-NEXT: s_waitcnt vmcnt(0) 441; FLATSCR-NEXT: s_setpc_b64 s[0:1] 442 %cast = bitcast [16 x i32] addrspace(5)* %argptr to i8 addrspace(5)* 443 call void @external_void_func_byval([16 x i32] addrspace(5)* byval([16 x i32]) %argptr) 444 ret void 445} 446 447declare void @llvm.memset.p5i8.i32(i8 addrspace(5)* nocapture writeonly, i8, i32, i1 immarg) #1 448 449attributes #0 = { nounwind "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-queue-ptr" "amdgpu-no-workgroup-id-x" "amdgpu-no-workgroup-id-y" "amdgpu-no-workgroup-id-z" "amdgpu-no-workitem-id-x" "amdgpu-no-workitem-id-y" "amdgpu-no-workitem-id-z" } 450attributes #1 = { argmemonly nofree nounwind willreturn writeonly } 451