1279 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel=1 -O2 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck --check-prefix=GISEL12 %s3; RUN: llc -global-isel=0 -O2 -mtriple=amdgcn -mcpu=gfx1200 < %s | FileCheck --check-prefix=DAGISEL12 %s4; RUN: llc -global-isel=1 -O2 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck --check-prefix=GISEL10 %s5; RUN: llc -global-isel=0 -O2 -mtriple=amdgcn -mcpu=gfx1030 < %s | FileCheck --check-prefix=DAGISEL10 %s6 7define amdgpu_cs_chain void @basic(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %x, i32 %y) {8; GISEL12-LABEL: basic:9; GISEL12: ; %bb.0: ; %entry10; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x011; GISEL12-NEXT: s_wait_expcnt 0x012; GISEL12-NEXT: s_wait_samplecnt 0x013; GISEL12-NEXT: s_wait_bvhcnt 0x014; GISEL12-NEXT: s_wait_kmcnt 0x015; GISEL12-NEXT: s_or_saveexec_b32 s8, -116; GISEL12-NEXT: s_mov_b32 s6, s317; GISEL12-NEXT: s_mov_b32 s7, s418; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)19; GISEL12-NEXT: s_and_saveexec_b32 s3, s820; GISEL12-NEXT: ; %bb.1: ; %shader21; GISEL12-NEXT: v_add_nc_u32_e32 v12, 42, v1222; GISEL12-NEXT: v_add_nc_u32_e32 v8, 5, v823; GISEL12-NEXT: ; %bb.2: ; %tail24; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)25; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s326; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_2)27; GISEL12-NEXT: v_add_nc_u32_e32 v11, 32, v1228; GISEL12-NEXT: s_mov_b32 exec_lo, s529; GISEL12-NEXT: s_setpc_b64 s[6:7]30;31; DAGISEL12-LABEL: basic:32; DAGISEL12: ; %bb.0: ; %entry33; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x034; DAGISEL12-NEXT: s_wait_expcnt 0x035; DAGISEL12-NEXT: s_wait_samplecnt 0x036; DAGISEL12-NEXT: s_wait_bvhcnt 0x037; DAGISEL12-NEXT: s_wait_kmcnt 0x038; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -139; DAGISEL12-NEXT: s_mov_b32 s7, s440; DAGISEL12-NEXT: s_mov_b32 s6, s341; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)42; DAGISEL12-NEXT: s_and_saveexec_b32 s3, s843; DAGISEL12-NEXT: ; %bb.1: ; %shader44; DAGISEL12-NEXT: v_add_nc_u32_e32 v12, 42, v1245; DAGISEL12-NEXT: v_add_nc_u32_e32 v8, 5, v846; DAGISEL12-NEXT: ; %bb.2: ; %tail47; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)48; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s349; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_2)50; DAGISEL12-NEXT: v_add_nc_u32_e32 v11, 32, v1251; DAGISEL12-NEXT: s_mov_b32 exec_lo, s552; DAGISEL12-NEXT: s_setpc_b64 s[6:7]53;54; GISEL10-LABEL: basic:55; GISEL10: ; %bb.0: ; %entry56; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)57; GISEL10-NEXT: s_or_saveexec_b32 s8, -158; GISEL10-NEXT: s_mov_b32 s6, s359; GISEL10-NEXT: s_mov_b32 s7, s460; GISEL10-NEXT: s_and_saveexec_b32 s3, s861; GISEL10-NEXT: ; %bb.1: ; %shader62; GISEL10-NEXT: v_add_nc_u32_e32 v12, 42, v1263; GISEL10-NEXT: v_add_nc_u32_e32 v8, 5, v864; GISEL10-NEXT: ; %bb.2: ; %tail65; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s366; GISEL10-NEXT: v_add_nc_u32_e32 v11, 32, v1267; GISEL10-NEXT: s_mov_b32 exec_lo, s568; GISEL10-NEXT: s_setpc_b64 s[6:7]69;70; DAGISEL10-LABEL: basic:71; DAGISEL10: ; %bb.0: ; %entry72; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)73; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -174; DAGISEL10-NEXT: s_mov_b32 s7, s475; DAGISEL10-NEXT: s_mov_b32 s6, s376; DAGISEL10-NEXT: s_and_saveexec_b32 s3, s877; DAGISEL10-NEXT: ; %bb.1: ; %shader78; DAGISEL10-NEXT: v_add_nc_u32_e32 v12, 42, v1279; DAGISEL10-NEXT: v_add_nc_u32_e32 v8, 5, v880; DAGISEL10-NEXT: ; %bb.2: ; %tail81; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s382; DAGISEL10-NEXT: v_add_nc_u32_e32 v11, 32, v1283; DAGISEL10-NEXT: s_mov_b32 exec_lo, s584; DAGISEL10-NEXT: s_setpc_b64 s[6:7]85entry:86 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()87 br i1 %entry_exec, label %shader, label %tail88 89shader:90 %newx = add i32 %x, 4291 %oldval = extractvalue { i32, ptr addrspace(5), i32, i32 } %vgpr, 092 %newval = add i32 %oldval, 593 %newvgpr = insertvalue { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %newval, 094 95 br label %tail96 97tail:98 %full.x = phi i32 [%x, %entry], [%newx, %shader]99 %full.vgpr = phi { i32, ptr addrspace(5), i32, i32 } [%vgpr, %entry], [%newvgpr, %shader]100 %modified.x = add i32 %full.x, 32101 %vgpr.args = insertvalue { i32, ptr addrspace(5), i32, i32 } %full.vgpr, i32 %modified.x, 3102 call void(ptr, i32, <3 x i32>, { i32, ptr addrspace(5), i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, { i32, ptr addrspace(5), i32, i32 } %vgpr.args, i32 0)103 unreachable104}105 106define amdgpu_cs_chain void @wwm_in_shader(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %x, i32 %y) {107; GISEL12-LABEL: wwm_in_shader:108; GISEL12: ; %bb.0: ; %entry109; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x0110; GISEL12-NEXT: s_wait_expcnt 0x0111; GISEL12-NEXT: s_wait_samplecnt 0x0112; GISEL12-NEXT: s_wait_bvhcnt 0x0113; GISEL12-NEXT: s_wait_kmcnt 0x0114; GISEL12-NEXT: s_or_saveexec_b32 s8, -1115; GISEL12-NEXT: v_dual_mov_b32 v10, v12 :: v_dual_mov_b32 v11, v13116; GISEL12-NEXT: s_mov_b32 s6, s3117; GISEL12-NEXT: s_mov_b32 s7, s4118; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)119; GISEL12-NEXT: s_and_saveexec_b32 s3, s8120; GISEL12-NEXT: ; %bb.1: ; %shader121; GISEL12-NEXT: s_or_saveexec_b32 s4, -1122; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)123; GISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v10, s4124; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)125; GISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v0126; GISEL12-NEXT: s_wait_alu depctr_va_sdst(0)127; GISEL12-NEXT: v_mov_b32_e32 v0, s8128; GISEL12-NEXT: s_mov_b32 exec_lo, s4129; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)130; GISEL12-NEXT: v_dual_mov_b32 v11, v0 :: v_dual_add_nc_u32 v10, 42, v10131; GISEL12-NEXT: ; %bb.2: ; %tail132; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3133; GISEL12-NEXT: s_mov_b32 exec_lo, s5134; GISEL12-NEXT: s_setpc_b64 s[6:7]135;136; DAGISEL12-LABEL: wwm_in_shader:137; DAGISEL12: ; %bb.0: ; %entry138; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x0139; DAGISEL12-NEXT: s_wait_expcnt 0x0140; DAGISEL12-NEXT: s_wait_samplecnt 0x0141; DAGISEL12-NEXT: s_wait_bvhcnt 0x0142; DAGISEL12-NEXT: s_wait_kmcnt 0x0143; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -1144; DAGISEL12-NEXT: v_dual_mov_b32 v11, v13 :: v_dual_mov_b32 v10, v12145; DAGISEL12-NEXT: s_mov_b32 s7, s4146; DAGISEL12-NEXT: s_mov_b32 s6, s3147; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)148; DAGISEL12-NEXT: s_and_saveexec_b32 s3, s8149; DAGISEL12-NEXT: ; %bb.1: ; %shader150; DAGISEL12-NEXT: s_or_saveexec_b32 s4, -1151; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)152; DAGISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v10, s4153; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)154; DAGISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v0155; DAGISEL12-NEXT: s_mov_b32 exec_lo, s4156; DAGISEL12-NEXT: v_dual_mov_b32 v11, s8 :: v_dual_add_nc_u32 v10, 42, v10157; DAGISEL12-NEXT: ; %bb.2: ; %tail158; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3159; DAGISEL12-NEXT: s_mov_b32 exec_lo, s5160; DAGISEL12-NEXT: s_setpc_b64 s[6:7]161;162; GISEL10-LABEL: wwm_in_shader:163; GISEL10: ; %bb.0: ; %entry164; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)165; GISEL10-NEXT: s_or_saveexec_b32 s8, -1166; GISEL10-NEXT: v_mov_b32_e32 v10, v12167; GISEL10-NEXT: v_mov_b32_e32 v11, v13168; GISEL10-NEXT: s_mov_b32 s6, s3169; GISEL10-NEXT: s_mov_b32 s7, s4170; GISEL10-NEXT: s_and_saveexec_b32 s3, s8171; GISEL10-NEXT: ; %bb.1: ; %shader172; GISEL10-NEXT: s_or_saveexec_b32 s4, -1173; GISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v10, s4174; GISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v0175; GISEL10-NEXT: v_mov_b32_e32 v0, s8176; GISEL10-NEXT: s_mov_b32 exec_lo, s4177; GISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v10178; GISEL10-NEXT: v_mov_b32_e32 v11, v0179; GISEL10-NEXT: ; %bb.2: ; %tail180; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3181; GISEL10-NEXT: s_mov_b32 exec_lo, s5182; GISEL10-NEXT: s_setpc_b64 s[6:7]183;184; DAGISEL10-LABEL: wwm_in_shader:185; DAGISEL10: ; %bb.0: ; %entry186; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)187; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -1188; DAGISEL10-NEXT: v_mov_b32_e32 v11, v13189; DAGISEL10-NEXT: v_mov_b32_e32 v10, v12190; DAGISEL10-NEXT: s_mov_b32 s7, s4191; DAGISEL10-NEXT: s_mov_b32 s6, s3192; DAGISEL10-NEXT: s_and_saveexec_b32 s3, s8193; DAGISEL10-NEXT: ; %bb.1: ; %shader194; DAGISEL10-NEXT: s_or_saveexec_b32 s4, -1195; DAGISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v10, s4196; DAGISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v0197; DAGISEL10-NEXT: s_mov_b32 exec_lo, s4198; DAGISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v10199; DAGISEL10-NEXT: v_mov_b32_e32 v11, s8200; DAGISEL10-NEXT: ; %bb.2: ; %tail201; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3202; DAGISEL10-NEXT: s_mov_b32 exec_lo, s5203; DAGISEL10-NEXT: s_setpc_b64 s[6:7]204entry:205 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()206 br i1 %entry_exec, label %shader, label %tail207 208shader:209 %nonwwm = add i32 %x, 42210 211 %full.vgpr = call i32 @llvm.amdgcn.set.inactive.i32(i32 %x, i32 71)212 %non.zero = icmp ne i32 %full.vgpr, 0213 %ballot = call i32 @llvm.amdgcn.ballot.i32(i1 %non.zero)214 %wwm = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %ballot)215 216 br label %tail217 218tail:219 %full.nonwwm = phi i32 [%x, %entry], [%nonwwm, %shader]220 %full.wwm = phi i32 [%y, %entry], [%wwm, %shader]221 %vgpr.1 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr, i32 %full.nonwwm, 2222 %vgpr.2 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.1, i32 %full.wwm, 3223 call void(ptr, i32, <3 x i32>, { i32, ptr addrspace(5), i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, { i32, ptr addrspace(5), i32, i32 } %vgpr.2, i32 0)224 unreachable225}226 227define amdgpu_cs_chain void @phi_whole_struct(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %x, i32 %y) {228; GISEL12-LABEL: phi_whole_struct:229; GISEL12: ; %bb.0: ; %entry230; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x0231; GISEL12-NEXT: s_wait_expcnt 0x0232; GISEL12-NEXT: s_wait_samplecnt 0x0233; GISEL12-NEXT: s_wait_bvhcnt 0x0234; GISEL12-NEXT: s_wait_kmcnt 0x0235; GISEL12-NEXT: s_or_saveexec_b32 s8, -1236; GISEL12-NEXT: s_mov_b32 s6, s3237; GISEL12-NEXT: s_mov_b32 s7, s4238; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)239; GISEL12-NEXT: s_and_saveexec_b32 s3, s8240; GISEL12-NEXT: ; %bb.1: ; %shader241; GISEL12-NEXT: s_or_saveexec_b32 s4, -1242; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)243; GISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v12, s4244; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)245; GISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v0246; GISEL12-NEXT: s_wait_alu depctr_va_sdst(0)247; GISEL12-NEXT: v_mov_b32_e32 v0, s8248; GISEL12-NEXT: s_mov_b32 exec_lo, s4249; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)250; GISEL12-NEXT: v_dual_mov_b32 v11, v0 :: v_dual_add_nc_u32 v10, 42, v12251; GISEL12-NEXT: ; %bb.2: ; %tail252; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3253; GISEL12-NEXT: s_mov_b32 exec_lo, s5254; GISEL12-NEXT: s_setpc_b64 s[6:7]255;256; DAGISEL12-LABEL: phi_whole_struct:257; DAGISEL12: ; %bb.0: ; %entry258; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x0259; DAGISEL12-NEXT: s_wait_expcnt 0x0260; DAGISEL12-NEXT: s_wait_samplecnt 0x0261; DAGISEL12-NEXT: s_wait_bvhcnt 0x0262; DAGISEL12-NEXT: s_wait_kmcnt 0x0263; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -1264; DAGISEL12-NEXT: s_mov_b32 s7, s4265; DAGISEL12-NEXT: s_mov_b32 s6, s3266; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)267; DAGISEL12-NEXT: s_and_saveexec_b32 s3, s8268; DAGISEL12-NEXT: ; %bb.1: ; %shader269; DAGISEL12-NEXT: s_or_saveexec_b32 s4, -1270; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)271; DAGISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v12, s4272; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)273; DAGISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v0274; DAGISEL12-NEXT: s_mov_b32 exec_lo, s4275; DAGISEL12-NEXT: v_dual_mov_b32 v11, s8 :: v_dual_add_nc_u32 v10, 42, v12276; DAGISEL12-NEXT: ; %bb.2: ; %tail277; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3278; DAGISEL12-NEXT: s_mov_b32 exec_lo, s5279; DAGISEL12-NEXT: s_setpc_b64 s[6:7]280;281; GISEL10-LABEL: phi_whole_struct:282; GISEL10: ; %bb.0: ; %entry283; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)284; GISEL10-NEXT: s_or_saveexec_b32 s8, -1285; GISEL10-NEXT: s_mov_b32 s6, s3286; GISEL10-NEXT: s_mov_b32 s7, s4287; GISEL10-NEXT: s_and_saveexec_b32 s3, s8288; GISEL10-NEXT: ; %bb.1: ; %shader289; GISEL10-NEXT: s_or_saveexec_b32 s4, -1290; GISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v12, s4291; GISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v0292; GISEL10-NEXT: v_mov_b32_e32 v0, s8293; GISEL10-NEXT: s_mov_b32 exec_lo, s4294; GISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v12295; GISEL10-NEXT: v_mov_b32_e32 v11, v0296; GISEL10-NEXT: ; %bb.2: ; %tail297; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3298; GISEL10-NEXT: s_mov_b32 exec_lo, s5299; GISEL10-NEXT: s_setpc_b64 s[6:7]300;301; DAGISEL10-LABEL: phi_whole_struct:302; DAGISEL10: ; %bb.0: ; %entry303; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)304; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -1305; DAGISEL10-NEXT: s_mov_b32 s7, s4306; DAGISEL10-NEXT: s_mov_b32 s6, s3307; DAGISEL10-NEXT: s_and_saveexec_b32 s3, s8308; DAGISEL10-NEXT: ; %bb.1: ; %shader309; DAGISEL10-NEXT: s_or_saveexec_b32 s4, -1310; DAGISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v12, s4311; DAGISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v0312; DAGISEL10-NEXT: s_mov_b32 exec_lo, s4313; DAGISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v12314; DAGISEL10-NEXT: v_mov_b32_e32 v11, s8315; DAGISEL10-NEXT: ; %bb.2: ; %tail316; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3317; DAGISEL10-NEXT: s_mov_b32 exec_lo, s5318; DAGISEL10-NEXT: s_setpc_b64 s[6:7]319entry:320 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()321 br i1 %entry_exec, label %shader, label %tail322 323shader:324 %nonwwm = add i32 %x, 42325 %vgpr.1 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr, i32 %nonwwm, 2326 327 %full.vgpr = call i32 @llvm.amdgcn.set.inactive.i32(i32 %x, i32 71)328 %non.zero = icmp ne i32 %full.vgpr, 0329 %ballot = call i32 @llvm.amdgcn.ballot.i32(i1 %non.zero)330 %wwm = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %ballot)331 %vgpr.2 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.1, i32 %wwm, 3332 333 br label %tail334 335tail:336 %vgpr.args = phi { i32, ptr addrspace(5), i32, i32} [%vgpr, %entry], [%vgpr.2, %shader]337 call void(ptr, i32, <3 x i32>, { i32, ptr addrspace(5), i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, { i32, ptr addrspace(5), i32, i32 } %vgpr.args, i32 0)338 unreachable339}340 341; Introduce more complex control flow - %shader contains a simple loop, and %tail contains an if.342define amdgpu_cs_chain void @control_flow(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %x, i32 %y) {343; GISEL12-LABEL: control_flow:344; GISEL12: ; %bb.0: ; %entry345; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x0346; GISEL12-NEXT: s_wait_expcnt 0x0347; GISEL12-NEXT: s_wait_samplecnt 0x0348; GISEL12-NEXT: s_wait_bvhcnt 0x0349; GISEL12-NEXT: s_wait_kmcnt 0x0350; GISEL12-NEXT: s_or_saveexec_b32 s8, -1351; GISEL12-NEXT: s_mov_b32 s6, s3352; GISEL12-NEXT: s_mov_b32 s7, s4353; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)354; GISEL12-NEXT: s_and_saveexec_b32 s3, s8355; GISEL12-NEXT: s_cbranch_execz .LBB3_4356; GISEL12-NEXT: ; %bb.1: ; %shader.preheader357; GISEL12-NEXT: v_add_nc_u32_e32 v1, -1, v12358; GISEL12-NEXT: s_mov_b32 s4, 0359; GISEL12-NEXT: .LBB3_2: ; %shader360; GISEL12-NEXT: ; =>This Inner Loop Header: Depth=1361; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)362; GISEL12-NEXT: v_add_nc_u32_e32 v1, 1, v1363; GISEL12-NEXT: s_or_saveexec_b32 s8, -1364; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)365; GISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v1, s8366; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)367; GISEL12-NEXT: v_cmp_ne_u32_e64 s9, 0, v0368; GISEL12-NEXT: s_wait_alu depctr_va_sdst(0)369; GISEL12-NEXT: v_mov_b32_e32 v0, s9370; GISEL12-NEXT: s_mov_b32 exec_lo, s8371; GISEL12-NEXT: v_cmp_eq_u32_e32 vcc_lo, v13, v1372; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_2)373; GISEL12-NEXT: v_mov_b32_e32 v11, v0374; GISEL12-NEXT: s_or_b32 s4, vcc_lo, s4375; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)376; GISEL12-NEXT: s_and_not1_b32 exec_lo, exec_lo, s4377; GISEL12-NEXT: s_cbranch_execnz .LBB3_2378; GISEL12-NEXT: ; %bb.3: ; %tail.loopexit379; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s4380; GISEL12-NEXT: v_add_nc_u32_e32 v10, 42, v1381; GISEL12-NEXT: .LBB3_4: ; %Flow1382; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)383; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3384; GISEL12-NEXT: s_delay_alu instid0(SALU_CYCLE_1)385; GISEL12-NEXT: s_mov_b32 s3, exec_lo386; GISEL12-NEXT: ; implicit-def: $vgpr8387; GISEL12-NEXT: v_cmpx_lt_i32_e64 v12, v13388; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)389; GISEL12-NEXT: s_xor_b32 s3, exec_lo, s3390; GISEL12-NEXT: ; %bb.5: ; %tail.else391; GISEL12-NEXT: s_or_saveexec_b32 s4, -1392; GISEL12-NEXT: v_mov_b32_e32 v0, 15393; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)394; GISEL12-NEXT: s_mov_b32 exec_lo, s4395; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)396; GISEL12-NEXT: v_mov_b32_e32 v8, v0397; GISEL12-NEXT: ; %bb.6: ; %Flow398; GISEL12-NEXT: s_and_not1_saveexec_b32 s3, s3399; GISEL12-NEXT: ; %bb.7: ; %tail.then400; GISEL12-NEXT: s_mov_b32 s4, 44401; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)402; GISEL12-NEXT: v_mov_b32_e32 v8, s4403; GISEL12-NEXT: ; %bb.8: ; %tail.end404; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3405; GISEL12-NEXT: s_mov_b32 exec_lo, s5406; GISEL12-NEXT: s_setpc_b64 s[6:7]407;408; DAGISEL12-LABEL: control_flow:409; DAGISEL12: ; %bb.0: ; %entry410; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x0411; DAGISEL12-NEXT: s_wait_expcnt 0x0412; DAGISEL12-NEXT: s_wait_samplecnt 0x0413; DAGISEL12-NEXT: s_wait_bvhcnt 0x0414; DAGISEL12-NEXT: s_wait_kmcnt 0x0415; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -1416; DAGISEL12-NEXT: s_mov_b32 s7, s4417; DAGISEL12-NEXT: s_mov_b32 s6, s3418; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)419; DAGISEL12-NEXT: s_and_saveexec_b32 s3, s8420; DAGISEL12-NEXT: s_cbranch_execz .LBB3_4421; DAGISEL12-NEXT: ; %bb.1: ; %shader.preheader422; DAGISEL12-NEXT: v_add_nc_u32_e32 v1, -1, v12423; DAGISEL12-NEXT: s_mov_b32 s4, 0424; DAGISEL12-NEXT: .LBB3_2: ; %shader425; DAGISEL12-NEXT: ; =>This Inner Loop Header: Depth=1426; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)427; DAGISEL12-NEXT: v_add_nc_u32_e32 v1, 1, v1428; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -1429; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)430; DAGISEL12-NEXT: v_cndmask_b32_e64 v0, 0x47, v1, s8431; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)432; DAGISEL12-NEXT: v_cmp_ne_u32_e64 s9, 0, v0433; DAGISEL12-NEXT: s_mov_b32 exec_lo, s8434; DAGISEL12-NEXT: v_cmp_eq_u32_e32 vcc_lo, v13, v1435; DAGISEL12-NEXT: v_mov_b32_e32 v11, s9436; DAGISEL12-NEXT: s_or_b32 s4, vcc_lo, s4437; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)438; DAGISEL12-NEXT: s_and_not1_b32 exec_lo, exec_lo, s4439; DAGISEL12-NEXT: s_cbranch_execnz .LBB3_2440; DAGISEL12-NEXT: ; %bb.3: ; %tail.loopexit441; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s4442; DAGISEL12-NEXT: v_add_nc_u32_e32 v10, 42, v1443; DAGISEL12-NEXT: .LBB3_4: ; %Flow1444; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)445; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3446; DAGISEL12-NEXT: s_delay_alu instid0(SALU_CYCLE_1)447; DAGISEL12-NEXT: s_mov_b32 s3, exec_lo448; DAGISEL12-NEXT: ; implicit-def: $vgpr8449; DAGISEL12-NEXT: v_cmpx_lt_i32_e64 v12, v13450; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)451; DAGISEL12-NEXT: s_xor_b32 s3, exec_lo, s3452; DAGISEL12-NEXT: ; %bb.5: ; %tail.else453; DAGISEL12-NEXT: s_mov_b32 s4, 15454; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)455; DAGISEL12-NEXT: v_mov_b32_e32 v8, s4456; DAGISEL12-NEXT: ; %bb.6: ; %Flow457; DAGISEL12-NEXT: s_and_not1_saveexec_b32 s3, s3458; DAGISEL12-NEXT: ; %bb.7: ; %tail.then459; DAGISEL12-NEXT: v_mov_b32_e32 v8, 44460; DAGISEL12-NEXT: ; %bb.8: ; %tail.end461; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)462; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3463; DAGISEL12-NEXT: s_mov_b32 exec_lo, s5464; DAGISEL12-NEXT: s_setpc_b64 s[6:7]465;466; GISEL10-LABEL: control_flow:467; GISEL10: ; %bb.0: ; %entry468; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)469; GISEL10-NEXT: s_or_saveexec_b32 s8, -1470; GISEL10-NEXT: s_mov_b32 s6, s3471; GISEL10-NEXT: s_mov_b32 s7, s4472; GISEL10-NEXT: s_and_saveexec_b32 s3, s8473; GISEL10-NEXT: s_cbranch_execz .LBB3_4474; GISEL10-NEXT: ; %bb.1: ; %shader.preheader475; GISEL10-NEXT: v_add_nc_u32_e32 v1, -1, v12476; GISEL10-NEXT: s_mov_b32 s4, 0477; GISEL10-NEXT: .LBB3_2: ; %shader478; GISEL10-NEXT: ; =>This Inner Loop Header: Depth=1479; GISEL10-NEXT: v_add_nc_u32_e32 v1, 1, v1480; GISEL10-NEXT: s_or_saveexec_b32 s8, -1481; GISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v1, s8482; GISEL10-NEXT: v_cmp_ne_u32_e64 s9, 0, v0483; GISEL10-NEXT: v_mov_b32_e32 v0, s9484; GISEL10-NEXT: s_mov_b32 exec_lo, s8485; GISEL10-NEXT: v_cmp_eq_u32_e32 vcc_lo, v13, v1486; GISEL10-NEXT: v_mov_b32_e32 v11, v0487; GISEL10-NEXT: s_or_b32 s4, vcc_lo, s4488; GISEL10-NEXT: s_andn2_b32 exec_lo, exec_lo, s4489; GISEL10-NEXT: s_cbranch_execnz .LBB3_2490; GISEL10-NEXT: ; %bb.3: ; %tail.loopexit491; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s4492; GISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v1493; GISEL10-NEXT: .LBB3_4: ; %Flow1494; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3495; GISEL10-NEXT: s_mov_b32 s3, exec_lo496; GISEL10-NEXT: ; implicit-def: $vgpr8497; GISEL10-NEXT: v_cmpx_lt_i32_e64 v12, v13498; GISEL10-NEXT: s_xor_b32 s3, exec_lo, s3499; GISEL10-NEXT: ; %bb.5: ; %tail.else500; GISEL10-NEXT: s_or_saveexec_b32 s4, -1501; GISEL10-NEXT: v_mov_b32_e32 v0, 15502; GISEL10-NEXT: s_mov_b32 exec_lo, s4503; GISEL10-NEXT: v_mov_b32_e32 v8, v0504; GISEL10-NEXT: ; %bb.6: ; %Flow505; GISEL10-NEXT: s_andn2_saveexec_b32 s3, s3506; GISEL10-NEXT: ; %bb.7: ; %tail.then507; GISEL10-NEXT: s_mov_b32 s4, 44508; GISEL10-NEXT: v_mov_b32_e32 v8, s4509; GISEL10-NEXT: ; %bb.8: ; %tail.end510; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3511; GISEL10-NEXT: s_mov_b32 exec_lo, s5512; GISEL10-NEXT: s_setpc_b64 s[6:7]513;514; DAGISEL10-LABEL: control_flow:515; DAGISEL10: ; %bb.0: ; %entry516; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)517; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -1518; DAGISEL10-NEXT: s_mov_b32 s7, s4519; DAGISEL10-NEXT: s_mov_b32 s6, s3520; DAGISEL10-NEXT: s_and_saveexec_b32 s3, s8521; DAGISEL10-NEXT: s_cbranch_execz .LBB3_4522; DAGISEL10-NEXT: ; %bb.1: ; %shader.preheader523; DAGISEL10-NEXT: v_add_nc_u32_e32 v1, -1, v12524; DAGISEL10-NEXT: s_mov_b32 s4, 0525; DAGISEL10-NEXT: .LBB3_2: ; %shader526; DAGISEL10-NEXT: ; =>This Inner Loop Header: Depth=1527; DAGISEL10-NEXT: v_add_nc_u32_e32 v1, 1, v1528; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -1529; DAGISEL10-NEXT: v_cndmask_b32_e64 v0, 0x47, v1, s8530; DAGISEL10-NEXT: v_cmp_ne_u32_e64 s9, 0, v0531; DAGISEL10-NEXT: s_mov_b32 exec_lo, s8532; DAGISEL10-NEXT: v_cmp_eq_u32_e32 vcc_lo, v13, v1533; DAGISEL10-NEXT: v_mov_b32_e32 v11, s9534; DAGISEL10-NEXT: s_or_b32 s4, vcc_lo, s4535; DAGISEL10-NEXT: s_andn2_b32 exec_lo, exec_lo, s4536; DAGISEL10-NEXT: s_cbranch_execnz .LBB3_2537; DAGISEL10-NEXT: ; %bb.3: ; %tail.loopexit538; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s4539; DAGISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v1540; DAGISEL10-NEXT: .LBB3_4: ; %Flow1541; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3542; DAGISEL10-NEXT: s_mov_b32 s3, exec_lo543; DAGISEL10-NEXT: ; implicit-def: $vgpr8544; DAGISEL10-NEXT: v_cmpx_lt_i32_e64 v12, v13545; DAGISEL10-NEXT: s_xor_b32 s3, exec_lo, s3546; DAGISEL10-NEXT: ; %bb.5: ; %tail.else547; DAGISEL10-NEXT: s_mov_b32 s4, 15548; DAGISEL10-NEXT: v_mov_b32_e32 v8, s4549; DAGISEL10-NEXT: ; %bb.6: ; %Flow550; DAGISEL10-NEXT: s_andn2_saveexec_b32 s3, s3551; DAGISEL10-NEXT: ; %bb.7: ; %tail.then552; DAGISEL10-NEXT: v_mov_b32_e32 v8, 44553; DAGISEL10-NEXT: ; %bb.8: ; %tail.end554; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3555; DAGISEL10-NEXT: s_mov_b32 exec_lo, s5556; DAGISEL10-NEXT: s_setpc_b64 s[6:7]557entry:558 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()559 br i1 %entry_exec, label %shader, label %tail560 561shader:562 %i = phi i32 [%x, %entry], [%i.inc, %shader]563 564 %nonwwm = add i32 %i, 42565 %vgpr.1 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr, i32 %nonwwm, 2566 567 %full.vgpr = call i32 @llvm.amdgcn.set.inactive.i32(i32 %i, i32 71)568 %non.zero = icmp ne i32 %full.vgpr, 0569 %ballot = call i32 @llvm.amdgcn.ballot.i32(i1 %non.zero)570 %wwm = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %ballot)571 %vgpr.2 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.1, i32 %wwm, 3572 573 %i.inc = add i32 %i, 1574 %loop.cond = icmp ne i32 %i, %y575 br i1 %loop.cond, label %shader, label %tail576 577tail:578 %vgpr.tail = phi { i32, ptr addrspace(5), i32, i32} [%vgpr, %entry], [%vgpr.2, %shader]579 580 %if.cond = icmp sge i32 %x, %y581 br i1 %if.cond, label %tail.then, label %tail.else582 583tail.then:584 %vgpr.then = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.tail, i32 44, 0585 br label %tail.end586 587tail.else:588 %wwm.tail = call i32 @llvm.amdgcn.strict.wwm.i32(i32 15)589 %vgpr.else = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.tail, i32 %wwm.tail, 0590 br label %tail.end591 592tail.end:593 %vgpr.args = phi { i32, ptr addrspace(5), i32, i32 } [%vgpr.then, %tail.then], [%vgpr.else, %tail.else]594 call void(ptr, i32, <3 x i32>, { i32, ptr addrspace(5), i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, { i32, ptr addrspace(5), i32, i32 } %vgpr.args, i32 0)595 unreachable596}597 598; Try with v0-v7 occupied - this will force us to use higher registers for temporaries. Make sure we don't preserve them.599define amdgpu_cs_chain void @use_v0_7(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, { i32, ptr addrspace(5), i32, i32 } %vgpr, i32 %x, i32 %y) {600; GISEL12-LABEL: use_v0_7:601; GISEL12: ; %bb.0: ; %entry602; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x0603; GISEL12-NEXT: s_wait_expcnt 0x0604; GISEL12-NEXT: s_wait_samplecnt 0x0605; GISEL12-NEXT: s_wait_bvhcnt 0x0606; GISEL12-NEXT: s_wait_kmcnt 0x0607; GISEL12-NEXT: s_or_saveexec_b32 s8, -1608; GISEL12-NEXT: s_mov_b32 s6, s3609; GISEL12-NEXT: s_mov_b32 s7, s4610; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)611; GISEL12-NEXT: s_and_saveexec_b32 s3, s8612; GISEL12-NEXT: s_cbranch_execz .LBB4_2613; GISEL12-NEXT: ; %bb.1: ; %shader614; GISEL12-NEXT: s_or_saveexec_b32 s4, -1615; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)616; GISEL12-NEXT: v_cndmask_b32_e64 v13, 0x47, v12, s4617; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)618; GISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v13619; GISEL12-NEXT: s_wait_alu depctr_va_sdst(0)620; GISEL12-NEXT: v_mov_b32_e32 v13, s8621; GISEL12-NEXT: s_mov_b32 exec_lo, s4622; GISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)623; GISEL12-NEXT: v_dual_mov_b32 v11, v13 :: v_dual_add_nc_u32 v10, 42, v12624; GISEL12-NEXT: ;;#ASMSTART625; GISEL12-NEXT: ; use v0-7626; GISEL12-NEXT: ;;#ASMEND627; GISEL12-NEXT: .LBB4_2: ; %tail628; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)629; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3630; GISEL12-NEXT: s_mov_b32 exec_lo, s5631; GISEL12-NEXT: s_setpc_b64 s[6:7]632;633; DAGISEL12-LABEL: use_v0_7:634; DAGISEL12: ; %bb.0: ; %entry635; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x0636; DAGISEL12-NEXT: s_wait_expcnt 0x0637; DAGISEL12-NEXT: s_wait_samplecnt 0x0638; DAGISEL12-NEXT: s_wait_bvhcnt 0x0639; DAGISEL12-NEXT: s_wait_kmcnt 0x0640; DAGISEL12-NEXT: s_or_saveexec_b32 s8, -1641; DAGISEL12-NEXT: s_mov_b32 s7, s4642; DAGISEL12-NEXT: s_mov_b32 s6, s3643; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)644; DAGISEL12-NEXT: s_and_saveexec_b32 s3, s8645; DAGISEL12-NEXT: s_cbranch_execz .LBB4_2646; DAGISEL12-NEXT: ; %bb.1: ; %shader647; DAGISEL12-NEXT: s_or_saveexec_b32 s4, -1648; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)649; DAGISEL12-NEXT: v_cndmask_b32_e64 v13, 0x47, v12, s4650; DAGISEL12-NEXT: s_delay_alu instid0(VALU_DEP_1)651; DAGISEL12-NEXT: v_cmp_ne_u32_e64 s8, 0, v13652; DAGISEL12-NEXT: s_mov_b32 exec_lo, s4653; DAGISEL12-NEXT: v_dual_mov_b32 v11, s8 :: v_dual_add_nc_u32 v10, 42, v12654; DAGISEL12-NEXT: ;;#ASMSTART655; DAGISEL12-NEXT: ; use v0-7656; DAGISEL12-NEXT: ;;#ASMEND657; DAGISEL12-NEXT: .LBB4_2: ; %tail658; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)659; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s3660; DAGISEL12-NEXT: s_mov_b32 exec_lo, s5661; DAGISEL12-NEXT: s_setpc_b64 s[6:7]662;663; GISEL10-LABEL: use_v0_7:664; GISEL10: ; %bb.0: ; %entry665; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)666; GISEL10-NEXT: s_or_saveexec_b32 s8, -1667; GISEL10-NEXT: s_mov_b32 s6, s3668; GISEL10-NEXT: s_mov_b32 s7, s4669; GISEL10-NEXT: s_and_saveexec_b32 s3, s8670; GISEL10-NEXT: s_cbranch_execz .LBB4_2671; GISEL10-NEXT: ; %bb.1: ; %shader672; GISEL10-NEXT: s_or_saveexec_b32 s4, -1673; GISEL10-NEXT: v_cndmask_b32_e64 v13, 0x47, v12, s4674; GISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v13675; GISEL10-NEXT: v_mov_b32_e32 v13, s8676; GISEL10-NEXT: s_mov_b32 exec_lo, s4677; GISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v12678; GISEL10-NEXT: v_mov_b32_e32 v11, v13679; GISEL10-NEXT: ;;#ASMSTART680; GISEL10-NEXT: ; use v0-7681; GISEL10-NEXT: ;;#ASMEND682; GISEL10-NEXT: .LBB4_2: ; %tail683; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3684; GISEL10-NEXT: s_mov_b32 exec_lo, s5685; GISEL10-NEXT: s_setpc_b64 s[6:7]686;687; DAGISEL10-LABEL: use_v0_7:688; DAGISEL10: ; %bb.0: ; %entry689; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)690; DAGISEL10-NEXT: s_or_saveexec_b32 s8, -1691; DAGISEL10-NEXT: s_mov_b32 s7, s4692; DAGISEL10-NEXT: s_mov_b32 s6, s3693; DAGISEL10-NEXT: s_and_saveexec_b32 s3, s8694; DAGISEL10-NEXT: s_cbranch_execz .LBB4_2695; DAGISEL10-NEXT: ; %bb.1: ; %shader696; DAGISEL10-NEXT: s_or_saveexec_b32 s4, -1697; DAGISEL10-NEXT: v_cndmask_b32_e64 v13, 0x47, v12, s4698; DAGISEL10-NEXT: v_cmp_ne_u32_e64 s8, 0, v13699; DAGISEL10-NEXT: s_mov_b32 exec_lo, s4700; DAGISEL10-NEXT: v_add_nc_u32_e32 v10, 42, v12701; DAGISEL10-NEXT: v_mov_b32_e32 v11, s8702; DAGISEL10-NEXT: ;;#ASMSTART703; DAGISEL10-NEXT: ; use v0-7704; DAGISEL10-NEXT: ;;#ASMEND705; DAGISEL10-NEXT: .LBB4_2: ; %tail706; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s3707; DAGISEL10-NEXT: s_mov_b32 exec_lo, s5708; DAGISEL10-NEXT: s_setpc_b64 s[6:7]709entry:710 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()711 br i1 %entry_exec, label %shader, label %tail712 713shader:714 call void asm sideeffect "; use v0-7", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}"()715 716 %nonwwm = add i32 %x, 42717 %vgpr.1 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr, i32 %nonwwm, 2718 719 %full.vgpr = call i32 @llvm.amdgcn.set.inactive.i32(i32 %x, i32 71)720 %non.zero = icmp ne i32 %full.vgpr, 0721 %ballot = call i32 @llvm.amdgcn.ballot.i32(i1 %non.zero)722 %wwm = call i32 @llvm.amdgcn.strict.wwm.i32(i32 %ballot)723 %vgpr.2 = insertvalue { i32, ptr addrspace(5), i32, i32} %vgpr.1, i32 %wwm, 3724 725 br label %tail726 727tail:728 %vgpr.args = phi { i32, ptr addrspace(5), i32, i32} [%vgpr, %entry], [%vgpr.2, %shader]729 call void(ptr, i32, <3 x i32>, { i32, ptr addrspace(5), i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, { i32, ptr addrspace(5), i32, i32 } %vgpr.args, i32 0)730 unreachable731}732 733 734; Check that the inactive lanes of v8:15 are correctly preserved even across a735; WWM call that reads and writes them.736; FIXME: The GlobalISel path hits a pre-existing issue, so the inactive lanes do get overwritten.737define amdgpu_cs_chain void @wwm_write_to_arg_reg(<3 x i32> inreg %sgpr, ptr inreg %callee, i32 inreg %exec, <16 x i32> %vgpr, i32 %x, i32 %y) {738; GISEL12-LABEL: wwm_write_to_arg_reg:739; GISEL12: ; %bb.0: ; %entry740; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x0741; GISEL12-NEXT: s_wait_expcnt 0x0742; GISEL12-NEXT: s_wait_samplecnt 0x0743; GISEL12-NEXT: s_wait_bvhcnt 0x0744; GISEL12-NEXT: s_wait_kmcnt 0x0745; GISEL12-NEXT: s_mov_b32 s32, 0746; GISEL12-NEXT: s_or_saveexec_b32 s9, -1747; GISEL12-NEXT: s_or_saveexec_b32 s12, -1748; GISEL12-NEXT: s_mov_b32 s6, s0749; GISEL12-NEXT: s_mov_b32 s7, s1750; GISEL12-NEXT: s_mov_b32 s8, s2751; GISEL12-NEXT: s_mov_b32 s10, s3752; GISEL12-NEXT: s_mov_b32 s11, s4753; GISEL12-NEXT: v_dual_mov_b32 v24, v8 :: v_dual_mov_b32 v25, v9754; GISEL12-NEXT: v_dual_mov_b32 v26, v10 :: v_dual_mov_b32 v27, v11755; GISEL12-NEXT: v_dual_mov_b32 v28, v12 :: v_dual_mov_b32 v29, v13756; GISEL12-NEXT: v_dual_mov_b32 v30, v14 :: v_dual_mov_b32 v31, v15757; GISEL12-NEXT: v_dual_mov_b32 v32, v16 :: v_dual_mov_b32 v33, v17758; GISEL12-NEXT: v_dual_mov_b32 v34, v18 :: v_dual_mov_b32 v35, v19759; GISEL12-NEXT: v_dual_mov_b32 v36, v20 :: v_dual_mov_b32 v37, v21760; GISEL12-NEXT: v_dual_mov_b32 v38, v22 :: v_dual_mov_b32 v39, v23761; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)762; GISEL12-NEXT: s_mov_b32 exec_lo, s12763; GISEL12-NEXT: s_and_saveexec_b32 s4, s9764; GISEL12-NEXT: s_cbranch_execz .LBB5_2765; GISEL12-NEXT: ; %bb.1: ; %shader766; GISEL12-NEXT: s_or_saveexec_b32 s9, -1767; GISEL12-NEXT: s_getpc_b64 s[0:1]768; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)769; GISEL12-NEXT: s_sext_i32_i16 s1, s1770; GISEL12-NEXT: s_add_co_u32 s0, s0, write_v0_v15@gotpcrel32@lo+12771; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)772; GISEL12-NEXT: s_add_co_ci_u32 s1, s1, write_v0_v15@gotpcrel32@hi+24773; GISEL12-NEXT: v_dual_mov_b32 v0, v24 :: v_dual_mov_b32 v1, v25774; GISEL12-NEXT: s_load_b64 s[0:1], s[0:1], 0x0775; GISEL12-NEXT: v_dual_mov_b32 v2, v26 :: v_dual_mov_b32 v3, v27776; GISEL12-NEXT: v_dual_mov_b32 v4, v28 :: v_dual_mov_b32 v5, v29777; GISEL12-NEXT: v_dual_mov_b32 v6, v30 :: v_dual_mov_b32 v7, v31778; GISEL12-NEXT: v_dual_mov_b32 v8, v32 :: v_dual_mov_b32 v9, v33779; GISEL12-NEXT: v_dual_mov_b32 v10, v34 :: v_dual_mov_b32 v11, v35780; GISEL12-NEXT: v_dual_mov_b32 v12, v36 :: v_dual_mov_b32 v13, v37781; GISEL12-NEXT: v_dual_mov_b32 v14, v38 :: v_dual_mov_b32 v15, v39782; GISEL12-NEXT: s_wait_kmcnt 0x0783; GISEL12-NEXT: s_swappc_b64 s[30:31], s[0:1]784; GISEL12-NEXT: v_dual_mov_b32 v40, v0 :: v_dual_mov_b32 v41, v1785; GISEL12-NEXT: v_dual_mov_b32 v42, v2 :: v_dual_mov_b32 v43, v3786; GISEL12-NEXT: v_dual_mov_b32 v44, v4 :: v_dual_mov_b32 v45, v5787; GISEL12-NEXT: v_dual_mov_b32 v46, v6 :: v_dual_mov_b32 v47, v7788; GISEL12-NEXT: v_dual_mov_b32 v48, v8 :: v_dual_mov_b32 v49, v9789; GISEL12-NEXT: v_dual_mov_b32 v50, v10 :: v_dual_mov_b32 v51, v11790; GISEL12-NEXT: v_dual_mov_b32 v52, v12 :: v_dual_mov_b32 v53, v13791; GISEL12-NEXT: v_dual_mov_b32 v54, v14 :: v_dual_mov_b32 v55, v15792; GISEL12-NEXT: s_mov_b32 exec_lo, s9793; GISEL12-NEXT: v_dual_mov_b32 v24, v40 :: v_dual_mov_b32 v25, v41794; GISEL12-NEXT: v_dual_mov_b32 v26, v42 :: v_dual_mov_b32 v27, v43795; GISEL12-NEXT: v_dual_mov_b32 v28, v44 :: v_dual_mov_b32 v29, v45796; GISEL12-NEXT: v_dual_mov_b32 v30, v46 :: v_dual_mov_b32 v31, v47797; GISEL12-NEXT: v_dual_mov_b32 v32, v48 :: v_dual_mov_b32 v33, v49798; GISEL12-NEXT: v_dual_mov_b32 v34, v50 :: v_dual_mov_b32 v35, v51799; GISEL12-NEXT: v_dual_mov_b32 v36, v52 :: v_dual_mov_b32 v37, v53800; GISEL12-NEXT: v_dual_mov_b32 v38, v54 :: v_dual_mov_b32 v39, v55801; GISEL12-NEXT: .LBB5_2: ; %tail802; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)803; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s4804; GISEL12-NEXT: v_dual_mov_b32 v8, v24 :: v_dual_mov_b32 v9, v25805; GISEL12-NEXT: v_dual_mov_b32 v10, v26 :: v_dual_mov_b32 v11, v27806; GISEL12-NEXT: v_dual_mov_b32 v12, v28 :: v_dual_mov_b32 v13, v29807; GISEL12-NEXT: v_dual_mov_b32 v14, v30 :: v_dual_mov_b32 v15, v31808; GISEL12-NEXT: v_dual_mov_b32 v16, v32 :: v_dual_mov_b32 v17, v33809; GISEL12-NEXT: v_dual_mov_b32 v18, v34 :: v_dual_mov_b32 v19, v35810; GISEL12-NEXT: v_dual_mov_b32 v20, v36 :: v_dual_mov_b32 v21, v37811; GISEL12-NEXT: v_dual_mov_b32 v22, v38 :: v_dual_mov_b32 v23, v39812; GISEL12-NEXT: s_mov_b32 s0, s6813; GISEL12-NEXT: s_mov_b32 s1, s7814; GISEL12-NEXT: s_mov_b32 s2, s8815; GISEL12-NEXT: s_mov_b32 exec_lo, s5816; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)817; GISEL12-NEXT: s_setpc_b64 s[10:11]818;819; DAGISEL12-LABEL: wwm_write_to_arg_reg:820; DAGISEL12: ; %bb.0: ; %entry821; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x0822; DAGISEL12-NEXT: s_wait_expcnt 0x0823; DAGISEL12-NEXT: s_wait_samplecnt 0x0824; DAGISEL12-NEXT: s_wait_bvhcnt 0x0825; DAGISEL12-NEXT: s_wait_kmcnt 0x0826; DAGISEL12-NEXT: s_mov_b32 s32, 0827; DAGISEL12-NEXT: s_or_saveexec_b32 s11, -1828; DAGISEL12-NEXT: s_or_saveexec_b32 s6, -1829; DAGISEL12-NEXT: v_dual_mov_b32 v39, v23 :: v_dual_mov_b32 v38, v22830; DAGISEL12-NEXT: v_dual_mov_b32 v37, v21 :: v_dual_mov_b32 v36, v20831; DAGISEL12-NEXT: v_dual_mov_b32 v35, v19 :: v_dual_mov_b32 v34, v18832; DAGISEL12-NEXT: v_dual_mov_b32 v33, v17 :: v_dual_mov_b32 v32, v16833; DAGISEL12-NEXT: v_dual_mov_b32 v31, v15 :: v_dual_mov_b32 v30, v14834; DAGISEL12-NEXT: v_dual_mov_b32 v29, v13 :: v_dual_mov_b32 v28, v12835; DAGISEL12-NEXT: v_dual_mov_b32 v27, v11 :: v_dual_mov_b32 v26, v10836; DAGISEL12-NEXT: v_dual_mov_b32 v25, v9 :: v_dual_mov_b32 v24, v8837; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)838; DAGISEL12-NEXT: s_mov_b32 exec_lo, s6839; DAGISEL12-NEXT: s_mov_b32 s9, s4840; DAGISEL12-NEXT: s_mov_b32 s8, s3841; DAGISEL12-NEXT: s_mov_b32 s4, s2842; DAGISEL12-NEXT: s_mov_b32 s6, s1843; DAGISEL12-NEXT: s_mov_b32 s7, s0844; DAGISEL12-NEXT: s_and_saveexec_b32 s10, s11845; DAGISEL12-NEXT: s_cbranch_execz .LBB5_2846; DAGISEL12-NEXT: ; %bb.1: ; %shader847; DAGISEL12-NEXT: s_or_saveexec_b32 s11, -1848; DAGISEL12-NEXT: s_getpc_b64 s[0:1]849; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)850; DAGISEL12-NEXT: s_sext_i32_i16 s1, s1851; DAGISEL12-NEXT: s_add_co_u32 s0, s0, write_v0_v15@gotpcrel32@lo+12852; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)853; DAGISEL12-NEXT: s_add_co_ci_u32 s1, s1, write_v0_v15@gotpcrel32@hi+24854; DAGISEL12-NEXT: v_dual_mov_b32 v0, v24 :: v_dual_mov_b32 v1, v25855; DAGISEL12-NEXT: s_load_b64 s[0:1], s[0:1], 0x0856; DAGISEL12-NEXT: v_dual_mov_b32 v2, v26 :: v_dual_mov_b32 v3, v27857; DAGISEL12-NEXT: v_dual_mov_b32 v4, v28 :: v_dual_mov_b32 v5, v29858; DAGISEL12-NEXT: v_dual_mov_b32 v6, v30 :: v_dual_mov_b32 v7, v31859; DAGISEL12-NEXT: v_dual_mov_b32 v8, v32 :: v_dual_mov_b32 v9, v33860; DAGISEL12-NEXT: v_dual_mov_b32 v10, v34 :: v_dual_mov_b32 v11, v35861; DAGISEL12-NEXT: v_dual_mov_b32 v12, v36 :: v_dual_mov_b32 v13, v37862; DAGISEL12-NEXT: v_dual_mov_b32 v14, v38 :: v_dual_mov_b32 v15, v39863; DAGISEL12-NEXT: s_wait_kmcnt 0x0864; DAGISEL12-NEXT: s_swappc_b64 s[30:31], s[0:1]865; DAGISEL12-NEXT: v_dual_mov_b32 v40, v0 :: v_dual_mov_b32 v41, v1866; DAGISEL12-NEXT: v_dual_mov_b32 v42, v2 :: v_dual_mov_b32 v43, v3867; DAGISEL12-NEXT: v_dual_mov_b32 v44, v4 :: v_dual_mov_b32 v45, v5868; DAGISEL12-NEXT: v_dual_mov_b32 v46, v6 :: v_dual_mov_b32 v47, v7869; DAGISEL12-NEXT: v_dual_mov_b32 v48, v8 :: v_dual_mov_b32 v49, v9870; DAGISEL12-NEXT: v_dual_mov_b32 v50, v10 :: v_dual_mov_b32 v51, v11871; DAGISEL12-NEXT: v_dual_mov_b32 v52, v12 :: v_dual_mov_b32 v53, v13872; DAGISEL12-NEXT: v_dual_mov_b32 v54, v14 :: v_dual_mov_b32 v55, v15873; DAGISEL12-NEXT: s_mov_b32 exec_lo, s11874; DAGISEL12-NEXT: v_dual_mov_b32 v24, v40 :: v_dual_mov_b32 v25, v41875; DAGISEL12-NEXT: v_dual_mov_b32 v26, v42 :: v_dual_mov_b32 v27, v43876; DAGISEL12-NEXT: v_dual_mov_b32 v28, v44 :: v_dual_mov_b32 v29, v45877; DAGISEL12-NEXT: v_dual_mov_b32 v30, v46 :: v_dual_mov_b32 v31, v47878; DAGISEL12-NEXT: v_dual_mov_b32 v32, v48 :: v_dual_mov_b32 v33, v49879; DAGISEL12-NEXT: v_dual_mov_b32 v34, v50 :: v_dual_mov_b32 v35, v51880; DAGISEL12-NEXT: v_dual_mov_b32 v36, v52 :: v_dual_mov_b32 v37, v53881; DAGISEL12-NEXT: v_dual_mov_b32 v38, v54 :: v_dual_mov_b32 v39, v55882; DAGISEL12-NEXT: .LBB5_2: ; %tail883; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)884; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s10885; DAGISEL12-NEXT: v_dual_mov_b32 v8, v24 :: v_dual_mov_b32 v9, v25886; DAGISEL12-NEXT: v_dual_mov_b32 v10, v26 :: v_dual_mov_b32 v11, v27887; DAGISEL12-NEXT: v_dual_mov_b32 v12, v28 :: v_dual_mov_b32 v13, v29888; DAGISEL12-NEXT: v_dual_mov_b32 v14, v30 :: v_dual_mov_b32 v15, v31889; DAGISEL12-NEXT: v_dual_mov_b32 v16, v32 :: v_dual_mov_b32 v17, v33890; DAGISEL12-NEXT: v_dual_mov_b32 v18, v34 :: v_dual_mov_b32 v19, v35891; DAGISEL12-NEXT: v_dual_mov_b32 v20, v36 :: v_dual_mov_b32 v21, v37892; DAGISEL12-NEXT: v_dual_mov_b32 v22, v38 :: v_dual_mov_b32 v23, v39893; DAGISEL12-NEXT: s_mov_b32 s0, s7894; DAGISEL12-NEXT: s_mov_b32 s1, s6895; DAGISEL12-NEXT: s_mov_b32 s2, s4896; DAGISEL12-NEXT: s_mov_b32 exec_lo, s5897; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)898; DAGISEL12-NEXT: s_setpc_b64 s[8:9]899;900; GISEL10-LABEL: wwm_write_to_arg_reg:901; GISEL10: ; %bb.0: ; %entry902; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)903; GISEL10-NEXT: s_mov_b32 s32, 0904; GISEL10-NEXT: s_or_saveexec_b32 s9, -1905; GISEL10-NEXT: s_or_saveexec_b32 s12, -1906; GISEL10-NEXT: s_mov_b32 s6, s0907; GISEL10-NEXT: s_mov_b32 s7, s1908; GISEL10-NEXT: s_mov_b32 s8, s2909; GISEL10-NEXT: s_mov_b32 s10, s3910; GISEL10-NEXT: s_mov_b32 s11, s4911; GISEL10-NEXT: v_mov_b32_e32 v24, v8912; GISEL10-NEXT: v_mov_b32_e32 v25, v9913; GISEL10-NEXT: v_mov_b32_e32 v26, v10914; GISEL10-NEXT: v_mov_b32_e32 v27, v11915; GISEL10-NEXT: v_mov_b32_e32 v28, v12916; GISEL10-NEXT: v_mov_b32_e32 v29, v13917; GISEL10-NEXT: v_mov_b32_e32 v30, v14918; GISEL10-NEXT: v_mov_b32_e32 v31, v15919; GISEL10-NEXT: v_mov_b32_e32 v32, v16920; GISEL10-NEXT: v_mov_b32_e32 v33, v17921; GISEL10-NEXT: v_mov_b32_e32 v34, v18922; GISEL10-NEXT: v_mov_b32_e32 v35, v19923; GISEL10-NEXT: v_mov_b32_e32 v36, v20924; GISEL10-NEXT: v_mov_b32_e32 v37, v21925; GISEL10-NEXT: v_mov_b32_e32 v38, v22926; GISEL10-NEXT: v_mov_b32_e32 v39, v23927; GISEL10-NEXT: s_mov_b32 exec_lo, s12928; GISEL10-NEXT: s_and_saveexec_b32 s4, s9929; GISEL10-NEXT: s_cbranch_execz .LBB5_2930; GISEL10-NEXT: ; %bb.1: ; %shader931; GISEL10-NEXT: s_or_saveexec_b32 s9, -1932; GISEL10-NEXT: s_getpc_b64 s[0:1]933; GISEL10-NEXT: s_add_u32 s0, s0, write_v0_v15@gotpcrel32@lo+4934; GISEL10-NEXT: s_addc_u32 s1, s1, write_v0_v15@gotpcrel32@hi+12935; GISEL10-NEXT: v_mov_b32_e32 v0, v24936; GISEL10-NEXT: s_load_dwordx2 s[12:13], s[0:1], 0x0937; GISEL10-NEXT: v_mov_b32_e32 v1, v25938; GISEL10-NEXT: v_mov_b32_e32 v2, v26939; GISEL10-NEXT: v_mov_b32_e32 v3, v27940; GISEL10-NEXT: v_mov_b32_e32 v4, v28941; GISEL10-NEXT: v_mov_b32_e32 v5, v29942; GISEL10-NEXT: v_mov_b32_e32 v6, v30943; GISEL10-NEXT: v_mov_b32_e32 v7, v31944; GISEL10-NEXT: v_mov_b32_e32 v8, v32945; GISEL10-NEXT: v_mov_b32_e32 v9, v33946; GISEL10-NEXT: v_mov_b32_e32 v10, v34947; GISEL10-NEXT: v_mov_b32_e32 v11, v35948; GISEL10-NEXT: v_mov_b32_e32 v12, v36949; GISEL10-NEXT: v_mov_b32_e32 v13, v37950; GISEL10-NEXT: v_mov_b32_e32 v14, v38951; GISEL10-NEXT: v_mov_b32_e32 v15, v39952; GISEL10-NEXT: s_mov_b64 s[0:1], s[48:49]953; GISEL10-NEXT: s_mov_b64 s[2:3], s[50:51]954; GISEL10-NEXT: s_waitcnt lgkmcnt(0)955; GISEL10-NEXT: s_swappc_b64 s[30:31], s[12:13]956; GISEL10-NEXT: v_mov_b32_e32 v40, v0957; GISEL10-NEXT: v_mov_b32_e32 v41, v1958; GISEL10-NEXT: v_mov_b32_e32 v42, v2959; GISEL10-NEXT: v_mov_b32_e32 v43, v3960; GISEL10-NEXT: v_mov_b32_e32 v44, v4961; GISEL10-NEXT: v_mov_b32_e32 v45, v5962; GISEL10-NEXT: v_mov_b32_e32 v46, v6963; GISEL10-NEXT: v_mov_b32_e32 v47, v7964; GISEL10-NEXT: v_mov_b32_e32 v48, v8965; GISEL10-NEXT: v_mov_b32_e32 v49, v9966; GISEL10-NEXT: v_mov_b32_e32 v50, v10967; GISEL10-NEXT: v_mov_b32_e32 v51, v11968; GISEL10-NEXT: v_mov_b32_e32 v52, v12969; GISEL10-NEXT: v_mov_b32_e32 v53, v13970; GISEL10-NEXT: v_mov_b32_e32 v54, v14971; GISEL10-NEXT: v_mov_b32_e32 v55, v15972; GISEL10-NEXT: s_mov_b32 exec_lo, s9973; GISEL10-NEXT: v_mov_b32_e32 v24, v40974; GISEL10-NEXT: v_mov_b32_e32 v25, v41975; GISEL10-NEXT: v_mov_b32_e32 v26, v42976; GISEL10-NEXT: v_mov_b32_e32 v27, v43977; GISEL10-NEXT: v_mov_b32_e32 v28, v44978; GISEL10-NEXT: v_mov_b32_e32 v29, v45979; GISEL10-NEXT: v_mov_b32_e32 v30, v46980; GISEL10-NEXT: v_mov_b32_e32 v31, v47981; GISEL10-NEXT: v_mov_b32_e32 v32, v48982; GISEL10-NEXT: v_mov_b32_e32 v33, v49983; GISEL10-NEXT: v_mov_b32_e32 v34, v50984; GISEL10-NEXT: v_mov_b32_e32 v35, v51985; GISEL10-NEXT: v_mov_b32_e32 v36, v52986; GISEL10-NEXT: v_mov_b32_e32 v37, v53987; GISEL10-NEXT: v_mov_b32_e32 v38, v54988; GISEL10-NEXT: v_mov_b32_e32 v39, v55989; GISEL10-NEXT: .LBB5_2: ; %tail990; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s4991; GISEL10-NEXT: v_mov_b32_e32 v8, v24992; GISEL10-NEXT: v_mov_b32_e32 v9, v25993; GISEL10-NEXT: v_mov_b32_e32 v10, v26994; GISEL10-NEXT: v_mov_b32_e32 v11, v27995; GISEL10-NEXT: v_mov_b32_e32 v12, v28996; GISEL10-NEXT: v_mov_b32_e32 v13, v29997; GISEL10-NEXT: v_mov_b32_e32 v14, v30998; GISEL10-NEXT: v_mov_b32_e32 v15, v31999; GISEL10-NEXT: v_mov_b32_e32 v16, v321000; GISEL10-NEXT: v_mov_b32_e32 v17, v331001; GISEL10-NEXT: v_mov_b32_e32 v18, v341002; GISEL10-NEXT: v_mov_b32_e32 v19, v351003; GISEL10-NEXT: v_mov_b32_e32 v20, v361004; GISEL10-NEXT: v_mov_b32_e32 v21, v371005; GISEL10-NEXT: v_mov_b32_e32 v22, v381006; GISEL10-NEXT: v_mov_b32_e32 v23, v391007; GISEL10-NEXT: s_mov_b32 s0, s61008; GISEL10-NEXT: s_mov_b32 s1, s71009; GISEL10-NEXT: s_mov_b32 s2, s81010; GISEL10-NEXT: s_mov_b32 exec_lo, s51011; GISEL10-NEXT: s_setpc_b64 s[10:11]1012;1013; DAGISEL10-LABEL: wwm_write_to_arg_reg:1014; DAGISEL10: ; %bb.0: ; %entry1015; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1016; DAGISEL10-NEXT: s_mov_b32 s32, 01017; DAGISEL10-NEXT: s_or_saveexec_b32 s11, -11018; DAGISEL10-NEXT: s_or_saveexec_b32 s6, -11019; DAGISEL10-NEXT: v_mov_b32_e32 v39, v231020; DAGISEL10-NEXT: v_mov_b32_e32 v38, v221021; DAGISEL10-NEXT: v_mov_b32_e32 v37, v211022; DAGISEL10-NEXT: v_mov_b32_e32 v36, v201023; DAGISEL10-NEXT: v_mov_b32_e32 v35, v191024; DAGISEL10-NEXT: v_mov_b32_e32 v34, v181025; DAGISEL10-NEXT: v_mov_b32_e32 v33, v171026; DAGISEL10-NEXT: v_mov_b32_e32 v32, v161027; DAGISEL10-NEXT: v_mov_b32_e32 v31, v151028; DAGISEL10-NEXT: v_mov_b32_e32 v30, v141029; DAGISEL10-NEXT: v_mov_b32_e32 v29, v131030; DAGISEL10-NEXT: v_mov_b32_e32 v28, v121031; DAGISEL10-NEXT: v_mov_b32_e32 v27, v111032; DAGISEL10-NEXT: v_mov_b32_e32 v26, v101033; DAGISEL10-NEXT: v_mov_b32_e32 v25, v91034; DAGISEL10-NEXT: v_mov_b32_e32 v24, v81035; DAGISEL10-NEXT: s_mov_b32 exec_lo, s61036; DAGISEL10-NEXT: s_mov_b32 s9, s41037; DAGISEL10-NEXT: s_mov_b32 s8, s31038; DAGISEL10-NEXT: s_mov_b32 s4, s21039; DAGISEL10-NEXT: s_mov_b32 s6, s11040; DAGISEL10-NEXT: s_mov_b32 s7, s01041; DAGISEL10-NEXT: s_and_saveexec_b32 s10, s111042; DAGISEL10-NEXT: s_cbranch_execz .LBB5_21043; DAGISEL10-NEXT: ; %bb.1: ; %shader1044; DAGISEL10-NEXT: s_or_saveexec_b32 s11, -11045; DAGISEL10-NEXT: s_getpc_b64 s[0:1]1046; DAGISEL10-NEXT: s_add_u32 s0, s0, write_v0_v15@gotpcrel32@lo+41047; DAGISEL10-NEXT: s_addc_u32 s1, s1, write_v0_v15@gotpcrel32@hi+121048; DAGISEL10-NEXT: v_mov_b32_e32 v0, v241049; DAGISEL10-NEXT: s_load_dwordx2 s[12:13], s[0:1], 0x01050; DAGISEL10-NEXT: v_mov_b32_e32 v1, v251051; DAGISEL10-NEXT: v_mov_b32_e32 v2, v261052; DAGISEL10-NEXT: v_mov_b32_e32 v3, v271053; DAGISEL10-NEXT: v_mov_b32_e32 v4, v281054; DAGISEL10-NEXT: v_mov_b32_e32 v5, v291055; DAGISEL10-NEXT: v_mov_b32_e32 v6, v301056; DAGISEL10-NEXT: v_mov_b32_e32 v7, v311057; DAGISEL10-NEXT: v_mov_b32_e32 v8, v321058; DAGISEL10-NEXT: v_mov_b32_e32 v9, v331059; DAGISEL10-NEXT: v_mov_b32_e32 v10, v341060; DAGISEL10-NEXT: v_mov_b32_e32 v11, v351061; DAGISEL10-NEXT: v_mov_b32_e32 v12, v361062; DAGISEL10-NEXT: v_mov_b32_e32 v13, v371063; DAGISEL10-NEXT: v_mov_b32_e32 v14, v381064; DAGISEL10-NEXT: v_mov_b32_e32 v15, v391065; DAGISEL10-NEXT: s_mov_b64 s[0:1], s[48:49]1066; DAGISEL10-NEXT: s_mov_b64 s[2:3], s[50:51]1067; DAGISEL10-NEXT: s_waitcnt lgkmcnt(0)1068; DAGISEL10-NEXT: s_swappc_b64 s[30:31], s[12:13]1069; DAGISEL10-NEXT: v_mov_b32_e32 v40, v01070; DAGISEL10-NEXT: v_mov_b32_e32 v41, v11071; DAGISEL10-NEXT: v_mov_b32_e32 v42, v21072; DAGISEL10-NEXT: v_mov_b32_e32 v43, v31073; DAGISEL10-NEXT: v_mov_b32_e32 v44, v41074; DAGISEL10-NEXT: v_mov_b32_e32 v45, v51075; DAGISEL10-NEXT: v_mov_b32_e32 v46, v61076; DAGISEL10-NEXT: v_mov_b32_e32 v47, v71077; DAGISEL10-NEXT: v_mov_b32_e32 v48, v81078; DAGISEL10-NEXT: v_mov_b32_e32 v49, v91079; DAGISEL10-NEXT: v_mov_b32_e32 v50, v101080; DAGISEL10-NEXT: v_mov_b32_e32 v51, v111081; DAGISEL10-NEXT: v_mov_b32_e32 v52, v121082; DAGISEL10-NEXT: v_mov_b32_e32 v53, v131083; DAGISEL10-NEXT: v_mov_b32_e32 v54, v141084; DAGISEL10-NEXT: v_mov_b32_e32 v55, v151085; DAGISEL10-NEXT: s_mov_b32 exec_lo, s111086; DAGISEL10-NEXT: v_mov_b32_e32 v24, v401087; DAGISEL10-NEXT: v_mov_b32_e32 v25, v411088; DAGISEL10-NEXT: v_mov_b32_e32 v26, v421089; DAGISEL10-NEXT: v_mov_b32_e32 v27, v431090; DAGISEL10-NEXT: v_mov_b32_e32 v28, v441091; DAGISEL10-NEXT: v_mov_b32_e32 v29, v451092; DAGISEL10-NEXT: v_mov_b32_e32 v30, v461093; DAGISEL10-NEXT: v_mov_b32_e32 v31, v471094; DAGISEL10-NEXT: v_mov_b32_e32 v32, v481095; DAGISEL10-NEXT: v_mov_b32_e32 v33, v491096; DAGISEL10-NEXT: v_mov_b32_e32 v34, v501097; DAGISEL10-NEXT: v_mov_b32_e32 v35, v511098; DAGISEL10-NEXT: v_mov_b32_e32 v36, v521099; DAGISEL10-NEXT: v_mov_b32_e32 v37, v531100; DAGISEL10-NEXT: v_mov_b32_e32 v38, v541101; DAGISEL10-NEXT: v_mov_b32_e32 v39, v551102; DAGISEL10-NEXT: .LBB5_2: ; %tail1103; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s101104; DAGISEL10-NEXT: v_mov_b32_e32 v8, v241105; DAGISEL10-NEXT: v_mov_b32_e32 v9, v251106; DAGISEL10-NEXT: v_mov_b32_e32 v10, v261107; DAGISEL10-NEXT: v_mov_b32_e32 v11, v271108; DAGISEL10-NEXT: v_mov_b32_e32 v12, v281109; DAGISEL10-NEXT: v_mov_b32_e32 v13, v291110; DAGISEL10-NEXT: v_mov_b32_e32 v14, v301111; DAGISEL10-NEXT: v_mov_b32_e32 v15, v311112; DAGISEL10-NEXT: v_mov_b32_e32 v16, v321113; DAGISEL10-NEXT: v_mov_b32_e32 v17, v331114; DAGISEL10-NEXT: v_mov_b32_e32 v18, v341115; DAGISEL10-NEXT: v_mov_b32_e32 v19, v351116; DAGISEL10-NEXT: v_mov_b32_e32 v20, v361117; DAGISEL10-NEXT: v_mov_b32_e32 v21, v371118; DAGISEL10-NEXT: v_mov_b32_e32 v22, v381119; DAGISEL10-NEXT: v_mov_b32_e32 v23, v391120; DAGISEL10-NEXT: s_mov_b32 s0, s71121; DAGISEL10-NEXT: s_mov_b32 s1, s61122; DAGISEL10-NEXT: s_mov_b32 s2, s41123; DAGISEL10-NEXT: s_mov_b32 exec_lo, s51124; DAGISEL10-NEXT: s_setpc_b64 s[8:9]1125entry:1126 %entry_exec = call i1 @llvm.amdgcn.init.whole.wave()1127 br i1 %entry_exec, label %shader, label %tail1128 1129shader:1130 %v0.15 = call amdgpu_gfx <16 x i32> @write_v0_v15(<16 x i32> %vgpr)1131 %vgpr.wwm = call <16 x i32> @llvm.amdgcn.strict.wwm.v16i32(<16 x i32> %v0.15)1132 1133 br label %tail1134 1135tail:1136 %vgpr.args = phi <16 x i32> [%vgpr, %entry], [%vgpr.wwm, %shader]1137 call void(ptr, i32, <3 x i32>, <16 x i32>, i32, ...) @llvm.amdgcn.cs.chain(ptr %callee, i32 %exec, <3 x i32> inreg %sgpr, <16 x i32> %vgpr.args, i32 0)1138 unreachable1139}1140 1141; Since functions that contain amdgcn.init.whole.wave do not preserve the inactive1142; lanes of any VGPRs, the middle end will explicitly preserve them if needed by adding1143; dummy VGPR arguments. Since only the inactive lanes are important, we need to make1144; it clear to the backend that it's safe to allocate v9's active lanes inside1145; shader. This is achieved by using the llvm.amdgcn.dead intrinsic.1146define amdgpu_cs_chain void @with_inactive_vgprs(ptr inreg %callee, i32 inreg %exec, i32 inreg %sgpr, i32 %active.vgpr, i32 %inactive.vgpr) {1147; GISEL12-LABEL: with_inactive_vgprs:1148; GISEL12: ; %bb.0: ; %entry1149; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x01150; GISEL12-NEXT: s_wait_expcnt 0x01151; GISEL12-NEXT: s_wait_samplecnt 0x01152; GISEL12-NEXT: s_wait_bvhcnt 0x01153; GISEL12-NEXT: s_wait_kmcnt 0x01154; GISEL12-NEXT: s_or_saveexec_b32 s6, -11155; GISEL12-NEXT: s_mov_b32 s4, s01156; GISEL12-NEXT: s_mov_b32 s5, s11157; GISEL12-NEXT: s_mov_b32 s0, s31158; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)1159; GISEL12-NEXT: s_and_saveexec_b32 s1, s61160; GISEL12-NEXT: s_cbranch_execz .LBB6_21161; GISEL12-NEXT: ; %bb.1: ; %shader1162; GISEL12-NEXT: v_dual_mov_b32 v10, s5 :: v_dual_mov_b32 v9, s41163; GISEL12-NEXT: flat_load_b32 v11, v[9:10]1164; GISEL12-NEXT: ;;#ASMSTART1165; GISEL12-NEXT: ; use v0-71166; GISEL12-NEXT: ;;#ASMEND1167; GISEL12-NEXT: s_wait_loadcnt_dscnt 0x01168; GISEL12-NEXT: v_add_nc_u32_e32 v8, v8, v111169; GISEL12-NEXT: flat_store_b32 v[9:10], v111170; GISEL12-NEXT: ; implicit-def: $vgpr91171; GISEL12-NEXT: .LBB6_2: ; %tail.block1172; GISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)1173; GISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s11174; GISEL12-NEXT: s_mov_b32 exec_lo, s21175; GISEL12-NEXT: s_setpc_b64 s[4:5]1176;1177; DAGISEL12-LABEL: with_inactive_vgprs:1178; DAGISEL12: ; %bb.0: ; %entry1179; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x01180; DAGISEL12-NEXT: s_wait_expcnt 0x01181; DAGISEL12-NEXT: s_wait_samplecnt 0x01182; DAGISEL12-NEXT: s_wait_bvhcnt 0x01183; DAGISEL12-NEXT: s_wait_kmcnt 0x01184; DAGISEL12-NEXT: s_or_saveexec_b32 s6, -11185; DAGISEL12-NEXT: s_mov_b32 s5, s11186; DAGISEL12-NEXT: s_mov_b32 s4, s01187; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)1188; DAGISEL12-NEXT: s_and_saveexec_b32 s0, s61189; DAGISEL12-NEXT: s_cbranch_execz .LBB6_21190; DAGISEL12-NEXT: ; %bb.1: ; %shader1191; DAGISEL12-NEXT: v_dual_mov_b32 v10, s5 :: v_dual_mov_b32 v9, s41192; DAGISEL12-NEXT: flat_load_b32 v11, v[9:10]1193; DAGISEL12-NEXT: ;;#ASMSTART1194; DAGISEL12-NEXT: ; use v0-71195; DAGISEL12-NEXT: ;;#ASMEND1196; DAGISEL12-NEXT: s_wait_loadcnt_dscnt 0x01197; DAGISEL12-NEXT: v_add_nc_u32_e32 v8, v8, v111198; DAGISEL12-NEXT: flat_store_b32 v[9:10], v111199; DAGISEL12-NEXT: ; implicit-def: $vgpr91200; DAGISEL12-NEXT: .LBB6_2: ; %tail.block1201; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)1202; DAGISEL12-NEXT: s_or_b32 exec_lo, exec_lo, s01203; DAGISEL12-NEXT: s_mov_b32 s0, s31204; DAGISEL12-NEXT: s_mov_b32 exec_lo, s21205; DAGISEL12-NEXT: s_wait_alu depctr_sa_sdst(0)1206; DAGISEL12-NEXT: s_setpc_b64 s[4:5]1207;1208; GISEL10-LABEL: with_inactive_vgprs:1209; GISEL10: ; %bb.0: ; %entry1210; GISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1211; GISEL10-NEXT: s_or_saveexec_b32 s6, -11212; GISEL10-NEXT: s_mov_b32 s4, s01213; GISEL10-NEXT: s_mov_b32 s5, s11214; GISEL10-NEXT: s_mov_b32 s0, s31215; GISEL10-NEXT: s_and_saveexec_b32 s1, s61216; GISEL10-NEXT: s_cbranch_execz .LBB6_21217; GISEL10-NEXT: ; %bb.1: ; %shader1218; GISEL10-NEXT: v_mov_b32_e32 v10, s51219; GISEL10-NEXT: v_mov_b32_e32 v9, s41220; GISEL10-NEXT: flat_load_dword v11, v[9:10]1221; GISEL10-NEXT: ;;#ASMSTART1222; GISEL10-NEXT: ; use v0-71223; GISEL10-NEXT: ;;#ASMEND1224; GISEL10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1225; GISEL10-NEXT: v_add_nc_u32_e32 v8, v8, v111226; GISEL10-NEXT: flat_store_dword v[9:10], v111227; GISEL10-NEXT: ; implicit-def: $vgpr91228; GISEL10-NEXT: .LBB6_2: ; %tail.block1229; GISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s11230; GISEL10-NEXT: s_mov_b32 exec_lo, s21231; GISEL10-NEXT: s_setpc_b64 s[4:5]1232;1233; DAGISEL10-LABEL: with_inactive_vgprs:1234; DAGISEL10: ; %bb.0: ; %entry1235; DAGISEL10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1236; DAGISEL10-NEXT: s_or_saveexec_b32 s6, -11237; DAGISEL10-NEXT: s_mov_b32 s5, s11238; DAGISEL10-NEXT: s_mov_b32 s4, s01239; DAGISEL10-NEXT: s_and_saveexec_b32 s0, s61240; DAGISEL10-NEXT: s_cbranch_execz .LBB6_21241; DAGISEL10-NEXT: ; %bb.1: ; %shader1242; DAGISEL10-NEXT: v_mov_b32_e32 v10, s51243; DAGISEL10-NEXT: v_mov_b32_e32 v9, s41244; DAGISEL10-NEXT: flat_load_dword v11, v[9:10]1245; DAGISEL10-NEXT: ;;#ASMSTART1246; DAGISEL10-NEXT: ; use v0-71247; DAGISEL10-NEXT: ;;#ASMEND1248; DAGISEL10-NEXT: s_waitcnt vmcnt(0) lgkmcnt(0)1249; DAGISEL10-NEXT: v_add_nc_u32_e32 v8, v8, v111250; DAGISEL10-NEXT: flat_store_dword v[9:10], v111251; DAGISEL10-NEXT: ; implicit-def: $vgpr91252; DAGISEL10-NEXT: .LBB6_2: ; %tail.block1253; DAGISEL10-NEXT: s_or_b32 exec_lo, exec_lo, s01254; DAGISEL10-NEXT: s_mov_b32 s0, s31255; DAGISEL10-NEXT: s_mov_b32 exec_lo, s21256; DAGISEL10-NEXT: s_setpc_b64 s[4:5]1257entry:1258 %imp.def = call i32 @llvm.amdgcn.dead()1259 %initial.exec = call i1 @llvm.amdgcn.init.whole.wave()1260 br i1 %initial.exec, label %shader, label %tail.block1261 1262shader: ; preds = %entry1263 %use.another.vgpr = load i32, ptr %callee ; smth that won't be moved past the inline asm1264 call void asm sideeffect "; use v0-7", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7}"()1265 store i32 %use.another.vgpr, ptr %callee1266 %active.vgpr.new = add i32 %active.vgpr, %use.another.vgpr1267 br label %tail.block1268 1269tail.block: ; preds = %.exit27, %.exit49, %244, %243, %entry1270 %active.vgpr.arg = phi i32 [ %active.vgpr, %entry ], [ %active.vgpr.new, %shader ]1271 %inactive.vgpr.arg = phi i32 [ %inactive.vgpr, %entry ], [ %imp.def, %shader ]1272 %vgprs.0 = insertvalue { i32, i32 } poison, i32 %active.vgpr.arg, 01273 %vgprs = insertvalue { i32, i32 } %vgprs.0, i32 %inactive.vgpr.arg, 11274 call void (ptr, i32, i32, { i32, i32 }, i32, ...) @llvm.amdgcn.cs.chain.p0.i32.i32.sl_i32i32(ptr inreg %callee, i32 inreg %exec, i32 inreg %sgpr, { i32, i32} %vgprs, i32 0)1275 unreachable1276}1277 1278declare amdgpu_gfx <16 x i32> @write_v0_v15(<16 x i32>)1279