683 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-amd-amdhsa -mcpu=fiji -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,SDAG %s3; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,SDAG %s4; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,SDAG %s5; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-ipra=0 -mattr=+enable-flat-scratch < %s | FileCheck -check-prefixes=GCN,FLATSCR,SDAG %s6; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=fiji -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,GISEL %s7; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,GISEL %s8; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-ipra=0 < %s | FileCheck -check-prefixes=GCN,MUBUF,GISEL %s9; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -enable-ipra=0 -mattr=+enable-flat-scratch < %s | FileCheck -check-prefixes=GCN,FLATSCR,GISEL %s10 11declare hidden void @external_void_func_void() #312 13define amdgpu_kernel void @test_kernel_call_external_void_func_void_clobber_s30_s31_call_external_void_func_void() #0 {14; FLATSCR-LABEL: test_kernel_call_external_void_func_void_clobber_s30_s31_call_external_void_func_void:15; FLATSCR: ; %bb.0:16; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s1317; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 018; FLATSCR-NEXT: s_getpc_b64 s[34:35]19; FLATSCR-NEXT: s_add_u32 s34, s34, external_void_func_void@rel32@lo+420; FLATSCR-NEXT: s_addc_u32 s35, s35, external_void_func_void@rel32@hi+1221; FLATSCR-NEXT: s_mov_b32 s32, 022; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]23; FLATSCR-NEXT: ;;#ASMSTART24; FLATSCR-NEXT: ;;#ASMEND25; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]26; FLATSCR-NEXT: s_endpgm27 call void @external_void_func_void()28 call void asm sideeffect "", ""() #029 call void @external_void_func_void()30 ret void31}32 33define void @test_func_call_external_void_func_void_clobber_s30_s31_call_external_void_func_void() #0 {34; MUBUF-LABEL: test_func_call_external_void_func_void_clobber_s30_s31_call_external_void_func_void:35; MUBUF: ; %bb.0:36; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)37; MUBUF-NEXT: s_mov_b32 s4, s3338; MUBUF-NEXT: s_mov_b32 s33, s3239; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -140; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill41; MUBUF-NEXT: s_mov_b64 exec, s[6:7]42; MUBUF-NEXT: v_writelane_b32 v40, s4, 443; MUBUF-NEXT: v_writelane_b32 v40, s30, 044; MUBUF-NEXT: v_writelane_b32 v40, s31, 145; MUBUF-NEXT: s_addk_i32 s32, 0x40046; MUBUF-NEXT: v_writelane_b32 v40, s34, 247; MUBUF-NEXT: v_writelane_b32 v40, s35, 348; MUBUF-NEXT: s_getpc_b64 s[34:35]49; MUBUF-NEXT: s_add_u32 s34, s34, external_void_func_void@rel32@lo+450; MUBUF-NEXT: s_addc_u32 s35, s35, external_void_func_void@rel32@hi+1251; MUBUF-NEXT: s_swappc_b64 s[30:31], s[34:35]52; MUBUF-NEXT: ;;#ASMSTART53; MUBUF-NEXT: ;;#ASMEND54; MUBUF-NEXT: s_swappc_b64 s[30:31], s[34:35]55; MUBUF-NEXT: v_readlane_b32 s35, v40, 356; MUBUF-NEXT: v_readlane_b32 s34, v40, 257; MUBUF-NEXT: v_readlane_b32 s31, v40, 158; MUBUF-NEXT: v_readlane_b32 s30, v40, 059; MUBUF-NEXT: s_mov_b32 s32, s3360; MUBUF-NEXT: v_readlane_b32 s4, v40, 461; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -162; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload63; MUBUF-NEXT: s_mov_b64 exec, s[6:7]64; MUBUF-NEXT: s_mov_b32 s33, s465; MUBUF-NEXT: s_waitcnt vmcnt(0)66; MUBUF-NEXT: s_setpc_b64 s[30:31]67;68; FLATSCR-LABEL: test_func_call_external_void_func_void_clobber_s30_s31_call_external_void_func_void:69; FLATSCR: ; %bb.0:70; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)71; FLATSCR-NEXT: s_mov_b32 s0, s3372; FLATSCR-NEXT: s_mov_b32 s33, s3273; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -174; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill75; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]76; FLATSCR-NEXT: v_writelane_b32 v40, s0, 477; FLATSCR-NEXT: v_writelane_b32 v40, s30, 078; FLATSCR-NEXT: v_writelane_b32 v40, s31, 179; FLATSCR-NEXT: s_add_i32 s32, s32, 1680; FLATSCR-NEXT: v_writelane_b32 v40, s34, 281; FLATSCR-NEXT: v_writelane_b32 v40, s35, 382; FLATSCR-NEXT: s_getpc_b64 s[34:35]83; FLATSCR-NEXT: s_add_u32 s34, s34, external_void_func_void@rel32@lo+484; FLATSCR-NEXT: s_addc_u32 s35, s35, external_void_func_void@rel32@hi+1285; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]86; FLATSCR-NEXT: ;;#ASMSTART87; FLATSCR-NEXT: ;;#ASMEND88; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]89; FLATSCR-NEXT: v_readlane_b32 s35, v40, 390; FLATSCR-NEXT: v_readlane_b32 s34, v40, 291; FLATSCR-NEXT: v_readlane_b32 s31, v40, 192; FLATSCR-NEXT: v_readlane_b32 s30, v40, 093; FLATSCR-NEXT: s_mov_b32 s32, s3394; FLATSCR-NEXT: v_readlane_b32 s0, v40, 495; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -196; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload97; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]98; FLATSCR-NEXT: s_mov_b32 s33, s099; FLATSCR-NEXT: s_waitcnt vmcnt(0)100; FLATSCR-NEXT: s_setpc_b64 s[30:31]101 call void @external_void_func_void()102 call void asm sideeffect "", ""() #0103 call void @external_void_func_void()104 ret void105}106 107define void @test_func_call_external_void_funcx2() #0 {108; MUBUF-LABEL: test_func_call_external_void_funcx2:109; MUBUF: ; %bb.0:110; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)111; MUBUF-NEXT: s_mov_b32 s4, s33112; MUBUF-NEXT: s_mov_b32 s33, s32113; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1114; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill115; MUBUF-NEXT: s_mov_b64 exec, s[6:7]116; MUBUF-NEXT: v_writelane_b32 v40, s4, 4117; MUBUF-NEXT: v_writelane_b32 v40, s30, 0118; MUBUF-NEXT: v_writelane_b32 v40, s31, 1119; MUBUF-NEXT: s_addk_i32 s32, 0x400120; MUBUF-NEXT: v_writelane_b32 v40, s34, 2121; MUBUF-NEXT: v_writelane_b32 v40, s35, 3122; MUBUF-NEXT: s_getpc_b64 s[34:35]123; MUBUF-NEXT: s_add_u32 s34, s34, external_void_func_void@rel32@lo+4124; MUBUF-NEXT: s_addc_u32 s35, s35, external_void_func_void@rel32@hi+12125; MUBUF-NEXT: s_swappc_b64 s[30:31], s[34:35]126; MUBUF-NEXT: s_swappc_b64 s[30:31], s[34:35]127; MUBUF-NEXT: v_readlane_b32 s35, v40, 3128; MUBUF-NEXT: v_readlane_b32 s34, v40, 2129; MUBUF-NEXT: v_readlane_b32 s31, v40, 1130; MUBUF-NEXT: v_readlane_b32 s30, v40, 0131; MUBUF-NEXT: s_mov_b32 s32, s33132; MUBUF-NEXT: v_readlane_b32 s4, v40, 4133; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1134; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload135; MUBUF-NEXT: s_mov_b64 exec, s[6:7]136; MUBUF-NEXT: s_mov_b32 s33, s4137; MUBUF-NEXT: s_waitcnt vmcnt(0)138; MUBUF-NEXT: s_setpc_b64 s[30:31]139;140; FLATSCR-LABEL: test_func_call_external_void_funcx2:141; FLATSCR: ; %bb.0:142; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)143; FLATSCR-NEXT: s_mov_b32 s0, s33144; FLATSCR-NEXT: s_mov_b32 s33, s32145; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1146; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill147; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]148; FLATSCR-NEXT: v_writelane_b32 v40, s0, 4149; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0150; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1151; FLATSCR-NEXT: s_add_i32 s32, s32, 16152; FLATSCR-NEXT: v_writelane_b32 v40, s34, 2153; FLATSCR-NEXT: v_writelane_b32 v40, s35, 3154; FLATSCR-NEXT: s_getpc_b64 s[34:35]155; FLATSCR-NEXT: s_add_u32 s34, s34, external_void_func_void@rel32@lo+4156; FLATSCR-NEXT: s_addc_u32 s35, s35, external_void_func_void@rel32@hi+12157; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]158; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[34:35]159; FLATSCR-NEXT: v_readlane_b32 s35, v40, 3160; FLATSCR-NEXT: v_readlane_b32 s34, v40, 2161; FLATSCR-NEXT: v_readlane_b32 s31, v40, 1162; FLATSCR-NEXT: v_readlane_b32 s30, v40, 0163; FLATSCR-NEXT: s_mov_b32 s32, s33164; FLATSCR-NEXT: v_readlane_b32 s0, v40, 4165; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1166; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload167; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]168; FLATSCR-NEXT: s_mov_b32 s33, s0169; FLATSCR-NEXT: s_waitcnt vmcnt(0)170; FLATSCR-NEXT: s_setpc_b64 s[30:31]171 call void @external_void_func_void()172 call void @external_void_func_void()173 ret void174}175 176define void @void_func_void_clobber_s30_s31() #2 {177; MUBUF-LABEL: void_func_void_clobber_s30_s31:178; MUBUF: ; %bb.0:179; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)180; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1181; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill182; MUBUF-NEXT: s_mov_b64 exec, s[4:5]183; MUBUF-NEXT: v_writelane_b32 v0, s30, 0184; MUBUF-NEXT: v_writelane_b32 v0, s31, 1185; MUBUF-NEXT: ;;#ASMSTART186; MUBUF-NEXT: ; clobber187; MUBUF-NEXT: ;;#ASMEND188; MUBUF-NEXT: v_readlane_b32 s31, v0, 1189; MUBUF-NEXT: v_readlane_b32 s30, v0, 0190; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1191; MUBUF-NEXT: buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload192; MUBUF-NEXT: s_mov_b64 exec, s[4:5]193; MUBUF-NEXT: s_waitcnt vmcnt(0)194; MUBUF-NEXT: s_setpc_b64 s[30:31]195;196; FLATSCR-LABEL: void_func_void_clobber_s30_s31:197; FLATSCR: ; %bb.0:198; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)199; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1200; FLATSCR-NEXT: scratch_store_dword off, v0, s32 ; 4-byte Folded Spill201; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]202; FLATSCR-NEXT: v_writelane_b32 v0, s30, 0203; FLATSCR-NEXT: v_writelane_b32 v0, s31, 1204; FLATSCR-NEXT: ;;#ASMSTART205; FLATSCR-NEXT: ; clobber206; FLATSCR-NEXT: ;;#ASMEND207; FLATSCR-NEXT: v_readlane_b32 s31, v0, 1208; FLATSCR-NEXT: v_readlane_b32 s30, v0, 0209; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1210; FLATSCR-NEXT: scratch_load_dword v0, off, s32 ; 4-byte Folded Reload211; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]212; FLATSCR-NEXT: s_waitcnt vmcnt(0)213; FLATSCR-NEXT: s_setpc_b64 s[30:31]214 call void asm sideeffect "; clobber", "~{s[30:31]}"() #0215 ret void216}217 218define hidden void @void_func_void_clobber_vcc() #2 {219; GCN-LABEL: void_func_void_clobber_vcc:220; GCN: ; %bb.0:221; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)222; GCN-NEXT: ;;#ASMSTART223; GCN-NEXT: ;;#ASMEND224; GCN-NEXT: s_setpc_b64 s[30:31]225 call void asm sideeffect "", "~{vcc}"() #0226 ret void227}228 229define amdgpu_kernel void @test_call_void_func_void_clobber_vcc(ptr addrspace(1) %out) #0 {230 %vcc = call i64 asm sideeffect "; def $0", "={vcc}"()231 call void @void_func_void_clobber_vcc()232 %val0 = load volatile i32, ptr addrspace(1) poison233 %val1 = load volatile i32, ptr addrspace(1) poison234 call void asm sideeffect "; use $0", "{vcc}"(i64 %vcc)235 ret void236}237 238define amdgpu_kernel void @test_call_void_func_void_mayclobber_s31(ptr addrspace(1) %out) #0 {239; FLATSCR-LABEL: test_call_void_func_void_mayclobber_s31:240; FLATSCR: ; %bb.0:241; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13242; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0243; FLATSCR-NEXT: s_getpc_b64 s[0:1]244; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4245; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12246; FLATSCR-NEXT: s_mov_b32 s32, 0247; FLATSCR-NEXT: ;;#ASMSTART248; FLATSCR-NEXT: ; def s31249; FLATSCR-NEXT: ;;#ASMEND250; FLATSCR-NEXT: s_mov_b32 s33, s31251; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]252; FLATSCR-NEXT: s_mov_b32 s31, s33253; FLATSCR-NEXT: ;;#ASMSTART254; FLATSCR-NEXT: ; use s31255; FLATSCR-NEXT: ;;#ASMEND256; FLATSCR-NEXT: s_endpgm257 %s31 = call i32 asm sideeffect "; def $0", "={s31}"()258 call void @external_void_func_void()259 call void asm sideeffect "; use $0", "{s31}"(i32 %s31)260 ret void261}262 263define amdgpu_kernel void @test_call_void_func_void_mayclobber_v31(ptr addrspace(1) %out) #0 {264; FLATSCR-LABEL: test_call_void_func_void_mayclobber_v31:265; FLATSCR: ; %bb.0:266; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13267; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0268; FLATSCR-NEXT: s_getpc_b64 s[0:1]269; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4270; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12271; FLATSCR-NEXT: s_mov_b32 s32, 0272; FLATSCR-NEXT: ;;#ASMSTART273; FLATSCR-NEXT: ; def v31274; FLATSCR-NEXT: ;;#ASMEND275; FLATSCR-NEXT: v_mov_b32_e32 v40, v31276; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]277; FLATSCR-NEXT: v_mov_b32_e32 v31, v40278; FLATSCR-NEXT: ;;#ASMSTART279; FLATSCR-NEXT: ; use v31280; FLATSCR-NEXT: ;;#ASMEND281; FLATSCR-NEXT: s_endpgm282 %v31 = call i32 asm sideeffect "; def $0", "={v31}"()283 call void @external_void_func_void()284 call void asm sideeffect "; use $0", "{v31}"(i32 %v31)285 ret void286}287 288; FIXME: What is the expected behavior for reserved registers here?289define amdgpu_kernel void @test_call_void_func_void_preserves_s33(ptr addrspace(1) %out) #0 {290; FLATSCR-LABEL: test_call_void_func_void_preserves_s33:291; FLATSCR: ; %bb.0:292; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13293; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0294; FLATSCR-NEXT: s_getpc_b64 s[0:1]295; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4296; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12297; FLATSCR-NEXT: s_mov_b32 s32, 0298; FLATSCR-NEXT: ;;#ASMSTART299; FLATSCR-NEXT: ; def s33300; FLATSCR-NEXT: ;;#ASMEND301; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]302; FLATSCR-NEXT: ;;#ASMSTART303; FLATSCR-NEXT: ; use s33304; FLATSCR-NEXT: ;;#ASMEND305; FLATSCR-NEXT: s_endpgm306 %s33 = call i32 asm sideeffect "; def $0", "={s33}"()307 call void @external_void_func_void()308 call void asm sideeffect "; use $0", "{s33}"(i32 %s33)309 ret void310}311 312define amdgpu_kernel void @test_call_void_func_void_preserves_s34(ptr addrspace(1) %out) #0 {313; FLATSCR-LABEL: test_call_void_func_void_preserves_s34:314; FLATSCR: ; %bb.0:315; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13316; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0317; FLATSCR-NEXT: s_getpc_b64 s[0:1]318; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4319; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12320; FLATSCR-NEXT: s_mov_b32 s32, 0321; FLATSCR-NEXT: ;;#ASMSTART322; FLATSCR-NEXT: ; def s34323; FLATSCR-NEXT: ;;#ASMEND324; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]325; FLATSCR-NEXT: ;;#ASMSTART326; FLATSCR-NEXT: ; use s34327; FLATSCR-NEXT: ;;#ASMEND328; FLATSCR-NEXT: s_endpgm329 %s34 = call i32 asm sideeffect "; def $0", "={s34}"()330 call void @external_void_func_void()331 call void asm sideeffect "; use $0", "{s34}"(i32 %s34)332 ret void333}334 335define amdgpu_kernel void @test_call_void_func_void_preserves_v40(ptr addrspace(1) %out) #0 {336; FLATSCR-LABEL: test_call_void_func_void_preserves_v40:337; FLATSCR: ; %bb.0:338; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13339; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0340; FLATSCR-NEXT: s_getpc_b64 s[0:1]341; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4342; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12343; FLATSCR-NEXT: s_mov_b32 s32, 0344; FLATSCR-NEXT: ;;#ASMSTART345; FLATSCR-NEXT: ; def v40346; FLATSCR-NEXT: ;;#ASMEND347; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]348; FLATSCR-NEXT: ;;#ASMSTART349; FLATSCR-NEXT: ; use v40350; FLATSCR-NEXT: ;;#ASMEND351; FLATSCR-NEXT: s_endpgm352 %v40 = call i32 asm sideeffect "; def $0", "={v40}"()353 call void @external_void_func_void()354 call void asm sideeffect "; use $0", "{v40}"(i32 %v40)355 ret void356}357 358define hidden void @void_func_void_clobber_s33() #2 {359; MUBUF-LABEL: void_func_void_clobber_s33:360; MUBUF: ; %bb.0:361; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)362; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1363; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill364; MUBUF-NEXT: s_mov_b64 exec, s[4:5]365; MUBUF-NEXT: v_writelane_b32 v0, s33, 0366; MUBUF-NEXT: ;;#ASMSTART367; MUBUF-NEXT: ; clobber368; MUBUF-NEXT: ;;#ASMEND369; MUBUF-NEXT: v_readlane_b32 s33, v0, 0370; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1371; MUBUF-NEXT: buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload372; MUBUF-NEXT: s_mov_b64 exec, s[4:5]373; MUBUF-NEXT: s_waitcnt vmcnt(0)374; MUBUF-NEXT: s_setpc_b64 s[30:31]375;376; FLATSCR-LABEL: void_func_void_clobber_s33:377; FLATSCR: ; %bb.0:378; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)379; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1380; FLATSCR-NEXT: scratch_store_dword off, v0, s32 ; 4-byte Folded Spill381; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]382; FLATSCR-NEXT: v_writelane_b32 v0, s33, 0383; FLATSCR-NEXT: ;;#ASMSTART384; FLATSCR-NEXT: ; clobber385; FLATSCR-NEXT: ;;#ASMEND386; FLATSCR-NEXT: v_readlane_b32 s33, v0, 0387; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1388; FLATSCR-NEXT: scratch_load_dword v0, off, s32 ; 4-byte Folded Reload389; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]390; FLATSCR-NEXT: s_waitcnt vmcnt(0)391; FLATSCR-NEXT: s_setpc_b64 s[30:31]392 call void asm sideeffect "; clobber", "~{s33}"() #0393 ret void394}395 396define hidden void @void_func_void_clobber_s34() #2 {397; MUBUF-LABEL: void_func_void_clobber_s34:398; MUBUF: ; %bb.0:399; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)400; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1401; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s32 ; 4-byte Folded Spill402; MUBUF-NEXT: s_mov_b64 exec, s[4:5]403; MUBUF-NEXT: v_writelane_b32 v0, s34, 0404; MUBUF-NEXT: ;;#ASMSTART405; MUBUF-NEXT: ; clobber406; MUBUF-NEXT: ;;#ASMEND407; MUBUF-NEXT: v_readlane_b32 s34, v0, 0408; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1409; MUBUF-NEXT: buffer_load_dword v0, off, s[0:3], s32 ; 4-byte Folded Reload410; MUBUF-NEXT: s_mov_b64 exec, s[4:5]411; MUBUF-NEXT: s_waitcnt vmcnt(0)412; MUBUF-NEXT: s_setpc_b64 s[30:31]413;414; FLATSCR-LABEL: void_func_void_clobber_s34:415; FLATSCR: ; %bb.0:416; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)417; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1418; FLATSCR-NEXT: scratch_store_dword off, v0, s32 ; 4-byte Folded Spill419; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]420; FLATSCR-NEXT: v_writelane_b32 v0, s34, 0421; FLATSCR-NEXT: ;;#ASMSTART422; FLATSCR-NEXT: ; clobber423; FLATSCR-NEXT: ;;#ASMEND424; FLATSCR-NEXT: v_readlane_b32 s34, v0, 0425; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1426; FLATSCR-NEXT: scratch_load_dword v0, off, s32 ; 4-byte Folded Reload427; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]428; FLATSCR-NEXT: s_waitcnt vmcnt(0)429; FLATSCR-NEXT: s_setpc_b64 s[30:31]430 call void asm sideeffect "; clobber", "~{s34}"() #0431 ret void432}433 434define amdgpu_kernel void @test_call_void_func_void_clobber_s33() #0 {435 call void @void_func_void_clobber_s33()436 ret void437}438 439define amdgpu_kernel void @test_call_void_func_void_clobber_s34() #0 {440 call void @void_func_void_clobber_s34()441 ret void442}443 444define void @callee_saved_sgpr_func() #2 {445; MUBUF-LABEL: callee_saved_sgpr_func:446; MUBUF: ; %bb.0:447; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)448; MUBUF-NEXT: s_mov_b32 s4, s33449; MUBUF-NEXT: s_mov_b32 s33, s32450; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1451; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill452; MUBUF-NEXT: s_mov_b64 exec, s[6:7]453; MUBUF-NEXT: v_writelane_b32 v40, s4, 3454; MUBUF-NEXT: s_addk_i32 s32, 0x400455; MUBUF-NEXT: v_writelane_b32 v40, s30, 0456; MUBUF-NEXT: v_writelane_b32 v40, s31, 1457; MUBUF-NEXT: s_getpc_b64 s[4:5]458; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_void@rel32@lo+4459; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_void@rel32@hi+12460; MUBUF-NEXT: v_writelane_b32 v40, s34, 2461; MUBUF-NEXT: ;;#ASMSTART462; MUBUF-NEXT: ; def s40463; MUBUF-NEXT: ;;#ASMEND464; MUBUF-NEXT: s_mov_b32 s34, s40465; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5]466; MUBUF-NEXT: ;;#ASMSTART467; MUBUF-NEXT: ; use s34468; MUBUF-NEXT: ;;#ASMEND469; MUBUF-NEXT: v_readlane_b32 s34, v40, 2470; MUBUF-NEXT: v_readlane_b32 s31, v40, 1471; MUBUF-NEXT: v_readlane_b32 s30, v40, 0472; MUBUF-NEXT: s_mov_b32 s32, s33473; MUBUF-NEXT: v_readlane_b32 s4, v40, 3474; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1475; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload476; MUBUF-NEXT: s_mov_b64 exec, s[6:7]477; MUBUF-NEXT: s_mov_b32 s33, s4478; MUBUF-NEXT: s_waitcnt vmcnt(0)479; MUBUF-NEXT: s_setpc_b64 s[30:31]480;481; FLATSCR-LABEL: callee_saved_sgpr_func:482; FLATSCR: ; %bb.0:483; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)484; FLATSCR-NEXT: s_mov_b32 s0, s33485; FLATSCR-NEXT: s_mov_b32 s33, s32486; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1487; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill488; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]489; FLATSCR-NEXT: v_writelane_b32 v40, s0, 3490; FLATSCR-NEXT: s_add_i32 s32, s32, 16491; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0492; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1493; FLATSCR-NEXT: s_getpc_b64 s[0:1]494; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4495; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12496; FLATSCR-NEXT: v_writelane_b32 v40, s34, 2497; FLATSCR-NEXT: ;;#ASMSTART498; FLATSCR-NEXT: ; def s40499; FLATSCR-NEXT: ;;#ASMEND500; FLATSCR-NEXT: s_mov_b32 s34, s40501; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]502; FLATSCR-NEXT: ;;#ASMSTART503; FLATSCR-NEXT: ; use s34504; FLATSCR-NEXT: ;;#ASMEND505; FLATSCR-NEXT: v_readlane_b32 s34, v40, 2506; FLATSCR-NEXT: v_readlane_b32 s31, v40, 1507; FLATSCR-NEXT: v_readlane_b32 s30, v40, 0508; FLATSCR-NEXT: s_mov_b32 s32, s33509; FLATSCR-NEXT: v_readlane_b32 s0, v40, 3510; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1511; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload512; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]513; FLATSCR-NEXT: s_mov_b32 s33, s0514; FLATSCR-NEXT: s_waitcnt vmcnt(0)515; FLATSCR-NEXT: s_setpc_b64 s[30:31]516 %s40 = call i32 asm sideeffect "; def s40", "={s40}"() #0517 call void @external_void_func_void()518 call void asm sideeffect "; use $0", "s"(i32 %s40) #0519 ret void520}521 522define amdgpu_kernel void @callee_saved_sgpr_kernel() #2 {523; FLATSCR-LABEL: callee_saved_sgpr_kernel:524; FLATSCR: ; %bb.0:525; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13526; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0527; FLATSCR-NEXT: s_getpc_b64 s[0:1]528; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4529; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12530; FLATSCR-NEXT: s_mov_b32 s32, 0531; FLATSCR-NEXT: ;;#ASMSTART532; FLATSCR-NEXT: ; def s40533; FLATSCR-NEXT: ;;#ASMEND534; FLATSCR-NEXT: s_mov_b32 s33, s40535; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]536; FLATSCR-NEXT: ;;#ASMSTART537; FLATSCR-NEXT: ; use s33538; FLATSCR-NEXT: ;;#ASMEND539; FLATSCR-NEXT: s_endpgm540 %s40 = call i32 asm sideeffect "; def s40", "={s40}"() #0541 call void @external_void_func_void()542 call void asm sideeffect "; use $0", "s"(i32 %s40) #0543 ret void544}545 546; First call preserved VGPR is used so it can't be used for SGPR spills.547define void @callee_saved_sgpr_vgpr_func() #2 {548; MUBUF-LABEL: callee_saved_sgpr_vgpr_func:549; MUBUF: ; %bb.0:550; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)551; MUBUF-NEXT: s_mov_b32 s4, s33552; MUBUF-NEXT: s_mov_b32 s33, s32553; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1554; MUBUF-NEXT: buffer_store_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill555; MUBUF-NEXT: s_mov_b64 exec, s[6:7]556; MUBUF-NEXT: v_writelane_b32 v41, s4, 3557; MUBUF-NEXT: s_addk_i32 s32, 0x400558; MUBUF-NEXT: v_writelane_b32 v41, s30, 0559; MUBUF-NEXT: v_writelane_b32 v41, s31, 1560; MUBUF-NEXT: s_getpc_b64 s[4:5]561; MUBUF-NEXT: s_add_u32 s4, s4, external_void_func_void@rel32@lo+4562; MUBUF-NEXT: s_addc_u32 s5, s5, external_void_func_void@rel32@hi+12563; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill564; MUBUF-NEXT: v_writelane_b32 v41, s34, 2565; MUBUF-NEXT: ;;#ASMSTART566; MUBUF-NEXT: ; def s40567; MUBUF-NEXT: ;;#ASMEND568; MUBUF-NEXT: s_mov_b32 s34, s40569; MUBUF-NEXT: ;;#ASMSTART570; MUBUF-NEXT: ; def v40571; MUBUF-NEXT: ;;#ASMEND572; MUBUF-NEXT: s_swappc_b64 s[30:31], s[4:5]573; MUBUF-NEXT: ;;#ASMSTART574; MUBUF-NEXT: ; use s34575; MUBUF-NEXT: ;;#ASMEND576; MUBUF-NEXT: ;;#ASMSTART577; MUBUF-NEXT: ; use v40578; MUBUF-NEXT: ;;#ASMEND579; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload580; MUBUF-NEXT: v_readlane_b32 s34, v41, 2581; MUBUF-NEXT: v_readlane_b32 s31, v41, 1582; MUBUF-NEXT: v_readlane_b32 s30, v41, 0583; MUBUF-NEXT: s_mov_b32 s32, s33584; MUBUF-NEXT: v_readlane_b32 s4, v41, 3585; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1586; MUBUF-NEXT: buffer_load_dword v41, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload587; MUBUF-NEXT: s_mov_b64 exec, s[6:7]588; MUBUF-NEXT: s_mov_b32 s33, s4589; MUBUF-NEXT: s_waitcnt vmcnt(0)590; MUBUF-NEXT: s_setpc_b64 s[30:31]591;592; FLATSCR-LABEL: callee_saved_sgpr_vgpr_func:593; FLATSCR: ; %bb.0:594; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)595; FLATSCR-NEXT: s_mov_b32 s0, s33596; FLATSCR-NEXT: s_mov_b32 s33, s32597; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1598; FLATSCR-NEXT: scratch_store_dword off, v41, s33 offset:4 ; 4-byte Folded Spill599; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]600; FLATSCR-NEXT: v_writelane_b32 v41, s0, 3601; FLATSCR-NEXT: s_add_i32 s32, s32, 16602; FLATSCR-NEXT: v_writelane_b32 v41, s30, 0603; FLATSCR-NEXT: v_writelane_b32 v41, s31, 1604; FLATSCR-NEXT: s_getpc_b64 s[0:1]605; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4606; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12607; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill608; FLATSCR-NEXT: v_writelane_b32 v41, s34, 2609; FLATSCR-NEXT: ;;#ASMSTART610; FLATSCR-NEXT: ; def s40611; FLATSCR-NEXT: ;;#ASMEND612; FLATSCR-NEXT: s_mov_b32 s34, s40613; FLATSCR-NEXT: ;;#ASMSTART614; FLATSCR-NEXT: ; def v40615; FLATSCR-NEXT: ;;#ASMEND616; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]617; FLATSCR-NEXT: ;;#ASMSTART618; FLATSCR-NEXT: ; use s34619; FLATSCR-NEXT: ;;#ASMEND620; FLATSCR-NEXT: ;;#ASMSTART621; FLATSCR-NEXT: ; use v40622; FLATSCR-NEXT: ;;#ASMEND623; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload624; FLATSCR-NEXT: v_readlane_b32 s34, v41, 2625; FLATSCR-NEXT: v_readlane_b32 s31, v41, 1626; FLATSCR-NEXT: v_readlane_b32 s30, v41, 0627; FLATSCR-NEXT: s_mov_b32 s32, s33628; FLATSCR-NEXT: v_readlane_b32 s0, v41, 3629; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1630; FLATSCR-NEXT: scratch_load_dword v41, off, s33 offset:4 ; 4-byte Folded Reload631; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]632; FLATSCR-NEXT: s_mov_b32 s33, s0633; FLATSCR-NEXT: s_waitcnt vmcnt(0)634; FLATSCR-NEXT: s_setpc_b64 s[30:31]635 %s40 = call i32 asm sideeffect "; def s40", "={s40}"() #0636 %v40 = call i32 asm sideeffect "; def v40", "={v40}"() #0637 call void @external_void_func_void()638 call void asm sideeffect "; use $0", "s"(i32 %s40) #0639 call void asm sideeffect "; use $0", "v"(i32 %v40) #0640 ret void641}642 643define amdgpu_kernel void @callee_saved_sgpr_vgpr_kernel() #2 {644; FLATSCR-LABEL: callee_saved_sgpr_vgpr_kernel:645; FLATSCR: ; %bb.0:646; FLATSCR-NEXT: s_add_u32 flat_scratch_lo, s8, s13647; FLATSCR-NEXT: s_addc_u32 flat_scratch_hi, s9, 0648; FLATSCR-NEXT: s_getpc_b64 s[0:1]649; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4650; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12651; FLATSCR-NEXT: s_mov_b32 s32, 0652; FLATSCR-NEXT: ;;#ASMSTART653; FLATSCR-NEXT: ; def s40654; FLATSCR-NEXT: ;;#ASMEND655; FLATSCR-NEXT: s_mov_b32 s33, s40656; FLATSCR-NEXT: ;;#ASMSTART657; FLATSCR-NEXT: ; def v32658; FLATSCR-NEXT: ;;#ASMEND659; FLATSCR-NEXT: v_mov_b32_e32 v40, v32660; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]661; FLATSCR-NEXT: ;;#ASMSTART662; FLATSCR-NEXT: ; use s33663; FLATSCR-NEXT: ;;#ASMEND664; FLATSCR-NEXT: ;;#ASMSTART665; FLATSCR-NEXT: ; use v40666; FLATSCR-NEXT: ;;#ASMEND667; FLATSCR-NEXT: s_endpgm668 %s40 = call i32 asm sideeffect "; def s40", "={s40}"() #0669 %v32 = call i32 asm sideeffect "; def v32", "={v32}"() #0670 call void @external_void_func_void()671 call void asm sideeffect "; use $0", "s"(i32 %s40) #0672 call void asm sideeffect "; use $0", "v"(i32 %v32) #0673 ret void674}675 676attributes #0 = { nounwind }677attributes #1 = { nounwind readnone }678attributes #2 = { nounwind noinline }679attributes #3 = { nounwind "amdgpu-no-dispatch-id" "amdgpu-no-dispatch-ptr" "amdgpu-no-implicitarg-ptr" "amdgpu-no-lds-kernel-id" "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" }680;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:681; GISEL: {{.*}}682; SDAG: {{.*}}683