1925 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=amdgcn -mcpu=hawaii < %s | FileCheck -enable-var-scope -check-prefixes=GCN,MUBUF %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefixes=GCN,MUBUF %s4; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -mattr=+enable-flat-scratch < %s | FileCheck -enable-var-scope -check-prefixes=GCN,FLATSCR %s5 6define void @callee_no_stack() #0 {7; GCN-LABEL: callee_no_stack:8; GCN: ; %bb.0:9; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)10; GCN-NEXT: s_setpc_b64 s[30:31]11 ret void12}13 14define void @callee_no_stack_no_fp_elim_all() #1 {15; MUBUF-LABEL: callee_no_stack_no_fp_elim_all:16; MUBUF: ; %bb.0:17; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)18; MUBUF-NEXT: s_mov_b32 s4, s3319; MUBUF-NEXT: s_mov_b32 s33, s3220; MUBUF-NEXT: s_mov_b32 s33, s421; MUBUF-NEXT: s_setpc_b64 s[30:31]22;23; FLATSCR-LABEL: callee_no_stack_no_fp_elim_all:24; FLATSCR: ; %bb.0:25; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; FLATSCR-NEXT: s_mov_b32 s0, s3327; FLATSCR-NEXT: s_mov_b32 s33, s3228; FLATSCR-NEXT: s_mov_b32 s33, s029; FLATSCR-NEXT: s_setpc_b64 s[30:31]30 ret void31}32 33define void @callee_no_stack_no_fp_elim_nonleaf() #2 {34; GCN-LABEL: callee_no_stack_no_fp_elim_nonleaf:35; GCN: ; %bb.0:36; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)37; GCN-NEXT: s_setpc_b64 s[30:31]38 ret void39}40 41define void @callee_with_stack() #0 {42; MUBUF-LABEL: callee_with_stack:43; MUBUF: ; %bb.0:44; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)45; MUBUF-NEXT: v_mov_b32_e32 v0, 046; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s3247; MUBUF-NEXT: s_waitcnt vmcnt(0)48; MUBUF-NEXT: s_setpc_b64 s[30:31]49;50; FLATSCR-LABEL: callee_with_stack:51; FLATSCR: ; %bb.0:52; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)53; FLATSCR-NEXT: v_mov_b32_e32 v0, 054; FLATSCR-NEXT: scratch_store_dword off, v0, s3255; FLATSCR-NEXT: s_waitcnt vmcnt(0)56; FLATSCR-NEXT: s_setpc_b64 s[30:31]57 %alloca = alloca i32, addrspace(5)58 store volatile i32 0, ptr addrspace(5) %alloca59 ret void60}61 62; Can use free call clobbered register to preserve original FP value.63define void @callee_with_stack_no_fp_elim_all() #1 {64; MUBUF-LABEL: callee_with_stack_no_fp_elim_all:65; MUBUF: ; %bb.0:66; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)67; MUBUF-NEXT: s_mov_b32 s4, s3368; MUBUF-NEXT: s_mov_b32 s33, s3269; MUBUF-NEXT: s_addk_i32 s32, 0x20070; MUBUF-NEXT: v_mov_b32_e32 v0, 071; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s3372; MUBUF-NEXT: s_waitcnt vmcnt(0)73; MUBUF-NEXT: s_mov_b32 s32, s3374; MUBUF-NEXT: s_mov_b32 s33, s475; MUBUF-NEXT: s_setpc_b64 s[30:31]76;77; FLATSCR-LABEL: callee_with_stack_no_fp_elim_all:78; FLATSCR: ; %bb.0:79; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; FLATSCR-NEXT: s_mov_b32 s0, s3381; FLATSCR-NEXT: s_mov_b32 s33, s3282; FLATSCR-NEXT: s_add_i32 s32, s32, 883; FLATSCR-NEXT: v_mov_b32_e32 v0, 084; FLATSCR-NEXT: scratch_store_dword off, v0, s3385; FLATSCR-NEXT: s_waitcnt vmcnt(0)86; FLATSCR-NEXT: s_mov_b32 s32, s3387; FLATSCR-NEXT: s_mov_b32 s33, s088; FLATSCR-NEXT: s_setpc_b64 s[30:31]89 %alloca = alloca i32, addrspace(5)90 store volatile i32 0, ptr addrspace(5) %alloca91 ret void92}93 94define void @callee_with_stack_no_fp_elim_non_leaf() #2 {95; MUBUF-LABEL: callee_with_stack_no_fp_elim_non_leaf:96; MUBUF: ; %bb.0:97; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)98; MUBUF-NEXT: v_mov_b32_e32 v0, 099; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s32100; MUBUF-NEXT: s_waitcnt vmcnt(0)101; MUBUF-NEXT: s_setpc_b64 s[30:31]102;103; FLATSCR-LABEL: callee_with_stack_no_fp_elim_non_leaf:104; FLATSCR: ; %bb.0:105; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)106; FLATSCR-NEXT: v_mov_b32_e32 v0, 0107; FLATSCR-NEXT: scratch_store_dword off, v0, s32108; FLATSCR-NEXT: s_waitcnt vmcnt(0)109; FLATSCR-NEXT: s_setpc_b64 s[30:31]110 %alloca = alloca i32, addrspace(5)111 store volatile i32 0, ptr addrspace(5) %alloca112 ret void113}114 115define void @callee_with_stack_and_call() #0 {116; MUBUF-LABEL: callee_with_stack_and_call:117; MUBUF: ; %bb.0:118; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)119; MUBUF-NEXT: s_mov_b32 s16, s33120; MUBUF-NEXT: s_mov_b32 s33, s32121; MUBUF-NEXT: s_or_saveexec_b64 s[18:19], -1122; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill123; MUBUF-NEXT: s_mov_b64 exec, s[18:19]124; MUBUF-NEXT: v_writelane_b32 v40, s16, 2125; MUBUF-NEXT: s_addk_i32 s32, 0x400126; MUBUF-NEXT: v_writelane_b32 v40, s30, 0127; MUBUF-NEXT: v_mov_b32_e32 v0, 0128; MUBUF-NEXT: s_getpc_b64 s[16:17]129; MUBUF-NEXT: s_add_u32 s16, s16, external_void_func_void@rel32@lo+4130; MUBUF-NEXT: s_addc_u32 s17, s17, external_void_func_void@rel32@hi+12131; MUBUF-NEXT: v_writelane_b32 v40, s31, 1132; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s33133; MUBUF-NEXT: s_waitcnt vmcnt(0)134; MUBUF-NEXT: s_swappc_b64 s[30:31], s[16:17]135; MUBUF-NEXT: v_readlane_b32 s31, v40, 1136; MUBUF-NEXT: v_readlane_b32 s30, v40, 0137; MUBUF-NEXT: s_mov_b32 s32, s33138; MUBUF-NEXT: v_readlane_b32 s4, v40, 2139; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1140; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload141; MUBUF-NEXT: s_mov_b64 exec, s[6:7]142; MUBUF-NEXT: s_mov_b32 s33, s4143; MUBUF-NEXT: s_waitcnt vmcnt(0)144; MUBUF-NEXT: s_setpc_b64 s[30:31]145;146; FLATSCR-LABEL: callee_with_stack_and_call:147; FLATSCR: ; %bb.0:148; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)149; FLATSCR-NEXT: s_mov_b32 s0, s33150; FLATSCR-NEXT: s_mov_b32 s33, s32151; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1152; FLATSCR-NEXT: scratch_store_dword off, v40, s33 offset:4 ; 4-byte Folded Spill153; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]154; FLATSCR-NEXT: v_writelane_b32 v40, s0, 2155; FLATSCR-NEXT: s_add_i32 s32, s32, 16156; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0157; FLATSCR-NEXT: v_mov_b32_e32 v0, 0158; FLATSCR-NEXT: s_getpc_b64 s[0:1]159; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4160; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12161; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1162; FLATSCR-NEXT: scratch_store_dword off, v0, s33163; FLATSCR-NEXT: s_waitcnt vmcnt(0)164; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]165; FLATSCR-NEXT: v_readlane_b32 s31, v40, 1166; FLATSCR-NEXT: v_readlane_b32 s30, v40, 0167; FLATSCR-NEXT: s_mov_b32 s32, s33168; FLATSCR-NEXT: v_readlane_b32 s0, v40, 2169; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1170; FLATSCR-NEXT: scratch_load_dword v40, off, s33 offset:4 ; 4-byte Folded Reload171; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]172; FLATSCR-NEXT: s_mov_b32 s33, s0173; FLATSCR-NEXT: s_waitcnt vmcnt(0)174; FLATSCR-NEXT: s_setpc_b64 s[30:31]175 %alloca = alloca i32, addrspace(5)176 store volatile i32 0, ptr addrspace(5) %alloca177 call void @external_void_func_void()178 ret void179}180 181; Should be able to copy incoming stack pointer directly to inner182; call's stack pointer argument.183 184; There is stack usage only because of the need to evict a VGPR for185; spilling CSR SGPRs.186 187define void @callee_no_stack_with_call() #0 {188; MUBUF-LABEL: callee_no_stack_with_call:189; MUBUF: ; %bb.0:190; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)191; MUBUF-NEXT: s_mov_b32 s16, s33192; MUBUF-NEXT: s_mov_b32 s33, s32193; MUBUF-NEXT: s_or_saveexec_b64 s[18:19], -1194; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill195; MUBUF-NEXT: s_mov_b64 exec, s[18:19]196; MUBUF-NEXT: v_writelane_b32 v40, s16, 2197; MUBUF-NEXT: s_addk_i32 s32, 0x400198; MUBUF-NEXT: v_writelane_b32 v40, s30, 0199; MUBUF-NEXT: s_getpc_b64 s[16:17]200; MUBUF-NEXT: s_add_u32 s16, s16, external_void_func_void@rel32@lo+4201; MUBUF-NEXT: s_addc_u32 s17, s17, external_void_func_void@rel32@hi+12202; MUBUF-NEXT: v_writelane_b32 v40, s31, 1203; MUBUF-NEXT: s_swappc_b64 s[30:31], s[16:17]204; MUBUF-NEXT: v_readlane_b32 s31, v40, 1205; MUBUF-NEXT: v_readlane_b32 s30, v40, 0206; MUBUF-NEXT: s_mov_b32 s32, s33207; MUBUF-NEXT: v_readlane_b32 s4, v40, 2208; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -1209; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload210; MUBUF-NEXT: s_mov_b64 exec, s[6:7]211; MUBUF-NEXT: s_mov_b32 s33, s4212; MUBUF-NEXT: s_waitcnt vmcnt(0)213; MUBUF-NEXT: s_setpc_b64 s[30:31]214;215; FLATSCR-LABEL: callee_no_stack_with_call:216; FLATSCR: ; %bb.0:217; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; FLATSCR-NEXT: s_mov_b32 s0, s33219; FLATSCR-NEXT: s_mov_b32 s33, s32220; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1221; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill222; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]223; FLATSCR-NEXT: v_writelane_b32 v40, s0, 2224; FLATSCR-NEXT: s_add_i32 s32, s32, 16225; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0226; FLATSCR-NEXT: s_getpc_b64 s[0:1]227; FLATSCR-NEXT: s_add_u32 s0, s0, external_void_func_void@rel32@lo+4228; FLATSCR-NEXT: s_addc_u32 s1, s1, external_void_func_void@rel32@hi+12229; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1230; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]231; FLATSCR-NEXT: v_readlane_b32 s31, v40, 1232; FLATSCR-NEXT: v_readlane_b32 s30, v40, 0233; FLATSCR-NEXT: s_mov_b32 s32, s33234; FLATSCR-NEXT: v_readlane_b32 s0, v40, 2235; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -1236; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload237; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]238; FLATSCR-NEXT: s_mov_b32 s33, s0239; FLATSCR-NEXT: s_waitcnt vmcnt(0)240; FLATSCR-NEXT: s_setpc_b64 s[30:31]241 call void @external_void_func_void()242 ret void243}244 245declare hidden void @external_void_func_void() #0246 247; Make sure if a CSR vgpr is used for SGPR spilling, it is saved and248; restored. No FP is required.249define void @callee_func_sgpr_spill_no_calls(i32 %in) #0 {250; MUBUF-LABEL: callee_func_sgpr_spill_no_calls:251; MUBUF: ; %bb.0:252; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)253; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -1254; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill255; MUBUF-NEXT: s_mov_b64 exec, s[4:5]256; MUBUF-NEXT: v_writelane_b32 v40, s36, 0257; MUBUF-NEXT: v_writelane_b32 v40, s37, 1258; MUBUF-NEXT: v_writelane_b32 v40, s38, 2259; MUBUF-NEXT: v_writelane_b32 v40, s39, 3260; MUBUF-NEXT: v_writelane_b32 v40, s48, 4261; MUBUF-NEXT: v_writelane_b32 v40, s49, 5262; MUBUF-NEXT: v_writelane_b32 v40, s50, 6263; MUBUF-NEXT: v_writelane_b32 v40, s51, 7264; MUBUF-NEXT: v_writelane_b32 v40, s52, 8265; MUBUF-NEXT: v_writelane_b32 v40, s53, 9266; MUBUF-NEXT: v_writelane_b32 v40, s54, 10267; MUBUF-NEXT: v_writelane_b32 v40, s55, 11268; MUBUF-NEXT: v_writelane_b32 v40, s64, 12269; MUBUF-NEXT: v_writelane_b32 v40, s65, 13270; MUBUF-NEXT: v_writelane_b32 v40, s66, 14271; MUBUF-NEXT: v_writelane_b32 v40, s67, 15272; MUBUF-NEXT: v_writelane_b32 v40, s68, 16273; MUBUF-NEXT: v_writelane_b32 v40, s69, 17274; MUBUF-NEXT: v_writelane_b32 v40, s70, 18275; MUBUF-NEXT: v_writelane_b32 v40, s71, 19276; MUBUF-NEXT: v_writelane_b32 v40, s80, 20277; MUBUF-NEXT: v_writelane_b32 v40, s81, 21278; MUBUF-NEXT: v_writelane_b32 v40, s82, 22279; MUBUF-NEXT: v_writelane_b32 v40, s83, 23280; MUBUF-NEXT: ;;#ASMSTART281; MUBUF-NEXT: ;;#ASMEND282; MUBUF-NEXT: ;;#ASMSTART283; MUBUF-NEXT: ;;#ASMEND284; MUBUF-NEXT: ;;#ASMSTART285; MUBUF-NEXT: ;;#ASMEND286; MUBUF-NEXT: ;;#ASMSTART287; MUBUF-NEXT: ;;#ASMEND288; MUBUF-NEXT: ;;#ASMSTART289; MUBUF-NEXT: ;;#ASMEND290; MUBUF-NEXT: ;;#ASMSTART291; MUBUF-NEXT: ; def s[68:83]292; MUBUF-NEXT: ;;#ASMEND293; MUBUF-NEXT: ;;#ASMSTART294; MUBUF-NEXT: ; def s[52:67]295; MUBUF-NEXT: ;;#ASMEND296; MUBUF-NEXT: ;;#ASMSTART297; MUBUF-NEXT: ; def s[36:51]298; MUBUF-NEXT: ;;#ASMEND299; MUBUF-NEXT: ;;#ASMSTART300; MUBUF-NEXT: ; def s[4:19]301; MUBUF-NEXT: ;;#ASMEND302; MUBUF-NEXT: ;;#ASMSTART303; MUBUF-NEXT: ; def s[20:27]304; MUBUF-NEXT: ;;#ASMEND305; MUBUF-NEXT: ;;#ASMSTART306; MUBUF-NEXT: ; def s[28:29]307; MUBUF-NEXT: ;;#ASMEND308; MUBUF-NEXT: ;;#ASMSTART309; MUBUF-NEXT: ; use s[68:83]310; MUBUF-NEXT: ;;#ASMEND311; MUBUF-NEXT: ;;#ASMSTART312; MUBUF-NEXT: ; use s[52:67]313; MUBUF-NEXT: ;;#ASMEND314; MUBUF-NEXT: ;;#ASMSTART315; MUBUF-NEXT: ; use s[36:51]316; MUBUF-NEXT: ;;#ASMEND317; MUBUF-NEXT: ;;#ASMSTART318; MUBUF-NEXT: ; use s[20:27]319; MUBUF-NEXT: ;;#ASMEND320; MUBUF-NEXT: ;;#ASMSTART321; MUBUF-NEXT: ; use s[28:29]322; MUBUF-NEXT: ;;#ASMEND323; MUBUF-NEXT: ;;#ASMSTART324; MUBUF-NEXT: ; use s[4:19]325; MUBUF-NEXT: ;;#ASMEND326; MUBUF-NEXT: v_readlane_b32 s83, v40, 23327; MUBUF-NEXT: v_readlane_b32 s82, v40, 22328; MUBUF-NEXT: v_readlane_b32 s81, v40, 21329; MUBUF-NEXT: v_readlane_b32 s80, v40, 20330; MUBUF-NEXT: v_readlane_b32 s71, v40, 19331; MUBUF-NEXT: v_readlane_b32 s70, v40, 18332; MUBUF-NEXT: v_readlane_b32 s69, v40, 17333; MUBUF-NEXT: v_readlane_b32 s68, v40, 16334; MUBUF-NEXT: v_readlane_b32 s67, v40, 15335; MUBUF-NEXT: v_readlane_b32 s66, v40, 14336; MUBUF-NEXT: v_readlane_b32 s65, v40, 13337; MUBUF-NEXT: v_readlane_b32 s64, v40, 12338; MUBUF-NEXT: v_readlane_b32 s55, v40, 11339; MUBUF-NEXT: v_readlane_b32 s54, v40, 10340; MUBUF-NEXT: v_readlane_b32 s53, v40, 9341; MUBUF-NEXT: v_readlane_b32 s52, v40, 8342; MUBUF-NEXT: v_readlane_b32 s51, v40, 7343; MUBUF-NEXT: v_readlane_b32 s50, v40, 6344; MUBUF-NEXT: v_readlane_b32 s49, v40, 5345; MUBUF-NEXT: v_readlane_b32 s48, v40, 4346; MUBUF-NEXT: v_readlane_b32 s39, v40, 3347; MUBUF-NEXT: v_readlane_b32 s38, v40, 2348; MUBUF-NEXT: v_readlane_b32 s37, v40, 1349; MUBUF-NEXT: v_readlane_b32 s36, v40, 0350; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -1351; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload352; MUBUF-NEXT: s_mov_b64 exec, s[4:5]353; MUBUF-NEXT: s_waitcnt vmcnt(0)354; MUBUF-NEXT: s_setpc_b64 s[30:31]355;356; FLATSCR-LABEL: callee_func_sgpr_spill_no_calls:357; FLATSCR: ; %bb.0:358; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)359; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -1360; FLATSCR-NEXT: scratch_store_dword off, v40, s32 ; 4-byte Folded Spill361; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]362; FLATSCR-NEXT: v_writelane_b32 v40, s30, 0363; FLATSCR-NEXT: v_writelane_b32 v40, s31, 1364; FLATSCR-NEXT: v_writelane_b32 v40, s36, 2365; FLATSCR-NEXT: v_writelane_b32 v40, s37, 3366; FLATSCR-NEXT: v_writelane_b32 v40, s38, 4367; FLATSCR-NEXT: v_writelane_b32 v40, s39, 5368; FLATSCR-NEXT: v_writelane_b32 v40, s48, 6369; FLATSCR-NEXT: v_writelane_b32 v40, s49, 7370; FLATSCR-NEXT: v_writelane_b32 v40, s50, 8371; FLATSCR-NEXT: v_writelane_b32 v40, s51, 9372; FLATSCR-NEXT: v_writelane_b32 v40, s52, 10373; FLATSCR-NEXT: v_writelane_b32 v40, s53, 11374; FLATSCR-NEXT: v_writelane_b32 v40, s54, 12375; FLATSCR-NEXT: v_writelane_b32 v40, s55, 13376; FLATSCR-NEXT: v_writelane_b32 v40, s64, 14377; FLATSCR-NEXT: v_writelane_b32 v40, s65, 15378; FLATSCR-NEXT: v_writelane_b32 v40, s66, 16379; FLATSCR-NEXT: v_writelane_b32 v40, s67, 17380; FLATSCR-NEXT: ;;#ASMSTART381; FLATSCR-NEXT: ;;#ASMEND382; FLATSCR-NEXT: ;;#ASMSTART383; FLATSCR-NEXT: ;;#ASMEND384; FLATSCR-NEXT: ;;#ASMSTART385; FLATSCR-NEXT: ;;#ASMEND386; FLATSCR-NEXT: ;;#ASMSTART387; FLATSCR-NEXT: ;;#ASMEND388; FLATSCR-NEXT: ;;#ASMSTART389; FLATSCR-NEXT: ;;#ASMEND390; FLATSCR-NEXT: ;;#ASMSTART391; FLATSCR-NEXT: ; def s[52:67]392; FLATSCR-NEXT: ;;#ASMEND393; FLATSCR-NEXT: ;;#ASMSTART394; FLATSCR-NEXT: ; def s[36:51]395; FLATSCR-NEXT: ;;#ASMEND396; FLATSCR-NEXT: ;;#ASMSTART397; FLATSCR-NEXT: ; def s[16:31]398; FLATSCR-NEXT: ;;#ASMEND399; FLATSCR-NEXT: ;;#ASMSTART400; FLATSCR-NEXT: ; def s[0:15]401; FLATSCR-NEXT: ;;#ASMEND402; FLATSCR-NEXT: ;;#ASMSTART403; FLATSCR-NEXT: ; def s[72:79]404; FLATSCR-NEXT: ;;#ASMEND405; FLATSCR-NEXT: ;;#ASMSTART406; FLATSCR-NEXT: ; def s[88:89]407; FLATSCR-NEXT: ;;#ASMEND408; FLATSCR-NEXT: ;;#ASMSTART409; FLATSCR-NEXT: ; use s[52:67]410; FLATSCR-NEXT: ;;#ASMEND411; FLATSCR-NEXT: ;;#ASMSTART412; FLATSCR-NEXT: ; use s[36:51]413; FLATSCR-NEXT: ;;#ASMEND414; FLATSCR-NEXT: ;;#ASMSTART415; FLATSCR-NEXT: ; use s[16:31]416; FLATSCR-NEXT: ;;#ASMEND417; FLATSCR-NEXT: ;;#ASMSTART418; FLATSCR-NEXT: ; use s[72:79]419; FLATSCR-NEXT: ;;#ASMEND420; FLATSCR-NEXT: ;;#ASMSTART421; FLATSCR-NEXT: ; use s[88:89]422; FLATSCR-NEXT: ;;#ASMEND423; FLATSCR-NEXT: ;;#ASMSTART424; FLATSCR-NEXT: ; use s[0:15]425; FLATSCR-NEXT: ;;#ASMEND426; FLATSCR-NEXT: v_readlane_b32 s67, v40, 17427; FLATSCR-NEXT: v_readlane_b32 s66, v40, 16428; FLATSCR-NEXT: v_readlane_b32 s65, v40, 15429; FLATSCR-NEXT: v_readlane_b32 s64, v40, 14430; FLATSCR-NEXT: v_readlane_b32 s55, v40, 13431; FLATSCR-NEXT: v_readlane_b32 s54, v40, 12432; FLATSCR-NEXT: v_readlane_b32 s53, v40, 11433; FLATSCR-NEXT: v_readlane_b32 s52, v40, 10434; FLATSCR-NEXT: v_readlane_b32 s51, v40, 9435; FLATSCR-NEXT: v_readlane_b32 s50, v40, 8436; FLATSCR-NEXT: v_readlane_b32 s49, v40, 7437; FLATSCR-NEXT: v_readlane_b32 s48, v40, 6438; FLATSCR-NEXT: v_readlane_b32 s39, v40, 5439; FLATSCR-NEXT: v_readlane_b32 s38, v40, 4440; FLATSCR-NEXT: v_readlane_b32 s37, v40, 3441; FLATSCR-NEXT: v_readlane_b32 s36, v40, 2442; FLATSCR-NEXT: v_readlane_b32 s31, v40, 1443; FLATSCR-NEXT: v_readlane_b32 s30, v40, 0444; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -1445; FLATSCR-NEXT: scratch_load_dword v40, off, s32 ; 4-byte Folded Reload446; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]447; FLATSCR-NEXT: s_waitcnt vmcnt(0)448; FLATSCR-NEXT: s_setpc_b64 s[30:31]449 call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}"() #0450 call void asm sideeffect "", "~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15}"() #0451 call void asm sideeffect "", "~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23}"() #0452 call void asm sideeffect "", "~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() #0453 call void asm sideeffect "", "~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38},~{v39}"() #0454 455 %wide.sgpr0 = call <16 x i32> asm sideeffect "; def $0", "=s" () #0456 %wide.sgpr1 = call <16 x i32> asm sideeffect "; def $0", "=s" () #0457 %wide.sgpr2 = call <16 x i32> asm sideeffect "; def $0", "=s" () #0458 %wide.sgpr5 = call <16 x i32> asm sideeffect "; def $0", "=s" () #0459 %wide.sgpr3 = call <8 x i32> asm sideeffect "; def $0", "=s" () #0460 %wide.sgpr4 = call <2 x i32> asm sideeffect "; def $0", "=s" () #0461 462 call void asm sideeffect "; use $0", "s"(<16 x i32> %wide.sgpr0) #0463 call void asm sideeffect "; use $0", "s"(<16 x i32> %wide.sgpr1) #0464 call void asm sideeffect "; use $0", "s"(<16 x i32> %wide.sgpr2) #0465 call void asm sideeffect "; use $0", "s"(<8 x i32> %wide.sgpr3) #0466 call void asm sideeffect "; use $0", "s"(<2 x i32> %wide.sgpr4) #0467 call void asm sideeffect "; use $0", "s"(<16 x i32> %wide.sgpr5) #0468 ret void469}470 471; Has no spilled CSR VGPRs used for SGPR spilling, so no need to472; enable all lanes and restore.473define void @spill_only_csr_sgpr() {474; GCN-LABEL: spill_only_csr_sgpr:475; GCN: ; %bb.0:476; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)477; GCN-NEXT: ;;#ASMSTART478; GCN-NEXT: ; clobber s42479; GCN-NEXT: ;;#ASMEND480; GCN-NEXT: s_setpc_b64 s[30:31]481 call void asm sideeffect "; clobber s42", "~{s42}"()482 ret void483}484 485; TODO: Can the SP inc/deec be remvoed?486define void @callee_with_stack_no_fp_elim_csr_vgpr() #1 {487; MUBUF-LABEL: callee_with_stack_no_fp_elim_csr_vgpr:488; MUBUF: ; %bb.0:489; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)490; MUBUF-NEXT: s_mov_b32 s4, s33491; MUBUF-NEXT: s_mov_b32 s33, s32492; MUBUF-NEXT: v_mov_b32_e32 v0, 0493; MUBUF-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill494; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s33 offset:4495; MUBUF-NEXT: s_waitcnt vmcnt(0)496; MUBUF-NEXT: ;;#ASMSTART497; MUBUF-NEXT: ; clobber v41498; MUBUF-NEXT: ;;#ASMEND499; MUBUF-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload500; MUBUF-NEXT: s_addk_i32 s32, 0x300501; MUBUF-NEXT: s_mov_b32 s32, s33502; MUBUF-NEXT: s_mov_b32 s33, s4503; MUBUF-NEXT: s_waitcnt vmcnt(0)504; MUBUF-NEXT: s_setpc_b64 s[30:31]505;506; FLATSCR-LABEL: callee_with_stack_no_fp_elim_csr_vgpr:507; FLATSCR: ; %bb.0:508; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)509; FLATSCR-NEXT: s_mov_b32 s0, s33510; FLATSCR-NEXT: s_mov_b32 s33, s32511; FLATSCR-NEXT: v_mov_b32_e32 v0, 0512; FLATSCR-NEXT: scratch_store_dword off, v41, s33 ; 4-byte Folded Spill513; FLATSCR-NEXT: scratch_store_dword off, v0, s33 offset:4514; FLATSCR-NEXT: s_waitcnt vmcnt(0)515; FLATSCR-NEXT: ;;#ASMSTART516; FLATSCR-NEXT: ; clobber v41517; FLATSCR-NEXT: ;;#ASMEND518; FLATSCR-NEXT: scratch_load_dword v41, off, s33 ; 4-byte Folded Reload519; FLATSCR-NEXT: s_add_i32 s32, s32, 12520; FLATSCR-NEXT: s_mov_b32 s32, s33521; FLATSCR-NEXT: s_mov_b32 s33, s0522; FLATSCR-NEXT: s_waitcnt vmcnt(0)523; FLATSCR-NEXT: s_setpc_b64 s[30:31]524 %alloca = alloca i32, addrspace(5)525 store volatile i32 0, ptr addrspace(5) %alloca526 call void asm sideeffect "; clobber v41", "~{v41}"()527 ret void528}529 530; Use a copy to a free SGPR instead of introducing a second CSR VGPR.531define void @last_lane_vgpr_for_fp_csr() #1 {532; MUBUF-LABEL: last_lane_vgpr_for_fp_csr:533; MUBUF: ; %bb.0:534; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)535; MUBUF-NEXT: s_mov_b32 s4, s33536; MUBUF-NEXT: s_mov_b32 s33, s32537; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -1538; MUBUF-NEXT: buffer_store_dword v1, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill539; MUBUF-NEXT: s_mov_b64 exec, s[6:7]540; MUBUF-NEXT: v_writelane_b32 v1, s48, 0541; MUBUF-NEXT: v_writelane_b32 v1, s49, 1542; MUBUF-NEXT: v_writelane_b32 v1, s50, 2543; MUBUF-NEXT: v_writelane_b32 v1, s51, 3544; MUBUF-NEXT: v_writelane_b32 v1, s52, 4545; MUBUF-NEXT: v_writelane_b32 v1, s53, 5546; MUBUF-NEXT: v_writelane_b32 v1, s54, 6547; MUBUF-NEXT: v_writelane_b32 v1, s55, 7548; MUBUF-NEXT: v_writelane_b32 v1, s64, 8549; MUBUF-NEXT: v_writelane_b32 v1, s65, 9550; MUBUF-NEXT: v_writelane_b32 v1, s66, 10551; MUBUF-NEXT: v_writelane_b32 v1, s67, 11552; MUBUF-NEXT: v_writelane_b32 v1, s68, 12553; MUBUF-NEXT: v_writelane_b32 v1, s69, 13554; MUBUF-NEXT: v_writelane_b32 v1, s70, 14555; MUBUF-NEXT: v_writelane_b32 v1, s71, 15556; MUBUF-NEXT: v_writelane_b32 v1, s80, 16557; MUBUF-NEXT: v_writelane_b32 v1, s81, 17558; MUBUF-NEXT: v_writelane_b32 v1, s82, 18559; MUBUF-NEXT: v_writelane_b32 v1, s83, 19560; MUBUF-NEXT: v_writelane_b32 v1, s84, 20561; MUBUF-NEXT: v_writelane_b32 v1, s85, 21562; MUBUF-NEXT: v_writelane_b32 v1, s86, 22563; MUBUF-NEXT: v_writelane_b32 v1, s87, 23564; MUBUF-NEXT: v_writelane_b32 v1, s96, 24565; MUBUF-NEXT: v_writelane_b32 v1, s97, 25566; MUBUF-NEXT: v_writelane_b32 v1, s98, 26567; MUBUF-NEXT: v_writelane_b32 v1, s99, 27568; MUBUF-NEXT: v_writelane_b32 v1, s100, 28569; MUBUF-NEXT: v_mov_b32_e32 v0, 0570; MUBUF-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill571; MUBUF-NEXT: v_writelane_b32 v1, s101, 29572; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s33 offset:4573; MUBUF-NEXT: s_waitcnt vmcnt(0)574; MUBUF-NEXT: ;;#ASMSTART575; MUBUF-NEXT: ; clobber v41576; MUBUF-NEXT: ;;#ASMEND577; MUBUF-NEXT: v_writelane_b32 v1, s102, 30578; MUBUF-NEXT: ;;#ASMSTART579; MUBUF-NEXT: ;;#ASMEND580; MUBUF-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload581; MUBUF-NEXT: s_addk_i32 s32, 0x400582; MUBUF-NEXT: v_readlane_b32 s102, v1, 30583; MUBUF-NEXT: v_readlane_b32 s101, v1, 29584; MUBUF-NEXT: v_readlane_b32 s100, v1, 28585; MUBUF-NEXT: v_readlane_b32 s99, v1, 27586; MUBUF-NEXT: v_readlane_b32 s98, v1, 26587; MUBUF-NEXT: v_readlane_b32 s97, v1, 25588; MUBUF-NEXT: v_readlane_b32 s96, v1, 24589; MUBUF-NEXT: v_readlane_b32 s87, v1, 23590; MUBUF-NEXT: v_readlane_b32 s86, v1, 22591; MUBUF-NEXT: v_readlane_b32 s85, v1, 21592; MUBUF-NEXT: v_readlane_b32 s84, v1, 20593; MUBUF-NEXT: v_readlane_b32 s83, v1, 19594; MUBUF-NEXT: v_readlane_b32 s82, v1, 18595; MUBUF-NEXT: v_readlane_b32 s81, v1, 17596; MUBUF-NEXT: v_readlane_b32 s80, v1, 16597; MUBUF-NEXT: v_readlane_b32 s71, v1, 15598; MUBUF-NEXT: v_readlane_b32 s70, v1, 14599; MUBUF-NEXT: v_readlane_b32 s69, v1, 13600; MUBUF-NEXT: v_readlane_b32 s68, v1, 12601; MUBUF-NEXT: v_readlane_b32 s67, v1, 11602; MUBUF-NEXT: v_readlane_b32 s66, v1, 10603; MUBUF-NEXT: v_readlane_b32 s65, v1, 9604; MUBUF-NEXT: v_readlane_b32 s64, v1, 8605; MUBUF-NEXT: v_readlane_b32 s55, v1, 7606; MUBUF-NEXT: v_readlane_b32 s54, v1, 6607; MUBUF-NEXT: v_readlane_b32 s53, v1, 5608; MUBUF-NEXT: v_readlane_b32 s52, v1, 4609; MUBUF-NEXT: v_readlane_b32 s51, v1, 3610; MUBUF-NEXT: v_readlane_b32 s50, v1, 2611; MUBUF-NEXT: v_readlane_b32 s49, v1, 1612; MUBUF-NEXT: v_readlane_b32 s48, v1, 0613; MUBUF-NEXT: s_mov_b32 s32, s33614; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -1615; MUBUF-NEXT: buffer_load_dword v1, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload616; MUBUF-NEXT: s_mov_b64 exec, s[6:7]617; MUBUF-NEXT: s_mov_b32 s33, s4618; MUBUF-NEXT: s_waitcnt vmcnt(0)619; MUBUF-NEXT: s_setpc_b64 s[30:31]620;621; FLATSCR-LABEL: last_lane_vgpr_for_fp_csr:622; FLATSCR: ; %bb.0:623; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)624; FLATSCR-NEXT: s_mov_b32 s0, s33625; FLATSCR-NEXT: s_mov_b32 s33, s32626; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -1627; FLATSCR-NEXT: scratch_store_dword off, v1, s33 offset:8 ; 4-byte Folded Spill628; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]629; FLATSCR-NEXT: v_writelane_b32 v1, s48, 0630; FLATSCR-NEXT: v_writelane_b32 v1, s49, 1631; FLATSCR-NEXT: v_writelane_b32 v1, s50, 2632; FLATSCR-NEXT: v_writelane_b32 v1, s51, 3633; FLATSCR-NEXT: v_writelane_b32 v1, s52, 4634; FLATSCR-NEXT: v_writelane_b32 v1, s53, 5635; FLATSCR-NEXT: v_writelane_b32 v1, s54, 6636; FLATSCR-NEXT: v_writelane_b32 v1, s55, 7637; FLATSCR-NEXT: v_writelane_b32 v1, s64, 8638; FLATSCR-NEXT: v_writelane_b32 v1, s65, 9639; FLATSCR-NEXT: v_writelane_b32 v1, s66, 10640; FLATSCR-NEXT: v_writelane_b32 v1, s67, 11641; FLATSCR-NEXT: v_writelane_b32 v1, s68, 12642; FLATSCR-NEXT: v_writelane_b32 v1, s69, 13643; FLATSCR-NEXT: v_writelane_b32 v1, s70, 14644; FLATSCR-NEXT: v_writelane_b32 v1, s71, 15645; FLATSCR-NEXT: v_writelane_b32 v1, s80, 16646; FLATSCR-NEXT: v_writelane_b32 v1, s81, 17647; FLATSCR-NEXT: v_writelane_b32 v1, s82, 18648; FLATSCR-NEXT: v_writelane_b32 v1, s83, 19649; FLATSCR-NEXT: v_writelane_b32 v1, s84, 20650; FLATSCR-NEXT: v_writelane_b32 v1, s85, 21651; FLATSCR-NEXT: v_writelane_b32 v1, s86, 22652; FLATSCR-NEXT: v_writelane_b32 v1, s87, 23653; FLATSCR-NEXT: v_writelane_b32 v1, s96, 24654; FLATSCR-NEXT: v_writelane_b32 v1, s97, 25655; FLATSCR-NEXT: v_writelane_b32 v1, s98, 26656; FLATSCR-NEXT: v_writelane_b32 v1, s99, 27657; FLATSCR-NEXT: v_writelane_b32 v1, s100, 28658; FLATSCR-NEXT: v_mov_b32_e32 v0, 0659; FLATSCR-NEXT: scratch_store_dword off, v41, s33 ; 4-byte Folded Spill660; FLATSCR-NEXT: v_writelane_b32 v1, s101, 29661; FLATSCR-NEXT: scratch_store_dword off, v0, s33 offset:4662; FLATSCR-NEXT: s_waitcnt vmcnt(0)663; FLATSCR-NEXT: ;;#ASMSTART664; FLATSCR-NEXT: ; clobber v41665; FLATSCR-NEXT: ;;#ASMEND666; FLATSCR-NEXT: v_writelane_b32 v1, s102, 30667; FLATSCR-NEXT: ;;#ASMSTART668; FLATSCR-NEXT: ;;#ASMEND669; FLATSCR-NEXT: scratch_load_dword v41, off, s33 ; 4-byte Folded Reload670; FLATSCR-NEXT: s_add_i32 s32, s32, 16671; FLATSCR-NEXT: v_readlane_b32 s102, v1, 30672; FLATSCR-NEXT: v_readlane_b32 s101, v1, 29673; FLATSCR-NEXT: v_readlane_b32 s100, v1, 28674; FLATSCR-NEXT: v_readlane_b32 s99, v1, 27675; FLATSCR-NEXT: v_readlane_b32 s98, v1, 26676; FLATSCR-NEXT: v_readlane_b32 s97, v1, 25677; FLATSCR-NEXT: v_readlane_b32 s96, v1, 24678; FLATSCR-NEXT: v_readlane_b32 s87, v1, 23679; FLATSCR-NEXT: v_readlane_b32 s86, v1, 22680; FLATSCR-NEXT: v_readlane_b32 s85, v1, 21681; FLATSCR-NEXT: v_readlane_b32 s84, v1, 20682; FLATSCR-NEXT: v_readlane_b32 s83, v1, 19683; FLATSCR-NEXT: v_readlane_b32 s82, v1, 18684; FLATSCR-NEXT: v_readlane_b32 s81, v1, 17685; FLATSCR-NEXT: v_readlane_b32 s80, v1, 16686; FLATSCR-NEXT: v_readlane_b32 s71, v1, 15687; FLATSCR-NEXT: v_readlane_b32 s70, v1, 14688; FLATSCR-NEXT: v_readlane_b32 s69, v1, 13689; FLATSCR-NEXT: v_readlane_b32 s68, v1, 12690; FLATSCR-NEXT: v_readlane_b32 s67, v1, 11691; FLATSCR-NEXT: v_readlane_b32 s66, v1, 10692; FLATSCR-NEXT: v_readlane_b32 s65, v1, 9693; FLATSCR-NEXT: v_readlane_b32 s64, v1, 8694; FLATSCR-NEXT: v_readlane_b32 s55, v1, 7695; FLATSCR-NEXT: v_readlane_b32 s54, v1, 6696; FLATSCR-NEXT: v_readlane_b32 s53, v1, 5697; FLATSCR-NEXT: v_readlane_b32 s52, v1, 4698; FLATSCR-NEXT: v_readlane_b32 s51, v1, 3699; FLATSCR-NEXT: v_readlane_b32 s50, v1, 2700; FLATSCR-NEXT: v_readlane_b32 s49, v1, 1701; FLATSCR-NEXT: v_readlane_b32 s48, v1, 0702; FLATSCR-NEXT: s_mov_b32 s32, s33703; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -1704; FLATSCR-NEXT: scratch_load_dword v1, off, s33 offset:8 ; 4-byte Folded Reload705; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]706; FLATSCR-NEXT: s_mov_b32 s33, s0707; FLATSCR-NEXT: s_waitcnt vmcnt(0)708; FLATSCR-NEXT: s_setpc_b64 s[30:31]709 %alloca = alloca i32, addrspace(5)710 store volatile i32 0, ptr addrspace(5) %alloca711 call void asm sideeffect "; clobber v41", "~{v41}"()712 call void asm sideeffect "",713 "~{s40},~{s41},~{s42},~{s43},~{s44},~{s45},~{s46},~{s47},~{s48},~{s49}714 ,~{s50},~{s51},~{s52},~{s53},~{s54},~{s55},~{s56},~{s57},~{s58},~{s59}715 ,~{s60},~{s61},~{s62},~{s63},~{s64},~{s65},~{s66},~{s67},~{s68},~{s69}716 ,~{s70},~{s71},~{s72},~{s73},~{s74},~{s75},~{s76},~{s77},~{s78},~{s79}717 ,~{s80},~{s81},~{s82},~{s83},~{s84},~{s85},~{s86},~{s87},~{s88},~{s89}718 ,~{s90},~{s91},~{s92},~{s93},~{s94},~{s95},~{s96},~{s97},~{s98},~{s99}719 ,~{s100},~{s101},~{s102}"() #1720 721 ret void722}723 724; Use a copy to a free SGPR instead of introducing a second CSR VGPR.725define void @no_new_vgpr_for_fp_csr() #1 {726; MUBUF-LABEL: no_new_vgpr_for_fp_csr:727; MUBUF: ; %bb.0:728; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)729; MUBUF-NEXT: s_mov_b32 s4, s33730; MUBUF-NEXT: s_mov_b32 s33, s32731; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -1732; MUBUF-NEXT: buffer_store_dword v1, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill733; MUBUF-NEXT: s_mov_b64 exec, s[6:7]734; MUBUF-NEXT: v_writelane_b32 v1, s39, 0735; MUBUF-NEXT: v_writelane_b32 v1, s48, 1736; MUBUF-NEXT: v_writelane_b32 v1, s49, 2737; MUBUF-NEXT: v_writelane_b32 v1, s50, 3738; MUBUF-NEXT: v_writelane_b32 v1, s51, 4739; MUBUF-NEXT: v_writelane_b32 v1, s52, 5740; MUBUF-NEXT: v_writelane_b32 v1, s53, 6741; MUBUF-NEXT: v_writelane_b32 v1, s54, 7742; MUBUF-NEXT: v_writelane_b32 v1, s55, 8743; MUBUF-NEXT: v_writelane_b32 v1, s64, 9744; MUBUF-NEXT: v_writelane_b32 v1, s65, 10745; MUBUF-NEXT: v_writelane_b32 v1, s66, 11746; MUBUF-NEXT: v_writelane_b32 v1, s67, 12747; MUBUF-NEXT: v_writelane_b32 v1, s68, 13748; MUBUF-NEXT: v_writelane_b32 v1, s69, 14749; MUBUF-NEXT: v_writelane_b32 v1, s70, 15750; MUBUF-NEXT: v_writelane_b32 v1, s71, 16751; MUBUF-NEXT: v_writelane_b32 v1, s80, 17752; MUBUF-NEXT: v_writelane_b32 v1, s81, 18753; MUBUF-NEXT: v_writelane_b32 v1, s82, 19754; MUBUF-NEXT: v_writelane_b32 v1, s83, 20755; MUBUF-NEXT: v_writelane_b32 v1, s84, 21756; MUBUF-NEXT: v_writelane_b32 v1, s85, 22757; MUBUF-NEXT: v_writelane_b32 v1, s86, 23758; MUBUF-NEXT: v_writelane_b32 v1, s87, 24759; MUBUF-NEXT: v_writelane_b32 v1, s96, 25760; MUBUF-NEXT: v_writelane_b32 v1, s97, 26761; MUBUF-NEXT: v_writelane_b32 v1, s98, 27762; MUBUF-NEXT: v_writelane_b32 v1, s99, 28763; MUBUF-NEXT: v_writelane_b32 v1, s100, 29764; MUBUF-NEXT: v_mov_b32_e32 v0, 0765; MUBUF-NEXT: buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill766; MUBUF-NEXT: v_writelane_b32 v1, s101, 30767; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s33 offset:4768; MUBUF-NEXT: s_waitcnt vmcnt(0)769; MUBUF-NEXT: ;;#ASMSTART770; MUBUF-NEXT: ; clobber v41771; MUBUF-NEXT: ;;#ASMEND772; MUBUF-NEXT: v_writelane_b32 v1, s102, 31773; MUBUF-NEXT: ;;#ASMSTART774; MUBUF-NEXT: ;;#ASMEND775; MUBUF-NEXT: buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload776; MUBUF-NEXT: s_addk_i32 s32, 0x400777; MUBUF-NEXT: v_readlane_b32 s102, v1, 31778; MUBUF-NEXT: v_readlane_b32 s101, v1, 30779; MUBUF-NEXT: v_readlane_b32 s100, v1, 29780; MUBUF-NEXT: v_readlane_b32 s99, v1, 28781; MUBUF-NEXT: v_readlane_b32 s98, v1, 27782; MUBUF-NEXT: v_readlane_b32 s97, v1, 26783; MUBUF-NEXT: v_readlane_b32 s96, v1, 25784; MUBUF-NEXT: v_readlane_b32 s87, v1, 24785; MUBUF-NEXT: v_readlane_b32 s86, v1, 23786; MUBUF-NEXT: v_readlane_b32 s85, v1, 22787; MUBUF-NEXT: v_readlane_b32 s84, v1, 21788; MUBUF-NEXT: v_readlane_b32 s83, v1, 20789; MUBUF-NEXT: v_readlane_b32 s82, v1, 19790; MUBUF-NEXT: v_readlane_b32 s81, v1, 18791; MUBUF-NEXT: v_readlane_b32 s80, v1, 17792; MUBUF-NEXT: v_readlane_b32 s71, v1, 16793; MUBUF-NEXT: v_readlane_b32 s70, v1, 15794; MUBUF-NEXT: v_readlane_b32 s69, v1, 14795; MUBUF-NEXT: v_readlane_b32 s68, v1, 13796; MUBUF-NEXT: v_readlane_b32 s67, v1, 12797; MUBUF-NEXT: v_readlane_b32 s66, v1, 11798; MUBUF-NEXT: v_readlane_b32 s65, v1, 10799; MUBUF-NEXT: v_readlane_b32 s64, v1, 9800; MUBUF-NEXT: v_readlane_b32 s55, v1, 8801; MUBUF-NEXT: v_readlane_b32 s54, v1, 7802; MUBUF-NEXT: v_readlane_b32 s53, v1, 6803; MUBUF-NEXT: v_readlane_b32 s52, v1, 5804; MUBUF-NEXT: v_readlane_b32 s51, v1, 4805; MUBUF-NEXT: v_readlane_b32 s50, v1, 3806; MUBUF-NEXT: v_readlane_b32 s49, v1, 2807; MUBUF-NEXT: v_readlane_b32 s48, v1, 1808; MUBUF-NEXT: v_readlane_b32 s39, v1, 0809; MUBUF-NEXT: s_mov_b32 s32, s33810; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -1811; MUBUF-NEXT: buffer_load_dword v1, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload812; MUBUF-NEXT: s_mov_b64 exec, s[6:7]813; MUBUF-NEXT: s_mov_b32 s33, s4814; MUBUF-NEXT: s_waitcnt vmcnt(0)815; MUBUF-NEXT: s_setpc_b64 s[30:31]816;817; FLATSCR-LABEL: no_new_vgpr_for_fp_csr:818; FLATSCR: ; %bb.0:819; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)820; FLATSCR-NEXT: s_mov_b32 s0, s33821; FLATSCR-NEXT: s_mov_b32 s33, s32822; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -1823; FLATSCR-NEXT: scratch_store_dword off, v1, s33 offset:8 ; 4-byte Folded Spill824; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]825; FLATSCR-NEXT: v_writelane_b32 v1, s39, 0826; FLATSCR-NEXT: v_writelane_b32 v1, s48, 1827; FLATSCR-NEXT: v_writelane_b32 v1, s49, 2828; FLATSCR-NEXT: v_writelane_b32 v1, s50, 3829; FLATSCR-NEXT: v_writelane_b32 v1, s51, 4830; FLATSCR-NEXT: v_writelane_b32 v1, s52, 5831; FLATSCR-NEXT: v_writelane_b32 v1, s53, 6832; FLATSCR-NEXT: v_writelane_b32 v1, s54, 7833; FLATSCR-NEXT: v_writelane_b32 v1, s55, 8834; FLATSCR-NEXT: v_writelane_b32 v1, s64, 9835; FLATSCR-NEXT: v_writelane_b32 v1, s65, 10836; FLATSCR-NEXT: v_writelane_b32 v1, s66, 11837; FLATSCR-NEXT: v_writelane_b32 v1, s67, 12838; FLATSCR-NEXT: v_writelane_b32 v1, s68, 13839; FLATSCR-NEXT: v_writelane_b32 v1, s69, 14840; FLATSCR-NEXT: v_writelane_b32 v1, s70, 15841; FLATSCR-NEXT: v_writelane_b32 v1, s71, 16842; FLATSCR-NEXT: v_writelane_b32 v1, s80, 17843; FLATSCR-NEXT: v_writelane_b32 v1, s81, 18844; FLATSCR-NEXT: v_writelane_b32 v1, s82, 19845; FLATSCR-NEXT: v_writelane_b32 v1, s83, 20846; FLATSCR-NEXT: v_writelane_b32 v1, s84, 21847; FLATSCR-NEXT: v_writelane_b32 v1, s85, 22848; FLATSCR-NEXT: v_writelane_b32 v1, s86, 23849; FLATSCR-NEXT: v_writelane_b32 v1, s87, 24850; FLATSCR-NEXT: v_writelane_b32 v1, s96, 25851; FLATSCR-NEXT: v_writelane_b32 v1, s97, 26852; FLATSCR-NEXT: v_writelane_b32 v1, s98, 27853; FLATSCR-NEXT: v_writelane_b32 v1, s99, 28854; FLATSCR-NEXT: v_writelane_b32 v1, s100, 29855; FLATSCR-NEXT: v_mov_b32_e32 v0, 0856; FLATSCR-NEXT: scratch_store_dword off, v41, s33 ; 4-byte Folded Spill857; FLATSCR-NEXT: v_writelane_b32 v1, s101, 30858; FLATSCR-NEXT: scratch_store_dword off, v0, s33 offset:4859; FLATSCR-NEXT: s_waitcnt vmcnt(0)860; FLATSCR-NEXT: ;;#ASMSTART861; FLATSCR-NEXT: ; clobber v41862; FLATSCR-NEXT: ;;#ASMEND863; FLATSCR-NEXT: v_writelane_b32 v1, s102, 31864; FLATSCR-NEXT: ;;#ASMSTART865; FLATSCR-NEXT: ;;#ASMEND866; FLATSCR-NEXT: scratch_load_dword v41, off, s33 ; 4-byte Folded Reload867; FLATSCR-NEXT: s_add_i32 s32, s32, 16868; FLATSCR-NEXT: v_readlane_b32 s102, v1, 31869; FLATSCR-NEXT: v_readlane_b32 s101, v1, 30870; FLATSCR-NEXT: v_readlane_b32 s100, v1, 29871; FLATSCR-NEXT: v_readlane_b32 s99, v1, 28872; FLATSCR-NEXT: v_readlane_b32 s98, v1, 27873; FLATSCR-NEXT: v_readlane_b32 s97, v1, 26874; FLATSCR-NEXT: v_readlane_b32 s96, v1, 25875; FLATSCR-NEXT: v_readlane_b32 s87, v1, 24876; FLATSCR-NEXT: v_readlane_b32 s86, v1, 23877; FLATSCR-NEXT: v_readlane_b32 s85, v1, 22878; FLATSCR-NEXT: v_readlane_b32 s84, v1, 21879; FLATSCR-NEXT: v_readlane_b32 s83, v1, 20880; FLATSCR-NEXT: v_readlane_b32 s82, v1, 19881; FLATSCR-NEXT: v_readlane_b32 s81, v1, 18882; FLATSCR-NEXT: v_readlane_b32 s80, v1, 17883; FLATSCR-NEXT: v_readlane_b32 s71, v1, 16884; FLATSCR-NEXT: v_readlane_b32 s70, v1, 15885; FLATSCR-NEXT: v_readlane_b32 s69, v1, 14886; FLATSCR-NEXT: v_readlane_b32 s68, v1, 13887; FLATSCR-NEXT: v_readlane_b32 s67, v1, 12888; FLATSCR-NEXT: v_readlane_b32 s66, v1, 11889; FLATSCR-NEXT: v_readlane_b32 s65, v1, 10890; FLATSCR-NEXT: v_readlane_b32 s64, v1, 9891; FLATSCR-NEXT: v_readlane_b32 s55, v1, 8892; FLATSCR-NEXT: v_readlane_b32 s54, v1, 7893; FLATSCR-NEXT: v_readlane_b32 s53, v1, 6894; FLATSCR-NEXT: v_readlane_b32 s52, v1, 5895; FLATSCR-NEXT: v_readlane_b32 s51, v1, 4896; FLATSCR-NEXT: v_readlane_b32 s50, v1, 3897; FLATSCR-NEXT: v_readlane_b32 s49, v1, 2898; FLATSCR-NEXT: v_readlane_b32 s48, v1, 1899; FLATSCR-NEXT: v_readlane_b32 s39, v1, 0900; FLATSCR-NEXT: s_mov_b32 s32, s33901; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -1902; FLATSCR-NEXT: scratch_load_dword v1, off, s33 offset:8 ; 4-byte Folded Reload903; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]904; FLATSCR-NEXT: s_mov_b32 s33, s0905; FLATSCR-NEXT: s_waitcnt vmcnt(0)906; FLATSCR-NEXT: s_setpc_b64 s[30:31]907 %alloca = alloca i32, addrspace(5)908 store volatile i32 0, ptr addrspace(5) %alloca909 call void asm sideeffect "; clobber v41", "~{v41}"()910 call void asm sideeffect "",911 "~{s39},~{s40},~{s41},~{s42},~{s43},~{s44},~{s45},~{s46},~{s47},~{s48},~{s49}912 ,~{s50},~{s51},~{s52},~{s53},~{s54},~{s55},~{s56},~{s57},~{s58},~{s59}913 ,~{s60},~{s61},~{s62},~{s63},~{s64},~{s65},~{s66},~{s67},~{s68},~{s69}914 ,~{s70},~{s71},~{s72},~{s73},~{s74},~{s75},~{s76},~{s77},~{s78},~{s79}915 ,~{s80},~{s81},~{s82},~{s83},~{s84},~{s85},~{s86},~{s87},~{s88},~{s89}916 ,~{s90},~{s91},~{s92},~{s93},~{s94},~{s95},~{s96},~{s97},~{s98},~{s99}917 ,~{s100},~{s101},~{s102}"() #1918 919 ret void920}921 922define void @realign_stack_no_fp_elim() #1 {923; MUBUF-LABEL: realign_stack_no_fp_elim:924; MUBUF: ; %bb.0:925; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)926; MUBUF-NEXT: s_mov_b32 s4, s33927; MUBUF-NEXT: s_add_i32 s33, s32, 0x7ffc0928; MUBUF-NEXT: s_and_b32 s33, s33, 0xfff80000929; MUBUF-NEXT: s_mov_b32 s5, s34930; MUBUF-NEXT: s_mov_b32 s34, s32931; MUBUF-NEXT: s_add_i32 s32, s32, 0x180000932; MUBUF-NEXT: v_mov_b32_e32 v0, 0933; MUBUF-NEXT: v_mov_b32_e32 v1, 0x2000934; MUBUF-NEXT: buffer_store_dword v0, v1, s[0:3], s33 offen935; MUBUF-NEXT: s_waitcnt vmcnt(0)936; MUBUF-NEXT: s_mov_b32 s32, s34937; MUBUF-NEXT: s_mov_b32 s34, s5938; MUBUF-NEXT: s_mov_b32 s33, s4939; MUBUF-NEXT: s_setpc_b64 s[30:31]940;941; FLATSCR-LABEL: realign_stack_no_fp_elim:942; FLATSCR: ; %bb.0:943; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)944; FLATSCR-NEXT: s_mov_b32 s0, s33945; FLATSCR-NEXT: s_add_i32 s33, s32, 0x1fff946; FLATSCR-NEXT: s_and_b32 s33, s33, 0xffffe000947; FLATSCR-NEXT: s_mov_b32 s1, s34948; FLATSCR-NEXT: s_mov_b32 s34, s32949; FLATSCR-NEXT: s_addk_i32 s32, 0x6000950; FLATSCR-NEXT: v_mov_b32_e32 v0, 0951; FLATSCR-NEXT: s_add_i32 s2, s33, 0x2000952; FLATSCR-NEXT: scratch_store_dword off, v0, s2953; FLATSCR-NEXT: s_waitcnt vmcnt(0)954; FLATSCR-NEXT: s_mov_b32 s32, s34955; FLATSCR-NEXT: s_mov_b32 s34, s1956; FLATSCR-NEXT: s_mov_b32 s33, s0957; FLATSCR-NEXT: s_setpc_b64 s[30:31]958 %alloca = alloca i32, align 8192, addrspace(5)959 store volatile i32 0, ptr addrspace(5) %alloca960 ret void961}962 963define void @no_unused_non_csr_sgpr_for_fp() #1 {964; MUBUF-LABEL: no_unused_non_csr_sgpr_for_fp:965; MUBUF: ; %bb.0:966; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)967; MUBUF-NEXT: s_mov_b32 s40, s33968; MUBUF-NEXT: s_mov_b32 s33, s32969; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1970; MUBUF-NEXT: buffer_store_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill971; MUBUF-NEXT: s_mov_b64 exec, s[4:5]972; MUBUF-NEXT: v_writelane_b32 v1, s30, 0973; MUBUF-NEXT: v_mov_b32_e32 v0, 0974; MUBUF-NEXT: s_addk_i32 s32, 0x300975; MUBUF-NEXT: v_writelane_b32 v1, s31, 1976; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s33977; MUBUF-NEXT: s_waitcnt vmcnt(0)978; MUBUF-NEXT: ;;#ASMSTART979; MUBUF-NEXT: ;;#ASMEND980; MUBUF-NEXT: v_readlane_b32 s31, v1, 1981; MUBUF-NEXT: v_readlane_b32 s30, v1, 0982; MUBUF-NEXT: s_mov_b32 s32, s33983; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -1984; MUBUF-NEXT: buffer_load_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload985; MUBUF-NEXT: s_mov_b64 exec, s[4:5]986; MUBUF-NEXT: s_mov_b32 s33, s40987; MUBUF-NEXT: s_waitcnt vmcnt(0)988; MUBUF-NEXT: s_setpc_b64 s[30:31]989;990; FLATSCR-LABEL: no_unused_non_csr_sgpr_for_fp:991; FLATSCR: ; %bb.0:992; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)993; FLATSCR-NEXT: s_mov_b32 s40, s33994; FLATSCR-NEXT: s_mov_b32 s33, s32995; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -1996; FLATSCR-NEXT: scratch_store_dword off, v1, s33 offset:4 ; 4-byte Folded Spill997; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]998; FLATSCR-NEXT: v_writelane_b32 v1, s30, 0999; FLATSCR-NEXT: v_mov_b32_e32 v0, 01000; FLATSCR-NEXT: s_add_i32 s32, s32, 121001; FLATSCR-NEXT: v_writelane_b32 v1, s31, 11002; FLATSCR-NEXT: scratch_store_dword off, v0, s331003; FLATSCR-NEXT: s_waitcnt vmcnt(0)1004; FLATSCR-NEXT: ;;#ASMSTART1005; FLATSCR-NEXT: ;;#ASMEND1006; FLATSCR-NEXT: v_readlane_b32 s31, v1, 11007; FLATSCR-NEXT: v_readlane_b32 s30, v1, 01008; FLATSCR-NEXT: s_mov_b32 s32, s331009; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -11010; FLATSCR-NEXT: scratch_load_dword v1, off, s33 offset:4 ; 4-byte Folded Reload1011; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1012; FLATSCR-NEXT: s_mov_b32 s33, s401013; FLATSCR-NEXT: s_waitcnt vmcnt(0)1014; FLATSCR-NEXT: s_setpc_b64 s[30:31]1015 %alloca = alloca i32, addrspace(5)1016 store volatile i32 0, ptr addrspace(5) %alloca1017 1018 ; Use all clobberable registers, so FP has to spill to a VGPR.1019 call void asm sideeffect "",1020 "~{s0},~{s1},~{s2},~{s3},~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1021 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1022 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1023 ,~{s30},~{s31}"() #01024 1025 ret void1026}1027 1028; Need a new CSR VGPR to satisfy the FP spill.1029define void @no_unused_non_csr_sgpr_for_fp_no_scratch_vgpr() #1 {1030; MUBUF-LABEL: no_unused_non_csr_sgpr_for_fp_no_scratch_vgpr:1031; MUBUF: ; %bb.0:1032; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1033; MUBUF-NEXT: s_mov_b32 s40, s331034; MUBUF-NEXT: s_mov_b32 s33, s321035; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -11036; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill1037; MUBUF-NEXT: s_mov_b64 exec, s[4:5]1038; MUBUF-NEXT: v_writelane_b32 v40, s30, 01039; MUBUF-NEXT: v_mov_b32_e32 v0, 01040; MUBUF-NEXT: s_addk_i32 s32, 0x3001041; MUBUF-NEXT: v_writelane_b32 v40, s31, 11042; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s331043; MUBUF-NEXT: s_waitcnt vmcnt(0)1044; MUBUF-NEXT: ;;#ASMSTART1045; MUBUF-NEXT: ;;#ASMEND1046; MUBUF-NEXT: ;;#ASMSTART1047; MUBUF-NEXT: ; clobber nonpreserved initial VGPRs1048; MUBUF-NEXT: ;;#ASMEND1049; MUBUF-NEXT: v_readlane_b32 s31, v40, 11050; MUBUF-NEXT: v_readlane_b32 s30, v40, 01051; MUBUF-NEXT: s_mov_b32 s32, s331052; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -11053; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload1054; MUBUF-NEXT: s_mov_b64 exec, s[4:5]1055; MUBUF-NEXT: s_mov_b32 s33, s401056; MUBUF-NEXT: s_waitcnt vmcnt(0)1057; MUBUF-NEXT: s_setpc_b64 s[30:31]1058;1059; FLATSCR-LABEL: no_unused_non_csr_sgpr_for_fp_no_scratch_vgpr:1060; FLATSCR: ; %bb.0:1061; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1062; FLATSCR-NEXT: s_mov_b32 s40, s331063; FLATSCR-NEXT: s_mov_b32 s33, s321064; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -11065; FLATSCR-NEXT: scratch_store_dword off, v40, s33 offset:4 ; 4-byte Folded Spill1066; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1067; FLATSCR-NEXT: v_writelane_b32 v40, s30, 01068; FLATSCR-NEXT: v_mov_b32_e32 v0, 01069; FLATSCR-NEXT: s_add_i32 s32, s32, 121070; FLATSCR-NEXT: v_writelane_b32 v40, s31, 11071; FLATSCR-NEXT: scratch_store_dword off, v0, s331072; FLATSCR-NEXT: s_waitcnt vmcnt(0)1073; FLATSCR-NEXT: ;;#ASMSTART1074; FLATSCR-NEXT: ;;#ASMEND1075; FLATSCR-NEXT: ;;#ASMSTART1076; FLATSCR-NEXT: ; clobber nonpreserved initial VGPRs1077; FLATSCR-NEXT: ;;#ASMEND1078; FLATSCR-NEXT: v_readlane_b32 s31, v40, 11079; FLATSCR-NEXT: v_readlane_b32 s30, v40, 01080; FLATSCR-NEXT: s_mov_b32 s32, s331081; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -11082; FLATSCR-NEXT: scratch_load_dword v40, off, s33 offset:4 ; 4-byte Folded Reload1083; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1084; FLATSCR-NEXT: s_mov_b32 s33, s401085; FLATSCR-NEXT: s_waitcnt vmcnt(0)1086; FLATSCR-NEXT: s_setpc_b64 s[30:31]1087 %alloca = alloca i32, addrspace(5)1088 store volatile i32 0, ptr addrspace(5) %alloca1089 1090 ; Use all clobberable registers, so FP has to spill to a VGPR.1091 call void asm sideeffect "",1092 "~{s0},~{s1},~{s2},~{s3},~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1093 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1094 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1095 ,~{s30},~{s31}"() #01096 1097 call void asm sideeffect "; clobber nonpreserved initial VGPRs",1098 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1099 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1100 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1101 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38},~{v39}"() #11102 1103 ret void1104}1105 1106; The byval argument exceeds the MUBUF constant offset, so a scratch1107; register is needed to access the CSR VGPR slot.1108define void @scratch_reg_needed_mubuf_offset(ptr addrspace(5) byval([4096 x i8]) align 4 %arg) #1 {1109; MUBUF-LABEL: scratch_reg_needed_mubuf_offset:1110; MUBUF: ; %bb.0:1111; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1112; MUBUF-NEXT: s_mov_b32 s40, s331113; MUBUF-NEXT: s_mov_b32 s33, s321114; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -11115; MUBUF-NEXT: s_add_i32 s6, s33, 0x401001116; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s6 ; 4-byte Folded Spill1117; MUBUF-NEXT: s_mov_b64 exec, s[4:5]1118; MUBUF-NEXT: v_writelane_b32 v40, s30, 01119; MUBUF-NEXT: v_mov_b32_e32 v0, 01120; MUBUF-NEXT: v_mov_b32_e32 v1, 0x10001121; MUBUF-NEXT: s_add_i32 s32, s32, 0x403001122; MUBUF-NEXT: v_writelane_b32 v40, s31, 11123; MUBUF-NEXT: buffer_store_dword v0, v1, s[0:3], s33 offen1124; MUBUF-NEXT: s_waitcnt vmcnt(0)1125; MUBUF-NEXT: ;;#ASMSTART1126; MUBUF-NEXT: ; clobber nonpreserved SGPRs1127; MUBUF-NEXT: ;;#ASMEND1128; MUBUF-NEXT: ;;#ASMSTART1129; MUBUF-NEXT: ; clobber nonpreserved VGPRs1130; MUBUF-NEXT: ;;#ASMEND1131; MUBUF-NEXT: v_readlane_b32 s31, v40, 11132; MUBUF-NEXT: v_readlane_b32 s30, v40, 01133; MUBUF-NEXT: s_mov_b32 s32, s331134; MUBUF-NEXT: s_or_saveexec_b64 s[4:5], -11135; MUBUF-NEXT: s_add_i32 s6, s33, 0x401001136; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s6 ; 4-byte Folded Reload1137; MUBUF-NEXT: s_mov_b64 exec, s[4:5]1138; MUBUF-NEXT: s_mov_b32 s33, s401139; MUBUF-NEXT: s_waitcnt vmcnt(0)1140; MUBUF-NEXT: s_setpc_b64 s[30:31]1141;1142; FLATSCR-LABEL: scratch_reg_needed_mubuf_offset:1143; FLATSCR: ; %bb.0:1144; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1145; FLATSCR-NEXT: s_mov_b32 s40, s331146; FLATSCR-NEXT: s_mov_b32 s33, s321147; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -11148; FLATSCR-NEXT: s_add_i32 s2, s33, 0x10041149; FLATSCR-NEXT: scratch_store_dword off, v40, s2 ; 4-byte Folded Spill1150; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1151; FLATSCR-NEXT: s_addk_i32 s32, 0x100c1152; FLATSCR-NEXT: v_writelane_b32 v40, s30, 01153; FLATSCR-NEXT: v_mov_b32_e32 v0, 01154; FLATSCR-NEXT: s_add_i32 s0, s33, 0x10001155; FLATSCR-NEXT: v_writelane_b32 v40, s31, 11156; FLATSCR-NEXT: scratch_store_dword off, v0, s01157; FLATSCR-NEXT: s_waitcnt vmcnt(0)1158; FLATSCR-NEXT: ;;#ASMSTART1159; FLATSCR-NEXT: ; clobber nonpreserved SGPRs1160; FLATSCR-NEXT: ;;#ASMEND1161; FLATSCR-NEXT: ;;#ASMSTART1162; FLATSCR-NEXT: ; clobber nonpreserved VGPRs1163; FLATSCR-NEXT: ;;#ASMEND1164; FLATSCR-NEXT: v_readlane_b32 s31, v40, 11165; FLATSCR-NEXT: v_readlane_b32 s30, v40, 01166; FLATSCR-NEXT: s_mov_b32 s32, s331167; FLATSCR-NEXT: s_or_saveexec_b64 s[0:1], -11168; FLATSCR-NEXT: s_add_i32 s2, s33, 0x10041169; FLATSCR-NEXT: scratch_load_dword v40, off, s2 ; 4-byte Folded Reload1170; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1171; FLATSCR-NEXT: s_mov_b32 s33, s401172; FLATSCR-NEXT: s_waitcnt vmcnt(0)1173; FLATSCR-NEXT: s_setpc_b64 s[30:31]1174 %alloca = alloca i32, addrspace(5)1175 store volatile i32 0, ptr addrspace(5) %alloca1176 1177 ; Use all clobberable registers, so FP has to spill to a VGPR.1178 call void asm sideeffect "; clobber nonpreserved SGPRs",1179 "~{s0},~{s1},~{s2},~{s3},~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1180 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1181 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1182 ,~{s30},~{s31}"() #01183 1184 ; Use all clobberable VGPRs, so a CSR spill is needed for the VGPR1185 call void asm sideeffect "; clobber nonpreserved VGPRs",1186 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1187 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1188 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1189 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38},~{v39}"() #11190 1191 ret void1192}1193 1194define internal void @local_empty_func() #0 {1195; GCN-LABEL: local_empty_func:1196; GCN: ; %bb.0:1197; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1198; GCN-NEXT: s_setpc_b64 s[30:31]1199 ret void1200}1201 1202; An FP is needed, despite not needing any spills1203; TODO: Ccould see callee does not use stack and omit FP.1204define void @ipra_call_with_stack() #0 {1205; MUBUF-LABEL: ipra_call_with_stack:1206; MUBUF: ; %bb.0:1207; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1208; MUBUF-NEXT: s_mov_b32 s18, s331209; MUBUF-NEXT: s_mov_b32 s33, s321210; MUBUF-NEXT: s_xor_saveexec_b64 s[16:17], -11211; MUBUF-NEXT: buffer_store_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill1212; MUBUF-NEXT: s_mov_b64 exec, s[16:17]1213; MUBUF-NEXT: s_addk_i32 s32, 0x4001214; MUBUF-NEXT: v_writelane_b32 v1, s30, 01215; MUBUF-NEXT: v_mov_b32_e32 v0, 01216; MUBUF-NEXT: s_getpc_b64 s[16:17]1217; MUBUF-NEXT: s_add_u32 s16, s16, local_empty_func@rel32@lo+41218; MUBUF-NEXT: s_addc_u32 s17, s17, local_empty_func@rel32@hi+121219; MUBUF-NEXT: v_writelane_b32 v1, s31, 11220; MUBUF-NEXT: buffer_store_dword v0, off, s[0:3], s331221; MUBUF-NEXT: s_waitcnt vmcnt(0)1222; MUBUF-NEXT: s_swappc_b64 s[30:31], s[16:17]1223; MUBUF-NEXT: v_readlane_b32 s31, v1, 11224; MUBUF-NEXT: v_readlane_b32 s30, v1, 01225; MUBUF-NEXT: s_mov_b32 s32, s331226; MUBUF-NEXT: s_xor_saveexec_b64 s[4:5], -11227; MUBUF-NEXT: buffer_load_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload1228; MUBUF-NEXT: s_mov_b64 exec, s[4:5]1229; MUBUF-NEXT: s_mov_b32 s33, s181230; MUBUF-NEXT: s_waitcnt vmcnt(0)1231; MUBUF-NEXT: s_setpc_b64 s[30:31]1232;1233; FLATSCR-LABEL: ipra_call_with_stack:1234; FLATSCR: ; %bb.0:1235; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1236; FLATSCR-NEXT: s_mov_b32 s2, s331237; FLATSCR-NEXT: s_mov_b32 s33, s321238; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -11239; FLATSCR-NEXT: scratch_store_dword off, v1, s33 offset:4 ; 4-byte Folded Spill1240; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1241; FLATSCR-NEXT: s_add_i32 s32, s32, 161242; FLATSCR-NEXT: v_writelane_b32 v1, s30, 01243; FLATSCR-NEXT: v_mov_b32_e32 v0, 01244; FLATSCR-NEXT: s_getpc_b64 s[0:1]1245; FLATSCR-NEXT: s_add_u32 s0, s0, local_empty_func@rel32@lo+41246; FLATSCR-NEXT: s_addc_u32 s1, s1, local_empty_func@rel32@hi+121247; FLATSCR-NEXT: v_writelane_b32 v1, s31, 11248; FLATSCR-NEXT: scratch_store_dword off, v0, s331249; FLATSCR-NEXT: s_waitcnt vmcnt(0)1250; FLATSCR-NEXT: s_swappc_b64 s[30:31], s[0:1]1251; FLATSCR-NEXT: v_readlane_b32 s31, v1, 11252; FLATSCR-NEXT: v_readlane_b32 s30, v1, 01253; FLATSCR-NEXT: s_mov_b32 s32, s331254; FLATSCR-NEXT: s_xor_saveexec_b64 s[0:1], -11255; FLATSCR-NEXT: scratch_load_dword v1, off, s33 offset:4 ; 4-byte Folded Reload1256; FLATSCR-NEXT: s_mov_b64 exec, s[0:1]1257; FLATSCR-NEXT: s_mov_b32 s33, s21258; FLATSCR-NEXT: s_waitcnt vmcnt(0)1259; FLATSCR-NEXT: s_setpc_b64 s[30:31]1260 %alloca = alloca i32, addrspace(5)1261 store volatile i32 0, ptr addrspace(5) %alloca1262 call void @local_empty_func()1263 ret void1264}1265 1266; With no free registers, we must spill the FP to memory.1267define void @callee_need_to_spill_fp_to_memory() #3 {1268; MUBUF-LABEL: callee_need_to_spill_fp_to_memory:1269; MUBUF: ; %bb.0:1270; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1271; MUBUF-NEXT: s_mov_b32 s40, s331272; MUBUF-NEXT: s_mov_b32 s33, s321273; MUBUF-NEXT: ;;#ASMSTART1274; MUBUF-NEXT: ; clobber nonpreserved SGPRs1275; MUBUF-NEXT: ;;#ASMEND1276; MUBUF-NEXT: ;;#ASMSTART1277; MUBUF-NEXT: ; clobber all VGPRs1278; MUBUF-NEXT: ;;#ASMEND1279; MUBUF-NEXT: s_mov_b32 s33, s401280; MUBUF-NEXT: s_setpc_b64 s[30:31]1281;1282; FLATSCR-LABEL: callee_need_to_spill_fp_to_memory:1283; FLATSCR: ; %bb.0:1284; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1285; FLATSCR-NEXT: s_mov_b32 s0, s331286; FLATSCR-NEXT: s_mov_b32 s33, s321287; FLATSCR-NEXT: ;;#ASMSTART1288; FLATSCR-NEXT: ; clobber nonpreserved SGPRs1289; FLATSCR-NEXT: ;;#ASMEND1290; FLATSCR-NEXT: ;;#ASMSTART1291; FLATSCR-NEXT: ; clobber all VGPRs1292; FLATSCR-NEXT: ;;#ASMEND1293; FLATSCR-NEXT: s_mov_b32 s33, s01294; FLATSCR-NEXT: s_setpc_b64 s[30:31]1295 call void asm sideeffect "; clobber nonpreserved SGPRs",1296 "~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1297 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1298 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1299 ,~{vcc}"()1300 1301 call void asm sideeffect "; clobber all VGPRs",1302 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1303 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1304 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1305 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38},~{v39}"()1306 ret void1307}1308 1309; If we have a reserved VGPR that can be used for SGPR spills, we may still1310; need to spill the FP to memory if there are no free lanes in the reserved1311; VGPR.1312define void @callee_need_to_spill_fp_to_memory_full_reserved_vgpr() #3 {1313; MUBUF-LABEL: callee_need_to_spill_fp_to_memory_full_reserved_vgpr:1314; MUBUF: ; %bb.0:1315; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1316; MUBUF-NEXT: s_mov_b32 s4, s331317; MUBUF-NEXT: s_mov_b32 s33, s321318; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -11319; MUBUF-NEXT: buffer_store_dword v39, off, s[0:3], s33 ; 4-byte Folded Spill1320; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1321; MUBUF-NEXT: v_writelane_b32 v39, s4, 321322; MUBUF-NEXT: v_writelane_b32 v39, s39, 01323; MUBUF-NEXT: v_writelane_b32 v39, s48, 11324; MUBUF-NEXT: v_writelane_b32 v39, s49, 21325; MUBUF-NEXT: v_writelane_b32 v39, s50, 31326; MUBUF-NEXT: v_writelane_b32 v39, s51, 41327; MUBUF-NEXT: v_writelane_b32 v39, s52, 51328; MUBUF-NEXT: v_writelane_b32 v39, s53, 61329; MUBUF-NEXT: v_writelane_b32 v39, s54, 71330; MUBUF-NEXT: v_writelane_b32 v39, s55, 81331; MUBUF-NEXT: v_writelane_b32 v39, s64, 91332; MUBUF-NEXT: v_writelane_b32 v39, s65, 101333; MUBUF-NEXT: v_writelane_b32 v39, s66, 111334; MUBUF-NEXT: v_writelane_b32 v39, s67, 121335; MUBUF-NEXT: v_writelane_b32 v39, s68, 131336; MUBUF-NEXT: v_writelane_b32 v39, s69, 141337; MUBUF-NEXT: v_writelane_b32 v39, s70, 151338; MUBUF-NEXT: v_writelane_b32 v39, s71, 161339; MUBUF-NEXT: v_writelane_b32 v39, s80, 171340; MUBUF-NEXT: v_writelane_b32 v39, s81, 181341; MUBUF-NEXT: v_writelane_b32 v39, s82, 191342; MUBUF-NEXT: v_writelane_b32 v39, s83, 201343; MUBUF-NEXT: v_writelane_b32 v39, s84, 211344; MUBUF-NEXT: v_writelane_b32 v39, s85, 221345; MUBUF-NEXT: v_writelane_b32 v39, s86, 231346; MUBUF-NEXT: v_writelane_b32 v39, s87, 241347; MUBUF-NEXT: v_writelane_b32 v39, s96, 251348; MUBUF-NEXT: v_writelane_b32 v39, s97, 261349; MUBUF-NEXT: v_writelane_b32 v39, s98, 271350; MUBUF-NEXT: v_writelane_b32 v39, s99, 281351; MUBUF-NEXT: v_writelane_b32 v39, s100, 291352; MUBUF-NEXT: v_writelane_b32 v39, s101, 301353; MUBUF-NEXT: s_addk_i32 s32, 0x2001354; MUBUF-NEXT: v_writelane_b32 v39, s102, 311355; MUBUF-NEXT: ;;#ASMSTART1356; MUBUF-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1357; MUBUF-NEXT: ;;#ASMEND1358; MUBUF-NEXT: ;;#ASMSTART1359; MUBUF-NEXT: ; clobber all VGPRs except CSR v401360; MUBUF-NEXT: ;;#ASMEND1361; MUBUF-NEXT: v_readlane_b32 s102, v39, 311362; MUBUF-NEXT: v_readlane_b32 s101, v39, 301363; MUBUF-NEXT: v_readlane_b32 s100, v39, 291364; MUBUF-NEXT: v_readlane_b32 s99, v39, 281365; MUBUF-NEXT: v_readlane_b32 s98, v39, 271366; MUBUF-NEXT: v_readlane_b32 s97, v39, 261367; MUBUF-NEXT: v_readlane_b32 s96, v39, 251368; MUBUF-NEXT: v_readlane_b32 s87, v39, 241369; MUBUF-NEXT: v_readlane_b32 s86, v39, 231370; MUBUF-NEXT: v_readlane_b32 s85, v39, 221371; MUBUF-NEXT: v_readlane_b32 s84, v39, 211372; MUBUF-NEXT: v_readlane_b32 s83, v39, 201373; MUBUF-NEXT: v_readlane_b32 s82, v39, 191374; MUBUF-NEXT: v_readlane_b32 s81, v39, 181375; MUBUF-NEXT: v_readlane_b32 s80, v39, 171376; MUBUF-NEXT: v_readlane_b32 s71, v39, 161377; MUBUF-NEXT: v_readlane_b32 s70, v39, 151378; MUBUF-NEXT: v_readlane_b32 s69, v39, 141379; MUBUF-NEXT: v_readlane_b32 s68, v39, 131380; MUBUF-NEXT: v_readlane_b32 s67, v39, 121381; MUBUF-NEXT: v_readlane_b32 s66, v39, 111382; MUBUF-NEXT: v_readlane_b32 s65, v39, 101383; MUBUF-NEXT: v_readlane_b32 s64, v39, 91384; MUBUF-NEXT: v_readlane_b32 s55, v39, 81385; MUBUF-NEXT: v_readlane_b32 s54, v39, 71386; MUBUF-NEXT: v_readlane_b32 s53, v39, 61387; MUBUF-NEXT: v_readlane_b32 s52, v39, 51388; MUBUF-NEXT: v_readlane_b32 s51, v39, 41389; MUBUF-NEXT: v_readlane_b32 s50, v39, 31390; MUBUF-NEXT: v_readlane_b32 s49, v39, 21391; MUBUF-NEXT: v_readlane_b32 s48, v39, 11392; MUBUF-NEXT: v_readlane_b32 s39, v39, 01393; MUBUF-NEXT: s_mov_b32 s32, s331394; MUBUF-NEXT: v_readlane_b32 s4, v39, 321395; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -11396; MUBUF-NEXT: buffer_load_dword v39, off, s[0:3], s33 ; 4-byte Folded Reload1397; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1398; MUBUF-NEXT: s_mov_b32 s33, s41399; MUBUF-NEXT: s_waitcnt vmcnt(0)1400; MUBUF-NEXT: s_setpc_b64 s[30:31]1401;1402; FLATSCR-LABEL: callee_need_to_spill_fp_to_memory_full_reserved_vgpr:1403; FLATSCR: ; %bb.0:1404; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1405; FLATSCR-NEXT: s_mov_b32 s0, s331406; FLATSCR-NEXT: s_mov_b32 s33, s321407; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -11408; FLATSCR-NEXT: scratch_store_dword off, v39, s33 ; 4-byte Folded Spill1409; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1410; FLATSCR-NEXT: v_writelane_b32 v39, s39, 01411; FLATSCR-NEXT: v_writelane_b32 v39, s48, 11412; FLATSCR-NEXT: v_writelane_b32 v39, s49, 21413; FLATSCR-NEXT: v_writelane_b32 v39, s50, 31414; FLATSCR-NEXT: v_writelane_b32 v39, s51, 41415; FLATSCR-NEXT: v_writelane_b32 v39, s52, 51416; FLATSCR-NEXT: v_writelane_b32 v39, s53, 61417; FLATSCR-NEXT: v_writelane_b32 v39, s54, 71418; FLATSCR-NEXT: v_writelane_b32 v39, s55, 81419; FLATSCR-NEXT: v_writelane_b32 v39, s64, 91420; FLATSCR-NEXT: v_writelane_b32 v39, s65, 101421; FLATSCR-NEXT: v_writelane_b32 v39, s66, 111422; FLATSCR-NEXT: v_writelane_b32 v39, s67, 121423; FLATSCR-NEXT: v_writelane_b32 v39, s68, 131424; FLATSCR-NEXT: v_writelane_b32 v39, s69, 141425; FLATSCR-NEXT: v_writelane_b32 v39, s70, 151426; FLATSCR-NEXT: v_writelane_b32 v39, s71, 161427; FLATSCR-NEXT: v_writelane_b32 v39, s80, 171428; FLATSCR-NEXT: v_writelane_b32 v39, s81, 181429; FLATSCR-NEXT: v_writelane_b32 v39, s82, 191430; FLATSCR-NEXT: v_writelane_b32 v39, s83, 201431; FLATSCR-NEXT: v_writelane_b32 v39, s84, 211432; FLATSCR-NEXT: v_writelane_b32 v39, s85, 221433; FLATSCR-NEXT: v_writelane_b32 v39, s86, 231434; FLATSCR-NEXT: v_writelane_b32 v39, s87, 241435; FLATSCR-NEXT: v_writelane_b32 v39, s96, 251436; FLATSCR-NEXT: v_writelane_b32 v39, s97, 261437; FLATSCR-NEXT: v_writelane_b32 v39, s98, 271438; FLATSCR-NEXT: v_writelane_b32 v39, s99, 281439; FLATSCR-NEXT: v_writelane_b32 v39, s100, 291440; FLATSCR-NEXT: v_writelane_b32 v39, s101, 301441; FLATSCR-NEXT: s_add_i32 s32, s32, 81442; FLATSCR-NEXT: v_writelane_b32 v39, s102, 311443; FLATSCR-NEXT: ;;#ASMSTART1444; FLATSCR-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1445; FLATSCR-NEXT: ;;#ASMEND1446; FLATSCR-NEXT: ;;#ASMSTART1447; FLATSCR-NEXT: ; clobber all VGPRs except CSR v401448; FLATSCR-NEXT: ;;#ASMEND1449; FLATSCR-NEXT: v_readlane_b32 s102, v39, 311450; FLATSCR-NEXT: v_readlane_b32 s101, v39, 301451; FLATSCR-NEXT: v_readlane_b32 s100, v39, 291452; FLATSCR-NEXT: v_readlane_b32 s99, v39, 281453; FLATSCR-NEXT: v_readlane_b32 s98, v39, 271454; FLATSCR-NEXT: v_readlane_b32 s97, v39, 261455; FLATSCR-NEXT: v_readlane_b32 s96, v39, 251456; FLATSCR-NEXT: v_readlane_b32 s87, v39, 241457; FLATSCR-NEXT: v_readlane_b32 s86, v39, 231458; FLATSCR-NEXT: v_readlane_b32 s85, v39, 221459; FLATSCR-NEXT: v_readlane_b32 s84, v39, 211460; FLATSCR-NEXT: v_readlane_b32 s83, v39, 201461; FLATSCR-NEXT: v_readlane_b32 s82, v39, 191462; FLATSCR-NEXT: v_readlane_b32 s81, v39, 181463; FLATSCR-NEXT: v_readlane_b32 s80, v39, 171464; FLATSCR-NEXT: v_readlane_b32 s71, v39, 161465; FLATSCR-NEXT: v_readlane_b32 s70, v39, 151466; FLATSCR-NEXT: v_readlane_b32 s69, v39, 141467; FLATSCR-NEXT: v_readlane_b32 s68, v39, 131468; FLATSCR-NEXT: v_readlane_b32 s67, v39, 121469; FLATSCR-NEXT: v_readlane_b32 s66, v39, 111470; FLATSCR-NEXT: v_readlane_b32 s65, v39, 101471; FLATSCR-NEXT: v_readlane_b32 s64, v39, 91472; FLATSCR-NEXT: v_readlane_b32 s55, v39, 81473; FLATSCR-NEXT: v_readlane_b32 s54, v39, 71474; FLATSCR-NEXT: v_readlane_b32 s53, v39, 61475; FLATSCR-NEXT: v_readlane_b32 s52, v39, 51476; FLATSCR-NEXT: v_readlane_b32 s51, v39, 41477; FLATSCR-NEXT: v_readlane_b32 s50, v39, 31478; FLATSCR-NEXT: v_readlane_b32 s49, v39, 21479; FLATSCR-NEXT: v_readlane_b32 s48, v39, 11480; FLATSCR-NEXT: v_readlane_b32 s39, v39, 01481; FLATSCR-NEXT: s_mov_b32 s32, s331482; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -11483; FLATSCR-NEXT: scratch_load_dword v39, off, s33 ; 4-byte Folded Reload1484; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1485; FLATSCR-NEXT: s_mov_b32 s33, s01486; FLATSCR-NEXT: s_waitcnt vmcnt(0)1487; FLATSCR-NEXT: s_setpc_b64 s[30:31]1488 call void asm sideeffect "; clobber nonpreserved SGPRs and 64 CSRs",1489 "~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1490 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1491 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1492 ,~{s40},~{s41},~{s42},~{s43},~{s44},~{s45},~{s46},~{s47},~{s48},~{s49}1493 ,~{s50},~{s51},~{s52},~{s53},~{s54},~{s55},~{s56},~{s57},~{s58},~{s59}1494 ,~{s60},~{s61},~{s62},~{s63},~{s64},~{s65},~{s66},~{s67},~{s68},~{s69}1495 ,~{s70},~{s71},~{s72},~{s73},~{s74},~{s75},~{s76},~{s77},~{s78},~{s79}1496 ,~{s80},~{s81},~{s82},~{s83},~{s84},~{s85},~{s86},~{s87},~{s88},~{s89}1497 ,~{s90},~{s91},~{s92},~{s93},~{s94},~{s95},~{s96},~{s97},~{s98},~{s99}1498 ,~{s100},~{s101},~{s102},~{s39},~{vcc}"()1499 1500 call void asm sideeffect "; clobber all VGPRs except CSR v40",1501 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1502 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1503 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1504 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38}"()1505 ret void1506}1507 1508; When flat-scratch is enabled, we save the FP to s0. At the same time,1509; the exec register is saved to s0 when saving CSR in the function prolog.1510; Make sure that the FP save happens after restoring exec from the same1511; register.1512define void @callee_need_to_spill_fp_to_reg() #1 {1513; MUBUF-LABEL: callee_need_to_spill_fp_to_reg:1514; MUBUF: ; %bb.0:1515; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1516; MUBUF-NEXT: s_mov_b32 s4, s331517; MUBUF-NEXT: s_mov_b32 s33, s321518; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -11519; MUBUF-NEXT: buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill1520; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1521; MUBUF-NEXT: v_writelane_b32 v40, s4, 321522; MUBUF-NEXT: v_writelane_b32 v40, s39, 01523; MUBUF-NEXT: v_writelane_b32 v40, s48, 11524; MUBUF-NEXT: v_writelane_b32 v40, s49, 21525; MUBUF-NEXT: v_writelane_b32 v40, s50, 31526; MUBUF-NEXT: v_writelane_b32 v40, s51, 41527; MUBUF-NEXT: v_writelane_b32 v40, s52, 51528; MUBUF-NEXT: v_writelane_b32 v40, s53, 61529; MUBUF-NEXT: v_writelane_b32 v40, s54, 71530; MUBUF-NEXT: v_writelane_b32 v40, s55, 81531; MUBUF-NEXT: v_writelane_b32 v40, s64, 91532; MUBUF-NEXT: v_writelane_b32 v40, s65, 101533; MUBUF-NEXT: v_writelane_b32 v40, s66, 111534; MUBUF-NEXT: v_writelane_b32 v40, s67, 121535; MUBUF-NEXT: v_writelane_b32 v40, s68, 131536; MUBUF-NEXT: v_writelane_b32 v40, s69, 141537; MUBUF-NEXT: v_writelane_b32 v40, s70, 151538; MUBUF-NEXT: v_writelane_b32 v40, s71, 161539; MUBUF-NEXT: v_writelane_b32 v40, s80, 171540; MUBUF-NEXT: v_writelane_b32 v40, s81, 181541; MUBUF-NEXT: v_writelane_b32 v40, s82, 191542; MUBUF-NEXT: v_writelane_b32 v40, s83, 201543; MUBUF-NEXT: v_writelane_b32 v40, s84, 211544; MUBUF-NEXT: v_writelane_b32 v40, s85, 221545; MUBUF-NEXT: v_writelane_b32 v40, s86, 231546; MUBUF-NEXT: v_writelane_b32 v40, s87, 241547; MUBUF-NEXT: v_writelane_b32 v40, s96, 251548; MUBUF-NEXT: v_writelane_b32 v40, s97, 261549; MUBUF-NEXT: v_writelane_b32 v40, s98, 271550; MUBUF-NEXT: v_writelane_b32 v40, s99, 281551; MUBUF-NEXT: v_writelane_b32 v40, s100, 291552; MUBUF-NEXT: v_writelane_b32 v40, s101, 301553; MUBUF-NEXT: s_addk_i32 s32, 0x2001554; MUBUF-NEXT: v_writelane_b32 v40, s102, 311555; MUBUF-NEXT: ;;#ASMSTART1556; MUBUF-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1557; MUBUF-NEXT: ;;#ASMEND1558; MUBUF-NEXT: ;;#ASMSTART1559; MUBUF-NEXT: ; clobber all VGPRs except CSR v401560; MUBUF-NEXT: ;;#ASMEND1561; MUBUF-NEXT: v_readlane_b32 s102, v40, 311562; MUBUF-NEXT: v_readlane_b32 s101, v40, 301563; MUBUF-NEXT: v_readlane_b32 s100, v40, 291564; MUBUF-NEXT: v_readlane_b32 s99, v40, 281565; MUBUF-NEXT: v_readlane_b32 s98, v40, 271566; MUBUF-NEXT: v_readlane_b32 s97, v40, 261567; MUBUF-NEXT: v_readlane_b32 s96, v40, 251568; MUBUF-NEXT: v_readlane_b32 s87, v40, 241569; MUBUF-NEXT: v_readlane_b32 s86, v40, 231570; MUBUF-NEXT: v_readlane_b32 s85, v40, 221571; MUBUF-NEXT: v_readlane_b32 s84, v40, 211572; MUBUF-NEXT: v_readlane_b32 s83, v40, 201573; MUBUF-NEXT: v_readlane_b32 s82, v40, 191574; MUBUF-NEXT: v_readlane_b32 s81, v40, 181575; MUBUF-NEXT: v_readlane_b32 s80, v40, 171576; MUBUF-NEXT: v_readlane_b32 s71, v40, 161577; MUBUF-NEXT: v_readlane_b32 s70, v40, 151578; MUBUF-NEXT: v_readlane_b32 s69, v40, 141579; MUBUF-NEXT: v_readlane_b32 s68, v40, 131580; MUBUF-NEXT: v_readlane_b32 s67, v40, 121581; MUBUF-NEXT: v_readlane_b32 s66, v40, 111582; MUBUF-NEXT: v_readlane_b32 s65, v40, 101583; MUBUF-NEXT: v_readlane_b32 s64, v40, 91584; MUBUF-NEXT: v_readlane_b32 s55, v40, 81585; MUBUF-NEXT: v_readlane_b32 s54, v40, 71586; MUBUF-NEXT: v_readlane_b32 s53, v40, 61587; MUBUF-NEXT: v_readlane_b32 s52, v40, 51588; MUBUF-NEXT: v_readlane_b32 s51, v40, 41589; MUBUF-NEXT: v_readlane_b32 s50, v40, 31590; MUBUF-NEXT: v_readlane_b32 s49, v40, 21591; MUBUF-NEXT: v_readlane_b32 s48, v40, 11592; MUBUF-NEXT: v_readlane_b32 s39, v40, 01593; MUBUF-NEXT: s_mov_b32 s32, s331594; MUBUF-NEXT: v_readlane_b32 s4, v40, 321595; MUBUF-NEXT: s_or_saveexec_b64 s[6:7], -11596; MUBUF-NEXT: buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload1597; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1598; MUBUF-NEXT: s_mov_b32 s33, s41599; MUBUF-NEXT: s_waitcnt vmcnt(0)1600; MUBUF-NEXT: s_setpc_b64 s[30:31]1601;1602; FLATSCR-LABEL: callee_need_to_spill_fp_to_reg:1603; FLATSCR: ; %bb.0:1604; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1605; FLATSCR-NEXT: s_mov_b32 s0, s331606; FLATSCR-NEXT: s_mov_b32 s33, s321607; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -11608; FLATSCR-NEXT: scratch_store_dword off, v40, s33 ; 4-byte Folded Spill1609; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1610; FLATSCR-NEXT: v_writelane_b32 v40, s39, 01611; FLATSCR-NEXT: v_writelane_b32 v40, s48, 11612; FLATSCR-NEXT: v_writelane_b32 v40, s49, 21613; FLATSCR-NEXT: v_writelane_b32 v40, s50, 31614; FLATSCR-NEXT: v_writelane_b32 v40, s51, 41615; FLATSCR-NEXT: v_writelane_b32 v40, s52, 51616; FLATSCR-NEXT: v_writelane_b32 v40, s53, 61617; FLATSCR-NEXT: v_writelane_b32 v40, s54, 71618; FLATSCR-NEXT: v_writelane_b32 v40, s55, 81619; FLATSCR-NEXT: v_writelane_b32 v40, s64, 91620; FLATSCR-NEXT: v_writelane_b32 v40, s65, 101621; FLATSCR-NEXT: v_writelane_b32 v40, s66, 111622; FLATSCR-NEXT: v_writelane_b32 v40, s67, 121623; FLATSCR-NEXT: v_writelane_b32 v40, s68, 131624; FLATSCR-NEXT: v_writelane_b32 v40, s69, 141625; FLATSCR-NEXT: v_writelane_b32 v40, s70, 151626; FLATSCR-NEXT: v_writelane_b32 v40, s71, 161627; FLATSCR-NEXT: v_writelane_b32 v40, s80, 171628; FLATSCR-NEXT: v_writelane_b32 v40, s81, 181629; FLATSCR-NEXT: v_writelane_b32 v40, s82, 191630; FLATSCR-NEXT: v_writelane_b32 v40, s83, 201631; FLATSCR-NEXT: v_writelane_b32 v40, s84, 211632; FLATSCR-NEXT: v_writelane_b32 v40, s85, 221633; FLATSCR-NEXT: v_writelane_b32 v40, s86, 231634; FLATSCR-NEXT: v_writelane_b32 v40, s87, 241635; FLATSCR-NEXT: v_writelane_b32 v40, s96, 251636; FLATSCR-NEXT: v_writelane_b32 v40, s97, 261637; FLATSCR-NEXT: v_writelane_b32 v40, s98, 271638; FLATSCR-NEXT: v_writelane_b32 v40, s99, 281639; FLATSCR-NEXT: v_writelane_b32 v40, s100, 291640; FLATSCR-NEXT: v_writelane_b32 v40, s101, 301641; FLATSCR-NEXT: s_add_i32 s32, s32, 81642; FLATSCR-NEXT: v_writelane_b32 v40, s102, 311643; FLATSCR-NEXT: ;;#ASMSTART1644; FLATSCR-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1645; FLATSCR-NEXT: ;;#ASMEND1646; FLATSCR-NEXT: ;;#ASMSTART1647; FLATSCR-NEXT: ; clobber all VGPRs except CSR v401648; FLATSCR-NEXT: ;;#ASMEND1649; FLATSCR-NEXT: v_readlane_b32 s102, v40, 311650; FLATSCR-NEXT: v_readlane_b32 s101, v40, 301651; FLATSCR-NEXT: v_readlane_b32 s100, v40, 291652; FLATSCR-NEXT: v_readlane_b32 s99, v40, 281653; FLATSCR-NEXT: v_readlane_b32 s98, v40, 271654; FLATSCR-NEXT: v_readlane_b32 s97, v40, 261655; FLATSCR-NEXT: v_readlane_b32 s96, v40, 251656; FLATSCR-NEXT: v_readlane_b32 s87, v40, 241657; FLATSCR-NEXT: v_readlane_b32 s86, v40, 231658; FLATSCR-NEXT: v_readlane_b32 s85, v40, 221659; FLATSCR-NEXT: v_readlane_b32 s84, v40, 211660; FLATSCR-NEXT: v_readlane_b32 s83, v40, 201661; FLATSCR-NEXT: v_readlane_b32 s82, v40, 191662; FLATSCR-NEXT: v_readlane_b32 s81, v40, 181663; FLATSCR-NEXT: v_readlane_b32 s80, v40, 171664; FLATSCR-NEXT: v_readlane_b32 s71, v40, 161665; FLATSCR-NEXT: v_readlane_b32 s70, v40, 151666; FLATSCR-NEXT: v_readlane_b32 s69, v40, 141667; FLATSCR-NEXT: v_readlane_b32 s68, v40, 131668; FLATSCR-NEXT: v_readlane_b32 s67, v40, 121669; FLATSCR-NEXT: v_readlane_b32 s66, v40, 111670; FLATSCR-NEXT: v_readlane_b32 s65, v40, 101671; FLATSCR-NEXT: v_readlane_b32 s64, v40, 91672; FLATSCR-NEXT: v_readlane_b32 s55, v40, 81673; FLATSCR-NEXT: v_readlane_b32 s54, v40, 71674; FLATSCR-NEXT: v_readlane_b32 s53, v40, 61675; FLATSCR-NEXT: v_readlane_b32 s52, v40, 51676; FLATSCR-NEXT: v_readlane_b32 s51, v40, 41677; FLATSCR-NEXT: v_readlane_b32 s50, v40, 31678; FLATSCR-NEXT: v_readlane_b32 s49, v40, 21679; FLATSCR-NEXT: v_readlane_b32 s48, v40, 11680; FLATSCR-NEXT: v_readlane_b32 s39, v40, 01681; FLATSCR-NEXT: s_mov_b32 s32, s331682; FLATSCR-NEXT: s_or_saveexec_b64 s[2:3], -11683; FLATSCR-NEXT: scratch_load_dword v40, off, s33 ; 4-byte Folded Reload1684; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1685; FLATSCR-NEXT: s_mov_b32 s33, s01686; FLATSCR-NEXT: s_waitcnt vmcnt(0)1687; FLATSCR-NEXT: s_setpc_b64 s[30:31]1688 call void asm sideeffect "; clobber nonpreserved SGPRs and 64 CSRs",1689 "~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1690 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1691 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1692 ,~{s40},~{s41},~{s42},~{s43},~{s44},~{s45},~{s46},~{s47},~{s48},~{s49}1693 ,~{s50},~{s51},~{s52},~{s53},~{s54},~{s55},~{s56},~{s57},~{s58},~{s59}1694 ,~{s60},~{s61},~{s62},~{s63},~{s64},~{s65},~{s66},~{s67},~{s68},~{s69}1695 ,~{s70},~{s71},~{s72},~{s73},~{s74},~{s75},~{s76},~{s77},~{s78},~{s79}1696 ,~{s80},~{s81},~{s82},~{s83},~{s84},~{s85},~{s86},~{s87},~{s88},~{s89}1697 ,~{s90},~{s91},~{s92},~{s93},~{s94},~{s95},~{s96},~{s97},~{s98},~{s99}1698 ,~{s100},~{s101},~{s102},~{s39},~{vcc}"()1699 1700 call void asm sideeffect "; clobber all VGPRs except CSR v40",1701 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1702 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1703 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1704 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38},~{v39}"()1705 ret void1706}1707 1708; If the size of the offset exceeds the MUBUF offset field we need another1709; scratch VGPR to hold the offset.1710define void @spill_fp_to_memory_scratch_reg_needed_mubuf_offset(ptr addrspace(5) byval([4096 x i8]) align 4 %arg) #3 {1711; MUBUF-LABEL: spill_fp_to_memory_scratch_reg_needed_mubuf_offset:1712; MUBUF: ; %bb.0:1713; MUBUF-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1714; MUBUF-NEXT: s_mov_b32 s4, s331715; MUBUF-NEXT: s_mov_b32 s33, s321716; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -11717; MUBUF-NEXT: s_add_i32 s5, s33, 0x401001718; MUBUF-NEXT: buffer_store_dword v39, off, s[0:3], s5 ; 4-byte Folded Spill1719; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1720; MUBUF-NEXT: v_writelane_b32 v39, s4, 321721; MUBUF-NEXT: v_writelane_b32 v39, s39, 01722; MUBUF-NEXT: v_writelane_b32 v39, s48, 11723; MUBUF-NEXT: v_writelane_b32 v39, s49, 21724; MUBUF-NEXT: v_writelane_b32 v39, s50, 31725; MUBUF-NEXT: v_writelane_b32 v39, s51, 41726; MUBUF-NEXT: v_writelane_b32 v39, s52, 51727; MUBUF-NEXT: v_writelane_b32 v39, s53, 61728; MUBUF-NEXT: v_writelane_b32 v39, s54, 71729; MUBUF-NEXT: v_writelane_b32 v39, s55, 81730; MUBUF-NEXT: v_writelane_b32 v39, s64, 91731; MUBUF-NEXT: v_writelane_b32 v39, s65, 101732; MUBUF-NEXT: v_writelane_b32 v39, s66, 111733; MUBUF-NEXT: v_writelane_b32 v39, s67, 121734; MUBUF-NEXT: v_writelane_b32 v39, s68, 131735; MUBUF-NEXT: v_writelane_b32 v39, s69, 141736; MUBUF-NEXT: v_writelane_b32 v39, s70, 151737; MUBUF-NEXT: v_writelane_b32 v39, s71, 161738; MUBUF-NEXT: v_writelane_b32 v39, s80, 171739; MUBUF-NEXT: v_writelane_b32 v39, s81, 181740; MUBUF-NEXT: v_writelane_b32 v39, s82, 191741; MUBUF-NEXT: v_writelane_b32 v39, s83, 201742; MUBUF-NEXT: v_writelane_b32 v39, s84, 211743; MUBUF-NEXT: v_writelane_b32 v39, s85, 221744; MUBUF-NEXT: v_writelane_b32 v39, s86, 231745; MUBUF-NEXT: v_writelane_b32 v39, s87, 241746; MUBUF-NEXT: v_writelane_b32 v39, s96, 251747; MUBUF-NEXT: v_writelane_b32 v39, s97, 261748; MUBUF-NEXT: v_writelane_b32 v39, s98, 271749; MUBUF-NEXT: v_writelane_b32 v39, s99, 281750; MUBUF-NEXT: v_writelane_b32 v39, s100, 291751; MUBUF-NEXT: v_writelane_b32 v39, s101, 301752; MUBUF-NEXT: v_mov_b32_e32 v0, 01753; MUBUF-NEXT: v_mov_b32_e32 v1, 0x10001754; MUBUF-NEXT: s_add_i32 s32, s32, 0x403001755; MUBUF-NEXT: v_writelane_b32 v39, s102, 311756; MUBUF-NEXT: buffer_store_dword v0, v1, s[0:3], s33 offen1757; MUBUF-NEXT: s_waitcnt vmcnt(0)1758; MUBUF-NEXT: ;;#ASMSTART1759; MUBUF-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1760; MUBUF-NEXT: ;;#ASMEND1761; MUBUF-NEXT: ;;#ASMSTART1762; MUBUF-NEXT: ; clobber all VGPRs except CSR v401763; MUBUF-NEXT: ;;#ASMEND1764; MUBUF-NEXT: v_readlane_b32 s102, v39, 311765; MUBUF-NEXT: v_readlane_b32 s101, v39, 301766; MUBUF-NEXT: v_readlane_b32 s100, v39, 291767; MUBUF-NEXT: v_readlane_b32 s99, v39, 281768; MUBUF-NEXT: v_readlane_b32 s98, v39, 271769; MUBUF-NEXT: v_readlane_b32 s97, v39, 261770; MUBUF-NEXT: v_readlane_b32 s96, v39, 251771; MUBUF-NEXT: v_readlane_b32 s87, v39, 241772; MUBUF-NEXT: v_readlane_b32 s86, v39, 231773; MUBUF-NEXT: v_readlane_b32 s85, v39, 221774; MUBUF-NEXT: v_readlane_b32 s84, v39, 211775; MUBUF-NEXT: v_readlane_b32 s83, v39, 201776; MUBUF-NEXT: v_readlane_b32 s82, v39, 191777; MUBUF-NEXT: v_readlane_b32 s81, v39, 181778; MUBUF-NEXT: v_readlane_b32 s80, v39, 171779; MUBUF-NEXT: v_readlane_b32 s71, v39, 161780; MUBUF-NEXT: v_readlane_b32 s70, v39, 151781; MUBUF-NEXT: v_readlane_b32 s69, v39, 141782; MUBUF-NEXT: v_readlane_b32 s68, v39, 131783; MUBUF-NEXT: v_readlane_b32 s67, v39, 121784; MUBUF-NEXT: v_readlane_b32 s66, v39, 111785; MUBUF-NEXT: v_readlane_b32 s65, v39, 101786; MUBUF-NEXT: v_readlane_b32 s64, v39, 91787; MUBUF-NEXT: v_readlane_b32 s55, v39, 81788; MUBUF-NEXT: v_readlane_b32 s54, v39, 71789; MUBUF-NEXT: v_readlane_b32 s53, v39, 61790; MUBUF-NEXT: v_readlane_b32 s52, v39, 51791; MUBUF-NEXT: v_readlane_b32 s51, v39, 41792; MUBUF-NEXT: v_readlane_b32 s50, v39, 31793; MUBUF-NEXT: v_readlane_b32 s49, v39, 21794; MUBUF-NEXT: v_readlane_b32 s48, v39, 11795; MUBUF-NEXT: v_readlane_b32 s39, v39, 01796; MUBUF-NEXT: s_mov_b32 s32, s331797; MUBUF-NEXT: v_readlane_b32 s4, v39, 321798; MUBUF-NEXT: s_xor_saveexec_b64 s[6:7], -11799; MUBUF-NEXT: s_add_i32 s5, s33, 0x401001800; MUBUF-NEXT: buffer_load_dword v39, off, s[0:3], s5 ; 4-byte Folded Reload1801; MUBUF-NEXT: s_mov_b64 exec, s[6:7]1802; MUBUF-NEXT: s_mov_b32 s33, s41803; MUBUF-NEXT: s_waitcnt vmcnt(0)1804; MUBUF-NEXT: s_setpc_b64 s[30:31]1805;1806; FLATSCR-LABEL: spill_fp_to_memory_scratch_reg_needed_mubuf_offset:1807; FLATSCR: ; %bb.0:1808; FLATSCR-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1809; FLATSCR-NEXT: s_mov_b32 s0, s331810; FLATSCR-NEXT: s_mov_b32 s33, s321811; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -11812; FLATSCR-NEXT: s_add_i32 s1, s33, 0x10041813; FLATSCR-NEXT: scratch_store_dword off, v39, s1 ; 4-byte Folded Spill1814; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1815; FLATSCR-NEXT: v_writelane_b32 v39, s39, 01816; FLATSCR-NEXT: v_writelane_b32 v39, s48, 11817; FLATSCR-NEXT: v_writelane_b32 v39, s49, 21818; FLATSCR-NEXT: v_writelane_b32 v39, s50, 31819; FLATSCR-NEXT: v_writelane_b32 v39, s51, 41820; FLATSCR-NEXT: v_writelane_b32 v39, s52, 51821; FLATSCR-NEXT: v_writelane_b32 v39, s53, 61822; FLATSCR-NEXT: v_writelane_b32 v39, s54, 71823; FLATSCR-NEXT: v_writelane_b32 v39, s55, 81824; FLATSCR-NEXT: v_writelane_b32 v39, s64, 91825; FLATSCR-NEXT: v_writelane_b32 v39, s65, 101826; FLATSCR-NEXT: v_writelane_b32 v39, s66, 111827; FLATSCR-NEXT: v_writelane_b32 v39, s67, 121828; FLATSCR-NEXT: v_writelane_b32 v39, s68, 131829; FLATSCR-NEXT: v_writelane_b32 v39, s69, 141830; FLATSCR-NEXT: v_writelane_b32 v39, s70, 151831; FLATSCR-NEXT: v_writelane_b32 v39, s71, 161832; FLATSCR-NEXT: v_writelane_b32 v39, s80, 171833; FLATSCR-NEXT: v_writelane_b32 v39, s81, 181834; FLATSCR-NEXT: v_writelane_b32 v39, s82, 191835; FLATSCR-NEXT: v_writelane_b32 v39, s83, 201836; FLATSCR-NEXT: v_writelane_b32 v39, s84, 211837; FLATSCR-NEXT: v_writelane_b32 v39, s85, 221838; FLATSCR-NEXT: v_writelane_b32 v39, s86, 231839; FLATSCR-NEXT: v_writelane_b32 v39, s87, 241840; FLATSCR-NEXT: v_writelane_b32 v39, s96, 251841; FLATSCR-NEXT: v_writelane_b32 v39, s97, 261842; FLATSCR-NEXT: v_writelane_b32 v39, s98, 271843; FLATSCR-NEXT: v_writelane_b32 v39, s99, 281844; FLATSCR-NEXT: s_addk_i32 s32, 0x100c1845; FLATSCR-NEXT: v_writelane_b32 v39, s100, 291846; FLATSCR-NEXT: v_writelane_b32 v39, s101, 301847; FLATSCR-NEXT: v_mov_b32_e32 v0, 01848; FLATSCR-NEXT: s_add_i32 s1, s33, 0x10001849; FLATSCR-NEXT: v_writelane_b32 v39, s102, 311850; FLATSCR-NEXT: scratch_store_dword off, v0, s11851; FLATSCR-NEXT: s_waitcnt vmcnt(0)1852; FLATSCR-NEXT: ;;#ASMSTART1853; FLATSCR-NEXT: ; clobber nonpreserved SGPRs and 64 CSRs1854; FLATSCR-NEXT: ;;#ASMEND1855; FLATSCR-NEXT: ;;#ASMSTART1856; FLATSCR-NEXT: ; clobber all VGPRs except CSR v401857; FLATSCR-NEXT: ;;#ASMEND1858; FLATSCR-NEXT: v_readlane_b32 s102, v39, 311859; FLATSCR-NEXT: v_readlane_b32 s101, v39, 301860; FLATSCR-NEXT: v_readlane_b32 s100, v39, 291861; FLATSCR-NEXT: v_readlane_b32 s99, v39, 281862; FLATSCR-NEXT: v_readlane_b32 s98, v39, 271863; FLATSCR-NEXT: v_readlane_b32 s97, v39, 261864; FLATSCR-NEXT: v_readlane_b32 s96, v39, 251865; FLATSCR-NEXT: v_readlane_b32 s87, v39, 241866; FLATSCR-NEXT: v_readlane_b32 s86, v39, 231867; FLATSCR-NEXT: v_readlane_b32 s85, v39, 221868; FLATSCR-NEXT: v_readlane_b32 s84, v39, 211869; FLATSCR-NEXT: v_readlane_b32 s83, v39, 201870; FLATSCR-NEXT: v_readlane_b32 s82, v39, 191871; FLATSCR-NEXT: v_readlane_b32 s81, v39, 181872; FLATSCR-NEXT: v_readlane_b32 s80, v39, 171873; FLATSCR-NEXT: v_readlane_b32 s71, v39, 161874; FLATSCR-NEXT: v_readlane_b32 s70, v39, 151875; FLATSCR-NEXT: v_readlane_b32 s69, v39, 141876; FLATSCR-NEXT: v_readlane_b32 s68, v39, 131877; FLATSCR-NEXT: v_readlane_b32 s67, v39, 121878; FLATSCR-NEXT: v_readlane_b32 s66, v39, 111879; FLATSCR-NEXT: v_readlane_b32 s65, v39, 101880; FLATSCR-NEXT: v_readlane_b32 s64, v39, 91881; FLATSCR-NEXT: v_readlane_b32 s55, v39, 81882; FLATSCR-NEXT: v_readlane_b32 s54, v39, 71883; FLATSCR-NEXT: v_readlane_b32 s53, v39, 61884; FLATSCR-NEXT: v_readlane_b32 s52, v39, 51885; FLATSCR-NEXT: v_readlane_b32 s51, v39, 41886; FLATSCR-NEXT: v_readlane_b32 s50, v39, 31887; FLATSCR-NEXT: v_readlane_b32 s49, v39, 21888; FLATSCR-NEXT: v_readlane_b32 s48, v39, 11889; FLATSCR-NEXT: v_readlane_b32 s39, v39, 01890; FLATSCR-NEXT: s_mov_b32 s32, s331891; FLATSCR-NEXT: s_xor_saveexec_b64 s[2:3], -11892; FLATSCR-NEXT: s_add_i32 s1, s33, 0x10041893; FLATSCR-NEXT: scratch_load_dword v39, off, s1 ; 4-byte Folded Reload1894; FLATSCR-NEXT: s_mov_b64 exec, s[2:3]1895; FLATSCR-NEXT: s_mov_b32 s33, s01896; FLATSCR-NEXT: s_waitcnt vmcnt(0)1897; FLATSCR-NEXT: s_setpc_b64 s[30:31]1898 %alloca = alloca i32, addrspace(5)1899 store volatile i32 0, ptr addrspace(5) %alloca1900 1901 call void asm sideeffect "; clobber nonpreserved SGPRs and 64 CSRs",1902 "~{s4},~{s5},~{s6},~{s7},~{s8},~{s9}1903 ,~{s10},~{s11},~{s12},~{s13},~{s14},~{s15},~{s16},~{s17},~{s18},~{s19}1904 ,~{s20},~{s21},~{s22},~{s23},~{s24},~{s25},~{s26},~{s27},~{s28},~{s29}1905 ,~{s40},~{s41},~{s42},~{s43},~{s44},~{s45},~{s46},~{s47},~{s48},~{s49}1906 ,~{s50},~{s51},~{s52},~{s53},~{s54},~{s55},~{s56},~{s57},~{s58},~{s59}1907 ,~{s60},~{s61},~{s62},~{s63},~{s64},~{s65},~{s66},~{s67},~{s68},~{s69}1908 ,~{s70},~{s71},~{s72},~{s73},~{s74},~{s75},~{s76},~{s77},~{s78},~{s79}1909 ,~{s80},~{s81},~{s82},~{s83},~{s84},~{s85},~{s86},~{s87},~{s88},~{s89}1910 ,~{s90},~{s91},~{s92},~{s93},~{s94},~{s95},~{s96},~{s97},~{s98},~{s99}1911 ,~{s100},~{s101},~{s102},~{s39},~{vcc}"()1912 1913 call void asm sideeffect "; clobber all VGPRs except CSR v40",1914 "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9}1915 ,~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19}1916 ,~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29}1917 ,~{v30},~{v31},~{v32},~{v33},~{v34},~{v35},~{v36},~{v37},~{v38}"()1918 ret void1919}1920 1921attributes #0 = { nounwind }1922attributes #1 = { nounwind "frame-pointer"="all" }1923attributes #2 = { nounwind "frame-pointer"="non-leaf" }1924attributes #3 = { nounwind "frame-pointer"="all" "amdgpu-waves-per-eu"="6,6" }1925