659 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -global-isel=1 -mtriple=amdgcn--amdpal -mcpu=gfx1100 < %s | FileCheck -check-prefix=GISEL-GFX11 %s3; RUN: llc -global-isel=1 -mtriple=amdgcn--amdpal -mcpu=gfx1030 < %s | FileCheck -check-prefix=GISEL-GFX10 %s4; RUN: llc -global-isel=0 -mtriple=amdgcn--amdpal -mcpu=gfx1100 < %s | FileCheck -check-prefix=DAGISEL-GFX11 %s5; RUN: llc -global-isel=0 -mtriple=amdgcn--amdpal -mcpu=gfx1030 < %s | FileCheck -check-prefix=DAGISEL-GFX10 %s6 7define amdgpu_cs_chain_preserve void @amdgpu_cs_chain_preserve_no_stack({ptr, i32, <4 x i32>} inreg %a, {ptr, i32, <4 x i32>} %b) {8; GISEL-GFX11-LABEL: amdgpu_cs_chain_preserve_no_stack:9; GISEL-GFX11: ; %bb.0:10; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)11; GISEL-GFX11-NEXT: s_endpgm12;13; GISEL-GFX10-LABEL: amdgpu_cs_chain_preserve_no_stack:14; GISEL-GFX10: ; %bb.0:15; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)16; GISEL-GFX10-NEXT: s_endpgm17;18; DAGISEL-GFX11-LABEL: amdgpu_cs_chain_preserve_no_stack:19; DAGISEL-GFX11: ; %bb.0:20; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)21; DAGISEL-GFX11-NEXT: s_endpgm22;23; DAGISEL-GFX10-LABEL: amdgpu_cs_chain_preserve_no_stack:24; DAGISEL-GFX10: ; %bb.0:25; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; DAGISEL-GFX10-NEXT: s_endpgm27 ret void28}29 30define amdgpu_cs void @cs_to_chain_preserve(<3 x i32> inreg %a, <3 x i32> %b) {31; GISEL-GFX11-LABEL: cs_to_chain_preserve:32; GISEL-GFX11: ; %bb.0:33; GISEL-GFX11-NEXT: v_dual_mov_b32 v3, v0 :: v_dual_mov_b32 v10, v234; GISEL-GFX11-NEXT: s_mov_b32 s3, s035; GISEL-GFX11-NEXT: ;;#ASMSTART36; GISEL-GFX11-NEXT: s_nop37; GISEL-GFX11-NEXT: ;;#ASMEND38; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo39; GISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)40; GISEL-GFX11-NEXT: v_dual_mov_b32 v8, v3 :: v_dual_mov_b32 v9, v141; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi42; GISEL-GFX11-NEXT: s_mov_b32 s0, s343; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -144; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]45;46; GISEL-GFX10-LABEL: cs_to_chain_preserve:47; GISEL-GFX10: ; %bb.0:48; GISEL-GFX10-NEXT: s_getpc_b64 s[100:101]49; GISEL-GFX10-NEXT: s_mov_b32 s100, s050; GISEL-GFX10-NEXT: v_mov_b32_e32 v3, v051; GISEL-GFX10-NEXT: s_load_dwordx4 s[100:103], s[100:101], 0x1052; GISEL-GFX10-NEXT: v_mov_b32_e32 v9, v153; GISEL-GFX10-NEXT: v_mov_b32_e32 v10, v254; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo55; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi56; GISEL-GFX10-NEXT: s_waitcnt lgkmcnt(0)57; GISEL-GFX10-NEXT: s_bitset0_b32 s103, 2158; GISEL-GFX10-NEXT: s_add_u32 s100, s100, s359; GISEL-GFX10-NEXT: s_mov_b32 s3, s060; GISEL-GFX10-NEXT: ;;#ASMSTART61; GISEL-GFX10-NEXT: s_nop62; GISEL-GFX10-NEXT: ;;#ASMEND63; GISEL-GFX10-NEXT: s_addc_u32 s101, s101, 064; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v365; GISEL-GFX10-NEXT: s_mov_b64 s[48:49], s[100:101]66; GISEL-GFX10-NEXT: s_mov_b32 s0, s367; GISEL-GFX10-NEXT: s_mov_b64 s[50:51], s[102:103]68; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -169; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]70;71; DAGISEL-GFX11-LABEL: cs_to_chain_preserve:72; DAGISEL-GFX11: ; %bb.0:73; DAGISEL-GFX11-NEXT: v_dual_mov_b32 v3, v0 :: v_dual_mov_b32 v10, v274; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s075; DAGISEL-GFX11-NEXT: ;;#ASMSTART76; DAGISEL-GFX11-NEXT: s_nop77; DAGISEL-GFX11-NEXT: ;;#ASMEND78; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi79; DAGISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)80; DAGISEL-GFX11-NEXT: v_dual_mov_b32 v8, v3 :: v_dual_mov_b32 v9, v181; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo82; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s383; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -184; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]85;86; DAGISEL-GFX10-LABEL: cs_to_chain_preserve:87; DAGISEL-GFX10: ; %bb.0:88; DAGISEL-GFX10-NEXT: s_getpc_b64 s[100:101]89; DAGISEL-GFX10-NEXT: s_mov_b32 s100, s090; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v3, v091; DAGISEL-GFX10-NEXT: s_load_dwordx4 s[100:103], s[100:101], 0x1092; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v9, v193; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v10, v294; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi95; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo96; DAGISEL-GFX10-NEXT: s_waitcnt lgkmcnt(0)97; DAGISEL-GFX10-NEXT: s_bitset0_b32 s103, 2198; DAGISEL-GFX10-NEXT: s_add_u32 s100, s100, s399; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0100; DAGISEL-GFX10-NEXT: ;;#ASMSTART101; DAGISEL-GFX10-NEXT: s_nop102; DAGISEL-GFX10-NEXT: ;;#ASMEND103; DAGISEL-GFX10-NEXT: s_addc_u32 s101, s101, 0104; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v3105; DAGISEL-GFX10-NEXT: s_mov_b64 s[48:49], s[100:101]106; DAGISEL-GFX10-NEXT: s_mov_b64 s[50:51], s[102:103]107; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3108; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1109; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]110 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()111 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_preserve_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %b, i32 0)112 unreachable113}114 115define amdgpu_cs_chain void @chain_to_chain_preserve(<3 x i32> inreg %a, <3 x i32> %b) {116; GISEL-GFX11-LABEL: chain_to_chain_preserve:117; GISEL-GFX11: ; %bb.0:118; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)119; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8120; GISEL-GFX11-NEXT: s_mov_b32 s3, s0121; GISEL-GFX11-NEXT: ;;#ASMSTART122; GISEL-GFX11-NEXT: s_nop123; GISEL-GFX11-NEXT: ;;#ASMEND124; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo125; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi126; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1127; GISEL-GFX11-NEXT: s_mov_b32 s0, s3128; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1129; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]130;131; GISEL-GFX10-LABEL: chain_to_chain_preserve:132; GISEL-GFX10: ; %bb.0:133; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)134; GISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8135; GISEL-GFX10-NEXT: s_mov_b32 s3, s0136; GISEL-GFX10-NEXT: ;;#ASMSTART137; GISEL-GFX10-NEXT: s_nop138; GISEL-GFX10-NEXT: ;;#ASMEND139; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo140; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi141; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1142; GISEL-GFX10-NEXT: s_mov_b32 s0, s3143; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1144; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]145;146; DAGISEL-GFX11-LABEL: chain_to_chain_preserve:147; DAGISEL-GFX11: ; %bb.0:148; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)149; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8150; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s0151; DAGISEL-GFX11-NEXT: ;;#ASMSTART152; DAGISEL-GFX11-NEXT: s_nop153; DAGISEL-GFX11-NEXT: ;;#ASMEND154; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi155; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo156; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1157; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s3158; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1159; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]160;161; DAGISEL-GFX10-LABEL: chain_to_chain_preserve:162; DAGISEL-GFX10: ; %bb.0:163; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)164; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8165; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0166; DAGISEL-GFX10-NEXT: ;;#ASMSTART167; DAGISEL-GFX10-NEXT: s_nop168; DAGISEL-GFX10-NEXT: ;;#ASMEND169; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi170; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo171; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1172; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3173; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1174; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]175 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()176 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_preserve_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %b, i32 0)177 unreachable178}179 180define amdgpu_cs_chain_preserve void @chain_preserve_to_chain_preserve(<3 x i32> inreg %a, <3 x i32> %b) {181; GISEL-GFX11-LABEL: chain_preserve_to_chain_preserve:182; GISEL-GFX11: ; %bb.0:183; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)184; GISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill185; GISEL-GFX11-NEXT: s_mov_b32 s3, s0186; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8187; GISEL-GFX11-NEXT: ;;#ASMSTART188; GISEL-GFX11-NEXT: s_nop189; GISEL-GFX11-NEXT: ;;#ASMEND190; GISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload191; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo192; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi193; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1194; GISEL-GFX11-NEXT: s_mov_b32 s0, s3195; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1196; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]197;198; GISEL-GFX10-LABEL: chain_preserve_to_chain_preserve:199; GISEL-GFX10: ; %bb.0:200; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)201; GISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill202; GISEL-GFX10-NEXT: s_mov_b32 s3, s0203; GISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8204; GISEL-GFX10-NEXT: ;;#ASMSTART205; GISEL-GFX10-NEXT: s_nop206; GISEL-GFX10-NEXT: ;;#ASMEND207; GISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload208; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo209; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi210; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1211; GISEL-GFX10-NEXT: s_mov_b32 s0, s3212; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1213; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]214;215; DAGISEL-GFX11-LABEL: chain_preserve_to_chain_preserve:216; DAGISEL-GFX11: ; %bb.0:217; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)218; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill219; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8220; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s0221; DAGISEL-GFX11-NEXT: ;;#ASMSTART222; DAGISEL-GFX11-NEXT: s_nop223; DAGISEL-GFX11-NEXT: ;;#ASMEND224; DAGISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload225; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi226; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1227; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo228; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s3229; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1230; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]231;232; DAGISEL-GFX10-LABEL: chain_preserve_to_chain_preserve:233; DAGISEL-GFX10: ; %bb.0:234; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)235; DAGISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill236; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8237; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0238; DAGISEL-GFX10-NEXT: ;;#ASMSTART239; DAGISEL-GFX10-NEXT: s_nop240; DAGISEL-GFX10-NEXT: ;;#ASMEND241; DAGISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload242; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee@abs32@hi243; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1244; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee@abs32@lo245; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3246; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1247; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]248 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()249 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_preserve_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %b, i32 0)250 unreachable251}252 253define amdgpu_cs_chain_preserve void @chain_preserve_to_chain(<3 x i32> inreg %a, <3 x i32> %b) {254; GISEL-GFX11-LABEL: chain_preserve_to_chain:255; GISEL-GFX11: ; %bb.0:256; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)257; GISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill258; GISEL-GFX11-NEXT: s_mov_b32 s3, s0259; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8260; GISEL-GFX11-NEXT: ;;#ASMSTART261; GISEL-GFX11-NEXT: s_nop262; GISEL-GFX11-NEXT: ;;#ASMEND263; GISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload264; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo265; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi266; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1267; GISEL-GFX11-NEXT: s_mov_b32 s0, s3268; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1269; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]270;271; GISEL-GFX10-LABEL: chain_preserve_to_chain:272; GISEL-GFX10: ; %bb.0:273; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)274; GISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill275; GISEL-GFX10-NEXT: s_mov_b32 s3, s0276; GISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8277; GISEL-GFX10-NEXT: ;;#ASMSTART278; GISEL-GFX10-NEXT: s_nop279; GISEL-GFX10-NEXT: ;;#ASMEND280; GISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload281; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo282; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi283; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1284; GISEL-GFX10-NEXT: s_mov_b32 s0, s3285; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1286; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]287;288; DAGISEL-GFX11-LABEL: chain_preserve_to_chain:289; DAGISEL-GFX11: ; %bb.0:290; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)291; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill292; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8293; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s0294; DAGISEL-GFX11-NEXT: ;;#ASMSTART295; DAGISEL-GFX11-NEXT: s_nop296; DAGISEL-GFX11-NEXT: ;;#ASMEND297; DAGISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload298; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi299; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1300; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo301; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s3302; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1303; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]304;305; DAGISEL-GFX10-LABEL: chain_preserve_to_chain:306; DAGISEL-GFX10: ; %bb.0:307; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)308; DAGISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill309; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8310; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0311; DAGISEL-GFX10-NEXT: ;;#ASMSTART312; DAGISEL-GFX10-NEXT: s_nop313; DAGISEL-GFX10-NEXT: ;;#ASMEND314; DAGISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload315; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi316; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1317; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo318; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3319; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1320; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]321 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()322 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %b, i32 0)323 unreachable324}325 326define amdgpu_cs_chain_preserve void @chain_preserve_to_chain_wwm(<3 x i32> inreg %a, <3 x i32> %b) {327; GISEL-GFX11-LABEL: chain_preserve_to_chain_wwm:328; GISEL-GFX11: ; %bb.0:329; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)330; GISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill331; GISEL-GFX11-NEXT: s_mov_b32 s3, s0332; GISEL-GFX11-NEXT: s_or_saveexec_b32 s0, -1333; GISEL-GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1)334; GISEL-GFX11-NEXT: v_cndmask_b32_e64 v1, 4, 3, s0335; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, s0336; GISEL-GFX11-NEXT: ;;#ASMSTART337; GISEL-GFX11-NEXT: s_nop338; GISEL-GFX11-NEXT: ;;#ASMEND339; GISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload340; GISEL-GFX11-NEXT: v_mov_b32_e32 v2, v1341; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo342; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi343; GISEL-GFX11-NEXT: s_mov_b32 s0, s3344; GISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)345; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v2346; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1347; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]348;349; GISEL-GFX10-LABEL: chain_preserve_to_chain_wwm:350; GISEL-GFX10: ; %bb.0:351; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)352; GISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill353; GISEL-GFX10-NEXT: s_mov_b32 s3, s0354; GISEL-GFX10-NEXT: s_or_saveexec_b32 s0, -1355; GISEL-GFX10-NEXT: v_cndmask_b32_e64 v1, 4, 3, s0356; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, s0357; GISEL-GFX10-NEXT: ;;#ASMSTART358; GISEL-GFX10-NEXT: s_nop359; GISEL-GFX10-NEXT: ;;#ASMEND360; GISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload361; GISEL-GFX10-NEXT: v_mov_b32_e32 v2, v1362; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo363; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi364; GISEL-GFX10-NEXT: s_mov_b32 s0, s3365; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v2366; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1367; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]368;369; DAGISEL-GFX11-LABEL: chain_preserve_to_chain_wwm:370; DAGISEL-GFX11: ; %bb.0:371; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)372; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill373; DAGISEL-GFX11-NEXT: s_or_saveexec_b32 s4, -1374; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s0375; DAGISEL-GFX11-NEXT: v_cndmask_b32_e64 v1, 4, 3, s4376; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, s4377; DAGISEL-GFX11-NEXT: ;;#ASMSTART378; DAGISEL-GFX11-NEXT: s_nop379; DAGISEL-GFX11-NEXT: ;;#ASMEND380; DAGISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload381; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v2, v1382; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi383; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo384; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s3385; DAGISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)386; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v2387; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1388; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]389;390; DAGISEL-GFX10-LABEL: chain_preserve_to_chain_wwm:391; DAGISEL-GFX10: ; %bb.0:392; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)393; DAGISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill394; DAGISEL-GFX10-NEXT: s_or_saveexec_b32 s4, -1395; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0396; DAGISEL-GFX10-NEXT: v_cndmask_b32_e64 v1, 4, 3, s4397; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, s4398; DAGISEL-GFX10-NEXT: ;;#ASMSTART399; DAGISEL-GFX10-NEXT: s_nop400; DAGISEL-GFX10-NEXT: ;;#ASMEND401; DAGISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload402; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v2, v1403; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi404; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo405; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3406; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v2407; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1408; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]409 %i = call i32 @llvm.amdgcn.set.inactive(i32 3, i32 4)410 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()411 %w = call i32 @llvm.amdgcn.wwm(i32 %i)412 %c = insertelement <3 x i32> %b, i32 %w, i32 0413 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %c, i32 0)414 unreachable415}416 417define amdgpu_cs_chain_preserve void @chain_preserve_to_chain_use_all_v0_v7(<3 x i32> inreg %a, <3 x i32> %b) {418; GISEL-GFX11-LABEL: chain_preserve_to_chain_use_all_v0_v7:419; GISEL-GFX11: ; %bb.0:420; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)421; GISEL-GFX11-NEXT: s_clause 0x1422; GISEL-GFX11-NEXT: scratch_store_b32 off, v11, off offset:4423; GISEL-GFX11-NEXT: scratch_store_b32 off, v16, off424; GISEL-GFX11-NEXT: v_mov_b32_e32 v11, v8425; GISEL-GFX11-NEXT: s_mov_b32 s3, s0426; GISEL-GFX11-NEXT: ;;#ASMSTART427; GISEL-GFX11-NEXT: s_nop428; GISEL-GFX11-NEXT: ;;#ASMEND429; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo430; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi431; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v11432; GISEL-GFX11-NEXT: s_clause 0x1433; GISEL-GFX11-NEXT: scratch_load_b32 v16, off, off434; GISEL-GFX11-NEXT: scratch_load_b32 v11, off, off offset:4435; GISEL-GFX11-NEXT: s_mov_b32 s0, s3436; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1437; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]438;439; GISEL-GFX10-LABEL: chain_preserve_to_chain_use_all_v0_v7:440; GISEL-GFX10: ; %bb.0:441; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)442; GISEL-GFX10-NEXT: buffer_store_dword v11, off, s[48:51], 0 offset:4 ; 4-byte Folded Spill443; GISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill444; GISEL-GFX10-NEXT: v_mov_b32_e32 v11, v8445; GISEL-GFX10-NEXT: s_mov_b32 s3, s0446; GISEL-GFX10-NEXT: ;;#ASMSTART447; GISEL-GFX10-NEXT: s_nop448; GISEL-GFX10-NEXT: ;;#ASMEND449; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo450; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi451; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v11452; GISEL-GFX10-NEXT: s_clause 0x1453; GISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0454; GISEL-GFX10-NEXT: buffer_load_dword v11, off, s[48:51], 0 offset:4455; GISEL-GFX10-NEXT: s_mov_b32 s0, s3456; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1457; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]458;459; DAGISEL-GFX11-LABEL: chain_preserve_to_chain_use_all_v0_v7:460; DAGISEL-GFX11: ; %bb.0:461; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)462; DAGISEL-GFX11-NEXT: s_clause 0x1463; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v11, off offset:4464; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v16, off465; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v11, v8466; DAGISEL-GFX11-NEXT: s_mov_b32 s3, s0467; DAGISEL-GFX11-NEXT: ;;#ASMSTART468; DAGISEL-GFX11-NEXT: s_nop469; DAGISEL-GFX11-NEXT: ;;#ASMEND470; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_callee@abs32@hi471; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_callee@abs32@lo472; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v11473; DAGISEL-GFX11-NEXT: s_clause 0x1474; DAGISEL-GFX11-NEXT: scratch_load_b32 v16, off, off475; DAGISEL-GFX11-NEXT: scratch_load_b32 v11, off, off offset:4476; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s3477; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1478; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]479;480; DAGISEL-GFX10-LABEL: chain_preserve_to_chain_use_all_v0_v7:481; DAGISEL-GFX10: ; %bb.0:482; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)483; DAGISEL-GFX10-NEXT: buffer_store_dword v11, off, s[48:51], 0 offset:4 ; 4-byte Folded Spill484; DAGISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill485; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v11, v8486; DAGISEL-GFX10-NEXT: s_mov_b32 s3, s0487; DAGISEL-GFX10-NEXT: ;;#ASMSTART488; DAGISEL-GFX10-NEXT: s_nop489; DAGISEL-GFX10-NEXT: ;;#ASMEND490; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_callee@abs32@hi491; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_callee@abs32@lo492; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v11493; DAGISEL-GFX10-NEXT: s_clause 0x1494; DAGISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0495; DAGISEL-GFX10-NEXT: buffer_load_dword v11, off, s[48:51], 0 offset:4496; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s3497; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1498; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]499 call void asm "s_nop", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v16},~{s0}"()500 call void(ptr, i32, <3 x i32>, <3 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v3i32(ptr @chain_callee, i32 -1, <3 x i32> inreg %a, <3 x i32> %b, i32 0)501 unreachable502}503 504define amdgpu_cs_chain_preserve void @chain_preserve_to_chain_preserve_fewer_args(<3 x i32> inreg %a, <3 x i32> %b) {505; GISEL-GFX11-LABEL: chain_preserve_to_chain_preserve_fewer_args:506; GISEL-GFX11: ; %bb.0:507; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)508; GISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill509; GISEL-GFX11-NEXT: s_mov_b32 s2, s0510; GISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8511; GISEL-GFX11-NEXT: ;;#ASMSTART512; GISEL-GFX11-NEXT: s_nop513; GISEL-GFX11-NEXT: ;;#ASMEND514; GISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload515; GISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee_2@abs32@lo516; GISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee_2@abs32@hi517; GISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1518; GISEL-GFX11-NEXT: s_mov_b32 s0, s2519; GISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1520; GISEL-GFX11-NEXT: s_setpc_b64 s[4:5]521;522; GISEL-GFX10-LABEL: chain_preserve_to_chain_preserve_fewer_args:523; GISEL-GFX10: ; %bb.0:524; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)525; GISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill526; GISEL-GFX10-NEXT: s_mov_b32 s2, s0527; GISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8528; GISEL-GFX10-NEXT: ;;#ASMSTART529; GISEL-GFX10-NEXT: s_nop530; GISEL-GFX10-NEXT: ;;#ASMEND531; GISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload532; GISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee_2@abs32@lo533; GISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee_2@abs32@hi534; GISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1535; GISEL-GFX10-NEXT: s_mov_b32 s0, s2536; GISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1537; GISEL-GFX10-NEXT: s_setpc_b64 s[4:5]538;539; DAGISEL-GFX11-LABEL: chain_preserve_to_chain_preserve_fewer_args:540; DAGISEL-GFX11: ; %bb.0:541; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)542; DAGISEL-GFX11-NEXT: scratch_store_b32 off, v16, off ; 4-byte Folded Spill543; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v1, v8544; DAGISEL-GFX11-NEXT: s_mov_b32 s2, s0545; DAGISEL-GFX11-NEXT: ;;#ASMSTART546; DAGISEL-GFX11-NEXT: s_nop547; DAGISEL-GFX11-NEXT: ;;#ASMEND548; DAGISEL-GFX11-NEXT: scratch_load_b32 v16, off, off ; 4-byte Folded Reload549; DAGISEL-GFX11-NEXT: s_mov_b32 s5, chain_preserve_callee_2@abs32@hi550; DAGISEL-GFX11-NEXT: v_mov_b32_e32 v8, v1551; DAGISEL-GFX11-NEXT: s_mov_b32 s4, chain_preserve_callee_2@abs32@lo552; DAGISEL-GFX11-NEXT: s_mov_b32 s0, s2553; DAGISEL-GFX11-NEXT: s_mov_b32 exec_lo, -1554; DAGISEL-GFX11-NEXT: s_setpc_b64 s[4:5]555;556; DAGISEL-GFX10-LABEL: chain_preserve_to_chain_preserve_fewer_args:557; DAGISEL-GFX10: ; %bb.0:558; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)559; DAGISEL-GFX10-NEXT: buffer_store_dword v16, off, s[48:51], 0 ; 4-byte Folded Spill560; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v1, v8561; DAGISEL-GFX10-NEXT: s_mov_b32 s2, s0562; DAGISEL-GFX10-NEXT: ;;#ASMSTART563; DAGISEL-GFX10-NEXT: s_nop564; DAGISEL-GFX10-NEXT: ;;#ASMEND565; DAGISEL-GFX10-NEXT: buffer_load_dword v16, off, s[48:51], 0 ; 4-byte Folded Reload566; DAGISEL-GFX10-NEXT: s_mov_b32 s5, chain_preserve_callee_2@abs32@hi567; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v8, v1568; DAGISEL-GFX10-NEXT: s_mov_b32 s4, chain_preserve_callee_2@abs32@lo569; DAGISEL-GFX10-NEXT: s_mov_b32 s0, s2570; DAGISEL-GFX10-NEXT: s_mov_b32 exec_lo, -1571; DAGISEL-GFX10-NEXT: s_setpc_b64 s[4:5]572 %s = shufflevector <3 x i32> %a, <3 x i32> zeroinitializer, <2 x i32> <i32 0, i32 1>573 %v = shufflevector <3 x i32> %b, <3 x i32> zeroinitializer, <2 x i32> <i32 0, i32 1>574 call void asm "s_nop", "~{v0},~{v8},~{v16},~{s0}"()575 call void(ptr, i32, <2 x i32>, <2 x i32>, i32, ...) @llvm.amdgcn.cs.chain.v2i32(ptr @chain_preserve_callee_2, i32 -1, <2 x i32> inreg %s, <2 x i32> %v, i32 0)576 unreachable577}578 579; Note that amdgpu_cs_chain_preserve functions are not allowed to call580; llvm.amdgcn.cs.chain with more vgpr args than they received as parameters.581 582define amdgpu_cs_chain_preserve void @amdgpu_cs_chain_preserve_dont_realign_stack(i32 %idx) {583; GISEL-GFX11-LABEL: amdgpu_cs_chain_preserve_dont_realign_stack:584; GISEL-GFX11: ; %bb.0:585; GISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)586; GISEL-GFX11-NEXT: s_mov_b32 s3, 4587; GISEL-GFX11-NEXT: s_mov_b32 s2, 3588; GISEL-GFX11-NEXT: s_mov_b32 s1, 2589; GISEL-GFX11-NEXT: s_mov_b32 s0, 1590; GISEL-GFX11-NEXT: v_lshlrev_b32_e32 v0, 4, v8591; GISEL-GFX11-NEXT: s_delay_alu instid0(VALU_DEP_1)592; GISEL-GFX11-NEXT: v_mov_b32_e32 v4, v0593; GISEL-GFX11-NEXT: v_dual_mov_b32 v0, s0 :: v_dual_mov_b32 v1, s1594; GISEL-GFX11-NEXT: v_dual_mov_b32 v2, s2 :: v_dual_mov_b32 v3, s3595; GISEL-GFX11-NEXT: scratch_store_b128 v4, v[0:3], off dlc596; GISEL-GFX11-NEXT: s_waitcnt_vscnt null, 0x0597; GISEL-GFX11-NEXT: s_endpgm598;599; GISEL-GFX10-LABEL: amdgpu_cs_chain_preserve_dont_realign_stack:600; GISEL-GFX10: ; %bb.0:601; GISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)602; GISEL-GFX10-NEXT: v_lshlrev_b32_e32 v0, 4, v8603; GISEL-GFX10-NEXT: v_mov_b32_e32 v1, 1604; GISEL-GFX10-NEXT: v_mov_b32_e32 v2, 2605; GISEL-GFX10-NEXT: v_mov_b32_e32 v3, 3606; GISEL-GFX10-NEXT: v_mov_b32_e32 v4, 4607; GISEL-GFX10-NEXT: buffer_store_dword v1, v0, s[48:51], 0 offen608; GISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0609; GISEL-GFX10-NEXT: buffer_store_dword v2, v0, s[48:51], 0 offen offset:4610; GISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0611; GISEL-GFX10-NEXT: buffer_store_dword v3, v0, s[48:51], 0 offen offset:8612; GISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0613; GISEL-GFX10-NEXT: buffer_store_dword v4, v0, s[48:51], 0 offen offset:12614; GISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0615; GISEL-GFX10-NEXT: s_endpgm616;617; DAGISEL-GFX11-LABEL: amdgpu_cs_chain_preserve_dont_realign_stack:618; DAGISEL-GFX11: ; %bb.0:619; DAGISEL-GFX11-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)620; DAGISEL-GFX11-NEXT: v_dual_mov_b32 v0, 1 :: v_dual_mov_b32 v1, 2621; DAGISEL-GFX11-NEXT: v_dual_mov_b32 v2, 3 :: v_dual_mov_b32 v3, 4622; DAGISEL-GFX11-NEXT: v_lshl_add_u32 v4, v8, 4, 0623; DAGISEL-GFX11-NEXT: scratch_store_b128 v4, v[0:3], off dlc624; DAGISEL-GFX11-NEXT: s_waitcnt_vscnt null, 0x0625; DAGISEL-GFX11-NEXT: s_endpgm626;627; DAGISEL-GFX10-LABEL: amdgpu_cs_chain_preserve_dont_realign_stack:628; DAGISEL-GFX10: ; %bb.0:629; DAGISEL-GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)630; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v0, 4631; DAGISEL-GFX10-NEXT: v_lshl_add_u32 v1, v8, 4, 0632; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v2, 3633; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v3, 2634; DAGISEL-GFX10-NEXT: v_mov_b32_e32 v4, 1635; DAGISEL-GFX10-NEXT: buffer_store_dword v0, v1, s[48:51], 0 offen offset:12636; DAGISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0637; DAGISEL-GFX10-NEXT: buffer_store_dword v2, v1, s[48:51], 0 offen offset:8638; DAGISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0639; DAGISEL-GFX10-NEXT: buffer_store_dword v3, v1, s[48:51], 0 offen offset:4640; DAGISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0641; DAGISEL-GFX10-NEXT: buffer_store_dword v4, v1, s[48:51], 0 offen642; DAGISEL-GFX10-NEXT: s_waitcnt_vscnt null, 0x0643; DAGISEL-GFX10-NEXT: s_endpgm644 %alloca.align32 = alloca [8 x <4 x i32>], align 32, addrspace(5)645 %gep0 = getelementptr inbounds [8 x <4 x i32>], ptr addrspace(5) %alloca.align32, i32 0, i32 %idx646 store volatile <4 x i32> <i32 1, i32 2, i32 3, i32 4>, ptr addrspace(5) %gep0, align 32647 ret void648}649 650declare void @llvm.amdgcn.cs.chain.v3i32(ptr, i32, <3 x i32>, <3 x i32>, i32, ...)651declare amdgpu_cs_chain_preserve void @chain_preserve_callee(<3 x i32> inreg, <3 x i32>)652declare amdgpu_cs_chain void @chain_callee(<3 x i32> inreg, <3 x i32>)653 654declare void @llvm.amdgcn.cs.chain.v2i32(ptr, i32, <2 x i32>, <2 x i32>, i32, ...)655declare amdgpu_cs_chain_preserve void @chain_preserve_callee_2(<2 x i32> inreg, <2 x i32>)656 657declare i32 @llvm.amdgcn.set.inactive(i32, i32)658declare i32 @llvm.amdgcn.wwm(i32)659