864 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -amdgpu-scalar-ir-passes=0 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -check-prefix=GCN %s3 4define float @select_undef_lhs(float %val, i1 %cond) {5; GCN-LABEL: select_undef_lhs:6; GCN: ; %bb.0:7; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)8; GCN-NEXT: s_setpc_b64 s[30:31]9 %sel = select i1 %cond, float poison, float %val10 ret float %sel11}12 13define float @select_undef_rhs(float %val, i1 %cond) {14; GCN-LABEL: select_undef_rhs:15; GCN: ; %bb.0:16; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)17; GCN-NEXT: s_setpc_b64 s[30:31]18 %sel = select i1 %cond, float %val, float poison19 ret float %sel20}21 22define void @select_undef_n1(ptr addrspace(1) %a, i32 %c) {23; GCN-LABEL: select_undef_n1:24; GCN: ; %bb.0:25; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; GCN-NEXT: v_mov_b32_e32 v2, 1.027; GCN-NEXT: global_store_dword v[0:1], v2, off28; GCN-NEXT: s_waitcnt vmcnt(0)29; GCN-NEXT: s_setpc_b64 s[30:31]30 %cc = icmp eq i32 %c, 031 %sel = select i1 %cc, float 1.000000e+00, float poison32 store float %sel, ptr addrspace(1) %a33 ret void34}35 36define void @select_undef_n2(ptr addrspace(1) %a, i32 %c) {37; GCN-LABEL: select_undef_n2:38; GCN: ; %bb.0:39; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)40; GCN-NEXT: v_mov_b32_e32 v2, 1.041; GCN-NEXT: global_store_dword v[0:1], v2, off42; GCN-NEXT: s_waitcnt vmcnt(0)43; GCN-NEXT: s_setpc_b64 s[30:31]44 %cc = icmp eq i32 %c, 045 %sel = select i1 %cc, float poison, float 1.000000e+0046 store float %sel, ptr addrspace(1) %a47 ret void48}49 50declare float @llvm.amdgcn.rcp.f32(float)51 52 53; Make sure the vector undef isn't lowered into 0s.54define amdgpu_kernel void @undef_v6f32(ptr addrspace(3) %ptr, i1 %cond) {55; GCN-LABEL: undef_v6f32:56; GCN: ; %bb.0: ; %entry57; GCN-NEXT: s_load_dword s0, s[8:9], 0x458; GCN-NEXT: ; implicit-def: $vgpr459; GCN-NEXT: s_waitcnt lgkmcnt(0)60; GCN-NEXT: s_bitcmp1_b32 s0, 061; GCN-NEXT: s_cselect_b64 s[0:1], -1, 062; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -163; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]64; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v065; GCN-NEXT: ; implicit-def: $vgpr066; GCN-NEXT: .LBB4_1: ; %loop67; GCN-NEXT: ; =>This Inner Loop Header: Depth=168; GCN-NEXT: ds_read_b128 v[6:9], v069; GCN-NEXT: ds_read_b64 v[10:11], v070; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]71; GCN-NEXT: s_waitcnt lgkmcnt(1)72; GCN-NEXT: v_add_f32_e32 v3, v9, v373; GCN-NEXT: s_waitcnt lgkmcnt(0)74; GCN-NEXT: v_add_f32_e32 v5, v11, v575; GCN-NEXT: v_add_f32_e32 v4, v10, v476; GCN-NEXT: v_add_f32_e32 v2, v8, v277; GCN-NEXT: v_add_f32_e32 v1, v7, v178; GCN-NEXT: v_add_f32_e32 v0, v6, v079; GCN-NEXT: s_cbranch_vccnz .LBB4_180; GCN-NEXT: ; %bb.2: ; %ret81; GCN-NEXT: ds_write_b64 v0, v[4:5]82; GCN-NEXT: ds_write_b128 v0, v[0:3]83; GCN-NEXT: s_endpgm84entry:85 br label %loop86 87loop:88 %phi = phi <6 x float> [ poison, %entry ], [ %add, %loop ]89 %load = load volatile <6 x float>, ptr addrspace(3) poison90 %add = fadd <6 x float> %load, %phi91 br i1 %cond, label %loop, label %ret92 93ret:94 store volatile <6 x float> %add, ptr addrspace(3) poison95 ret void96}97 98define amdgpu_kernel void @undef_v6i32(ptr addrspace(3) %ptr, i1 %cond) {99; GCN-LABEL: undef_v6i32:100; GCN: ; %bb.0: ; %entry101; GCN-NEXT: s_load_dword s0, s[8:9], 0x4102; GCN-NEXT: ; implicit-def: $vgpr4103; GCN-NEXT: s_waitcnt lgkmcnt(0)104; GCN-NEXT: s_bitcmp1_b32 s0, 0105; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0106; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1107; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]108; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0109; GCN-NEXT: ; implicit-def: $vgpr0110; GCN-NEXT: .LBB5_1: ; %loop111; GCN-NEXT: ; =>This Inner Loop Header: Depth=1112; GCN-NEXT: ds_read_b128 v[6:9], v0113; GCN-NEXT: ds_read_b64 v[10:11], v0114; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]115; GCN-NEXT: s_waitcnt lgkmcnt(1)116; GCN-NEXT: v_add_u32_e32 v3, v9, v3117; GCN-NEXT: s_waitcnt lgkmcnt(0)118; GCN-NEXT: v_add_u32_e32 v5, v11, v5119; GCN-NEXT: v_add_u32_e32 v4, v10, v4120; GCN-NEXT: v_add_u32_e32 v2, v8, v2121; GCN-NEXT: v_add_u32_e32 v1, v7, v1122; GCN-NEXT: v_add_u32_e32 v0, v6, v0123; GCN-NEXT: s_cbranch_vccnz .LBB5_1124; GCN-NEXT: ; %bb.2: ; %ret125; GCN-NEXT: ds_write_b64 v0, v[4:5]126; GCN-NEXT: ds_write_b128 v0, v[0:3]127; GCN-NEXT: s_endpgm128entry:129 br label %loop130 131loop:132 %phi = phi <6 x i32> [ poison, %entry ], [ %add, %loop ]133 %load = load volatile <6 x i32>, ptr addrspace(3) poison134 %add = add <6 x i32> %load, %phi135 br i1 %cond, label %loop, label %ret136 137ret:138 store volatile <6 x i32> %add, ptr addrspace(3) poison139 ret void140}141 142; Make sure the vector undef isn't lowered into 0s.143define amdgpu_kernel void @undef_v5f32(ptr addrspace(3) %ptr, i1 %cond) {144; GCN-LABEL: undef_v5f32:145; GCN: ; %bb.0: ; %entry146; GCN-NEXT: s_load_dword s0, s[8:9], 0x4147; GCN-NEXT: ; implicit-def: $vgpr4148; GCN-NEXT: s_waitcnt lgkmcnt(0)149; GCN-NEXT: s_bitcmp1_b32 s0, 0150; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0151; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1152; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]153; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0154; GCN-NEXT: ; implicit-def: $vgpr0155; GCN-NEXT: .LBB6_1: ; %loop156; GCN-NEXT: ; =>This Inner Loop Header: Depth=1157; GCN-NEXT: ds_read_b128 v[5:8], v0158; GCN-NEXT: ds_read_b32 v9, v0159; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]160; GCN-NEXT: s_waitcnt lgkmcnt(1)161; GCN-NEXT: v_add_f32_e32 v3, v8, v3162; GCN-NEXT: s_waitcnt lgkmcnt(0)163; GCN-NEXT: v_add_f32_e32 v4, v9, v4164; GCN-NEXT: v_add_f32_e32 v2, v7, v2165; GCN-NEXT: v_add_f32_e32 v1, v6, v1166; GCN-NEXT: v_add_f32_e32 v0, v5, v0167; GCN-NEXT: s_cbranch_vccnz .LBB6_1168; GCN-NEXT: ; %bb.2: ; %ret169; GCN-NEXT: ds_write_b32 v0, v4170; GCN-NEXT: ds_write_b128 v0, v[0:3]171; GCN-NEXT: s_endpgm172entry:173 br label %loop174 175loop:176 %phi = phi <5 x float> [ poison, %entry ], [ %add, %loop ]177 %load = load volatile <5 x float>, ptr addrspace(3) poison178 %add = fadd <5 x float> %load, %phi179 br i1 %cond, label %loop, label %ret180 181ret:182 store volatile <5 x float> %add, ptr addrspace(3) poison183 ret void184}185 186define amdgpu_kernel void @undef_v5i32(ptr addrspace(3) %ptr, i1 %cond) {187; GCN-LABEL: undef_v5i32:188; GCN: ; %bb.0: ; %entry189; GCN-NEXT: s_load_dword s0, s[8:9], 0x4190; GCN-NEXT: ; implicit-def: $vgpr4191; GCN-NEXT: s_waitcnt lgkmcnt(0)192; GCN-NEXT: s_bitcmp1_b32 s0, 0193; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0194; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1195; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]196; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0197; GCN-NEXT: ; implicit-def: $vgpr0198; GCN-NEXT: .LBB7_1: ; %loop199; GCN-NEXT: ; =>This Inner Loop Header: Depth=1200; GCN-NEXT: ds_read_b128 v[5:8], v0201; GCN-NEXT: ds_read_b32 v9, v0202; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]203; GCN-NEXT: s_waitcnt lgkmcnt(1)204; GCN-NEXT: v_add_u32_e32 v3, v8, v3205; GCN-NEXT: s_waitcnt lgkmcnt(0)206; GCN-NEXT: v_add_u32_e32 v4, v9, v4207; GCN-NEXT: v_add_u32_e32 v2, v7, v2208; GCN-NEXT: v_add_u32_e32 v1, v6, v1209; GCN-NEXT: v_add_u32_e32 v0, v5, v0210; GCN-NEXT: s_cbranch_vccnz .LBB7_1211; GCN-NEXT: ; %bb.2: ; %ret212; GCN-NEXT: ds_write_b32 v0, v4213; GCN-NEXT: ds_write_b128 v0, v[0:3]214; GCN-NEXT: s_endpgm215entry:216 br label %loop217 218loop:219 %phi = phi <5 x i32> [ poison, %entry ], [ %add, %loop ]220 %load = load volatile <5 x i32>, ptr addrspace(3) poison221 %add = add <5 x i32> %load, %phi222 br i1 %cond, label %loop, label %ret223 224ret:225 store volatile <5 x i32> %add, ptr addrspace(3) poison226 ret void227}228 229; Make sure the vector undef isn't lowered into 0s.230define amdgpu_kernel void @undef_v3f64(ptr addrspace(3) %ptr, i1 %cond) {231; GCN-LABEL: undef_v3f64:232; GCN: ; %bb.0: ; %entry233; GCN-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0234; GCN-NEXT: ; implicit-def: $vgpr4_vgpr5235; GCN-NEXT: s_waitcnt lgkmcnt(0)236; GCN-NEXT: s_bitcmp1_b32 s3, 0237; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0238; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1239; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]240; GCN-NEXT: v_mov_b32_e32 v6, s2241; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0242; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1243; GCN-NEXT: .LBB8_1: ; %loop244; GCN-NEXT: ; =>This Inner Loop Header: Depth=1245; GCN-NEXT: ds_read_b128 v[7:10], v6246; GCN-NEXT: ds_read_b64 v[11:12], v6 offset:16247; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]248; GCN-NEXT: s_waitcnt lgkmcnt(1)249; GCN-NEXT: v_add_f64 v[2:3], v[9:10], v[2:3]250; GCN-NEXT: s_waitcnt lgkmcnt(0)251; GCN-NEXT: v_add_f64 v[4:5], v[11:12], v[4:5]252; GCN-NEXT: v_add_f64 v[0:1], v[7:8], v[0:1]253; GCN-NEXT: s_cbranch_vccnz .LBB8_1254; GCN-NEXT: ; %bb.2: ; %ret255; GCN-NEXT: v_mov_b32_e32 v6, s2256; GCN-NEXT: ds_write_b64 v6, v[4:5] offset:16257; GCN-NEXT: ds_write_b128 v6, v[0:3]258; GCN-NEXT: s_endpgm259entry:260 br label %loop261 262loop:263 %phi = phi <3 x double> [ poison, %entry ], [ %add, %loop ]264 %load = load volatile <3 x double>, ptr addrspace(3) %ptr265 %add = fadd <3 x double> %load, %phi266 br i1 %cond, label %loop, label %ret267 268ret:269 store volatile <3 x double> %add, ptr addrspace(3) %ptr270 ret void271}272 273define amdgpu_kernel void @undef_v3i64(ptr addrspace(3) %ptr, i1 %cond) {274; GCN-LABEL: undef_v3i64:275; GCN: ; %bb.0: ; %entry276; GCN-NEXT: s_load_dwordx2 s[4:5], s[8:9], 0x0277; GCN-NEXT: ; implicit-def: $vgpr4_vgpr5278; GCN-NEXT: s_waitcnt lgkmcnt(0)279; GCN-NEXT: s_bitcmp1_b32 s5, 0280; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0281; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1282; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]283; GCN-NEXT: v_mov_b32_e32 v6, s4284; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0285; GCN-NEXT: ; implicit-def: $vgpr0_vgpr1286; GCN-NEXT: .LBB9_1: ; %loop287; GCN-NEXT: ; =>This Inner Loop Header: Depth=1288; GCN-NEXT: ds_read_b128 v[7:10], v6289; GCN-NEXT: ds_read_b64 v[11:12], v6 offset:16290; GCN-NEXT: s_waitcnt lgkmcnt(1)291; GCN-NEXT: v_add_co_u32_e64 v0, s[2:3], v7, v0292; GCN-NEXT: s_waitcnt lgkmcnt(0)293; GCN-NEXT: v_add_co_u32_e32 v4, vcc, v11, v4294; GCN-NEXT: v_addc_co_u32_e32 v5, vcc, v12, v5, vcc295; GCN-NEXT: v_add_co_u32_e32 v2, vcc, v9, v2296; GCN-NEXT: v_addc_co_u32_e32 v3, vcc, v10, v3, vcc297; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]298; GCN-NEXT: v_addc_co_u32_e64 v1, s[2:3], v8, v1, s[2:3]299; GCN-NEXT: s_cbranch_vccnz .LBB9_1300; GCN-NEXT: ; %bb.2: ; %ret301; GCN-NEXT: v_mov_b32_e32 v6, s4302; GCN-NEXT: ds_write_b64 v6, v[4:5] offset:16303; GCN-NEXT: ds_write_b128 v6, v[0:3]304; GCN-NEXT: s_endpgm305entry:306 br label %loop307 308loop:309 %phi = phi <3 x i64> [ poison, %entry ], [ %add, %loop ]310 %load = load volatile <3 x i64>, ptr addrspace(3) %ptr311 %add = add <3 x i64> %load, %phi312 br i1 %cond, label %loop, label %ret313 314ret:315 store volatile <3 x i64> %add, ptr addrspace(3) %ptr316 ret void317}318 319; Make sure the vector undef isn't lowered into 0s.320define amdgpu_kernel void @undef_v4f16(ptr addrspace(3) %ptr, i1 %cond) {321; GCN-LABEL: undef_v4f16:322; GCN: ; %bb.0: ; %entry323; GCN-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0324; GCN-NEXT: s_waitcnt lgkmcnt(0)325; GCN-NEXT: s_bitcmp1_b32 s3, 0326; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0327; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1328; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]329; GCN-NEXT: v_mov_b32_e32 v2, s2330; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0331; GCN-NEXT: ; implicit-def: $vgpr0332; GCN-NEXT: .LBB10_1: ; %loop333; GCN-NEXT: ; =>This Inner Loop Header: Depth=1334; GCN-NEXT: ds_read_b64 v[3:4], v2335; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]336; GCN-NEXT: s_waitcnt lgkmcnt(0)337; GCN-NEXT: v_pk_add_f16 v1, v4, v1338; GCN-NEXT: v_pk_add_f16 v0, v3, v0339; GCN-NEXT: s_cbranch_vccnz .LBB10_1340; GCN-NEXT: ; %bb.2: ; %ret341; GCN-NEXT: v_mov_b32_e32 v2, s2342; GCN-NEXT: ds_write_b64 v2, v[0:1]343; GCN-NEXT: s_endpgm344entry:345 br label %loop346 347loop:348 %phi = phi <4 x half> [ poison, %entry ], [ %add, %loop ]349 %load = load volatile <4 x half>, ptr addrspace(3) %ptr350 %add = fadd <4 x half> %load, %phi351 br i1 %cond, label %loop, label %ret352 353ret:354 store volatile <4 x half> %add, ptr addrspace(3) %ptr355 ret void356}357 358define amdgpu_kernel void @undef_v4i16(ptr addrspace(3) %ptr, i1 %cond) {359; GCN-LABEL: undef_v4i16:360; GCN: ; %bb.0: ; %entry361; GCN-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0362; GCN-NEXT: s_waitcnt lgkmcnt(0)363; GCN-NEXT: s_bitcmp1_b32 s3, 0364; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0365; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1366; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]367; GCN-NEXT: v_mov_b32_e32 v2, s2368; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0369; GCN-NEXT: ; implicit-def: $vgpr0370; GCN-NEXT: .LBB11_1: ; %loop371; GCN-NEXT: ; =>This Inner Loop Header: Depth=1372; GCN-NEXT: ds_read_b64 v[3:4], v2373; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]374; GCN-NEXT: s_waitcnt lgkmcnt(0)375; GCN-NEXT: v_pk_add_u16 v1, v4, v1376; GCN-NEXT: v_pk_add_u16 v0, v3, v0377; GCN-NEXT: s_cbranch_vccnz .LBB11_1378; GCN-NEXT: ; %bb.2: ; %ret379; GCN-NEXT: v_mov_b32_e32 v2, s2380; GCN-NEXT: ds_write_b64 v2, v[0:1]381; GCN-NEXT: s_endpgm382entry:383 br label %loop384 385loop:386 %phi = phi <4 x i16> [ poison, %entry ], [ %add, %loop ]387 %load = load volatile <4 x i16>, ptr addrspace(3) %ptr388 %add = add <4 x i16> %load, %phi389 br i1 %cond, label %loop, label %ret390 391ret:392 store volatile <4 x i16> %add, ptr addrspace(3) %ptr393 ret void394}395 396; Make sure the vector undef isn't lowered into 0s.397define amdgpu_kernel void @undef_v2f16(ptr addrspace(3) %ptr, i1 %cond) {398; GCN-LABEL: undef_v2f16:399; GCN: ; %bb.0: ; %entry400; GCN-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0401; GCN-NEXT: s_waitcnt lgkmcnt(0)402; GCN-NEXT: s_bitcmp1_b32 s3, 0403; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0404; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1405; GCN-NEXT: v_cndmask_b32_e64 v1, 0, 1, s[0:1]406; GCN-NEXT: v_mov_b32_e32 v0, s2407; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v1408; GCN-NEXT: ; implicit-def: $vgpr1409; GCN-NEXT: .LBB12_1: ; %loop410; GCN-NEXT: ; =>This Inner Loop Header: Depth=1411; GCN-NEXT: ds_read_b32 v2, v0412; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]413; GCN-NEXT: s_waitcnt lgkmcnt(0)414; GCN-NEXT: v_pk_add_f16 v1, v2, v1415; GCN-NEXT: s_cbranch_vccnz .LBB12_1416; GCN-NEXT: ; %bb.2: ; %ret417; GCN-NEXT: v_mov_b32_e32 v0, s2418; GCN-NEXT: ds_write_b32 v0, v1419; GCN-NEXT: s_endpgm420entry:421 br label %loop422 423loop:424 %phi = phi <2 x half> [ poison, %entry ], [ %add, %loop ]425 %load = load volatile <2 x half>, ptr addrspace(3) %ptr426 %add = fadd <2 x half> %load, %phi427 br i1 %cond, label %loop, label %ret428 429ret:430 store volatile <2 x half> %add, ptr addrspace(3) %ptr431 ret void432}433 434define amdgpu_kernel void @undef_v2i16(ptr addrspace(3) %ptr, i1 %cond) {435; GCN-LABEL: undef_v2i16:436; GCN: ; %bb.0: ; %entry437; GCN-NEXT: s_load_dwordx2 s[2:3], s[8:9], 0x0438; GCN-NEXT: s_waitcnt lgkmcnt(0)439; GCN-NEXT: s_bitcmp1_b32 s3, 0440; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0441; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1442; GCN-NEXT: v_cndmask_b32_e64 v1, 0, 1, s[0:1]443; GCN-NEXT: v_mov_b32_e32 v0, s2444; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v1445; GCN-NEXT: ; implicit-def: $vgpr1446; GCN-NEXT: .LBB13_1: ; %loop447; GCN-NEXT: ; =>This Inner Loop Header: Depth=1448; GCN-NEXT: ds_read_b32 v2, v0449; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]450; GCN-NEXT: s_waitcnt lgkmcnt(0)451; GCN-NEXT: v_pk_add_u16 v1, v2, v1452; GCN-NEXT: s_cbranch_vccnz .LBB13_1453; GCN-NEXT: ; %bb.2: ; %ret454; GCN-NEXT: v_mov_b32_e32 v0, s2455; GCN-NEXT: ds_write_b32 v0, v1456; GCN-NEXT: s_endpgm457entry:458 br label %loop459 460loop:461 %phi = phi <2 x i16> [ poison, %entry ], [ %add, %loop ]462 %load = load volatile <2 x i16>, ptr addrspace(3) %ptr463 %add = add <2 x i16> %load, %phi464 br i1 %cond, label %loop, label %ret465 466ret:467 store volatile <2 x i16> %add, ptr addrspace(3) %ptr468 ret void469}470 471; We were expanding undef vectors into zero vectors. Optimizations472; would then see we used no elements of the vector, and reform the473; undef vector resulting in a combiner loop.474define void @inf_loop_undef_vector(<6 x float> %arg, float %arg1, i64 %arg2) {475; GCN-LABEL: inf_loop_undef_vector:476; GCN: ; %bb.0:477; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)478; GCN-NEXT: v_mad_u64_u32 v[0:1], s[4:5], v6, v7, v[0:1]479; GCN-NEXT: v_mul_lo_u32 v2, v6, v8480; GCN-NEXT: v_mul_lo_u32 v3, v3, v7481; GCN-NEXT: v_add3_u32 v1, v3, v1, v2482; GCN-NEXT: global_store_dwordx2 v[0:1], v[0:1], off483; GCN-NEXT: s_waitcnt vmcnt(0)484; GCN-NEXT: s_setpc_b64 s[30:31]485 %i = insertelement <6 x float> %arg, float %arg1, i64 2486 %i3 = bitcast <6 x float> %i to <3 x i64>487 %i4 = extractelement <3 x i64> %i3, i64 0488 %i5 = extractelement <3 x i64> %i3, i64 1489 %i6 = mul i64 %i5, %arg2490 %i7 = add i64 %i6, %i4491 store volatile i64 %i7, ptr addrspace(1) poison, align 4492 ret void493}494 495define amdgpu_kernel void @undef_bf16(ptr addrspace(3) %ptr, i1 %cond) {496; GCN-LABEL: undef_bf16:497; GCN: ; %bb.0: ; %entry498; GCN-NEXT: s_load_dword s0, s[8:9], 0x4499; GCN-NEXT: s_waitcnt lgkmcnt(0)500; GCN-NEXT: s_bitcmp1_b32 s0, 0501; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0502; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1503; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]504; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0505; GCN-NEXT: ; implicit-def: $vgpr0506; GCN-NEXT: .LBB15_1: ; %loop507; GCN-NEXT: ; =>This Inner Loop Header: Depth=1508; GCN-NEXT: ds_read_u16 v1, v0509; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]510; GCN-NEXT: s_waitcnt lgkmcnt(0)511; GCN-NEXT: v_add_u32_e32 v0, v1, v0512; GCN-NEXT: s_cbranch_vccnz .LBB15_1513; GCN-NEXT: ; %bb.2: ; %ret514; GCN-NEXT: ds_write_b16 v0, v0515; GCN-NEXT: s_endpgm516entry:517 br label %loop518 519loop:520 %phi = phi bfloat [ poison, %entry ], [ %add, %loop ]521 %load = load volatile bfloat, ptr addrspace(3) poison522 %bc.0 = bitcast bfloat %load to i16523 %bc.1 = bitcast bfloat %phi to i16524 %add.i = add i16 %bc.0, %bc.1525 %add = bitcast i16 %add.i to bfloat526 br i1 %cond, label %loop, label %ret527 528ret:529 store volatile bfloat %add, ptr addrspace(3) poison530 ret void531}532 533define amdgpu_kernel void @undef_v2bf16(ptr addrspace(3) %ptr, i1 %cond) {534; GCN-LABEL: undef_v2bf16:535; GCN: ; %bb.0: ; %entry536; GCN-NEXT: s_load_dword s0, s[8:9], 0x4537; GCN-NEXT: s_waitcnt lgkmcnt(0)538; GCN-NEXT: s_bitcmp1_b32 s0, 0539; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0540; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1541; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]542; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0543; GCN-NEXT: ; implicit-def: $vgpr0544; GCN-NEXT: .LBB16_1: ; %loop545; GCN-NEXT: ; =>This Inner Loop Header: Depth=1546; GCN-NEXT: ds_read_b32 v1, v0547; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]548; GCN-NEXT: s_waitcnt lgkmcnt(0)549; GCN-NEXT: v_pk_add_u16 v0, v1, v0550; GCN-NEXT: s_cbranch_vccnz .LBB16_1551; GCN-NEXT: ; %bb.2: ; %ret552; GCN-NEXT: ds_write_b32 v0, v0553; GCN-NEXT: s_endpgm554entry:555 br label %loop556 557loop:558 %phi = phi <2 x bfloat> [ poison, %entry ], [ %add, %loop ]559 %load = load volatile <2 x bfloat>, ptr addrspace(3) poison560 %bc.0 = bitcast <2 x bfloat> %load to <2 x i16>561 %bc.1 = bitcast <2 x bfloat> %phi to <2 x i16>562 %add.i = add <2 x i16> %bc.0, %bc.1563 %add = bitcast <2 x i16> %add.i to <2 x bfloat>564 br i1 %cond, label %loop, label %ret565 566ret:567 store volatile <2 x bfloat> %add, ptr addrspace(3) poison568 ret void569}570 571define amdgpu_kernel void @undef_v3bf16(ptr addrspace(3) %ptr, i1 %cond) {572; GCN-LABEL: undef_v3bf16:573; GCN: ; %bb.0: ; %entry574; GCN-NEXT: s_load_dword s0, s[8:9], 0x4575; GCN-NEXT: ; implicit-def: $vgpr1576; GCN-NEXT: s_waitcnt lgkmcnt(0)577; GCN-NEXT: s_bitcmp1_b32 s0, 0578; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0579; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1580; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]581; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0582; GCN-NEXT: ; implicit-def: $vgpr0583; GCN-NEXT: .LBB17_1: ; %loop584; GCN-NEXT: ; =>This Inner Loop Header: Depth=1585; GCN-NEXT: ds_read_b32 v2, v0586; GCN-NEXT: ds_read_u16 v3, v0587; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]588; GCN-NEXT: s_waitcnt lgkmcnt(1)589; GCN-NEXT: v_pk_add_u16 v0, v2, v0590; GCN-NEXT: s_waitcnt lgkmcnt(0)591; GCN-NEXT: v_pk_add_u16 v1, v3, v1592; GCN-NEXT: s_cbranch_vccnz .LBB17_1593; GCN-NEXT: ; %bb.2: ; %ret594; GCN-NEXT: ds_write_b16 v0, v1595; GCN-NEXT: ds_write_b32 v0, v0596; GCN-NEXT: s_endpgm597entry:598 br label %loop599 600loop:601 %phi = phi <3 x bfloat> [ poison, %entry ], [ %add, %loop ]602 %load = load volatile <3 x bfloat>, ptr addrspace(3) poison603 %bc.0 = bitcast <3 x bfloat> %load to <3 x i16>604 %bc.1 = bitcast <3 x bfloat> %phi to <3 x i16>605 %add.i = add <3 x i16> %bc.0, %bc.1606 %add = bitcast <3 x i16> %add.i to <3 x bfloat>607 br i1 %cond, label %loop, label %ret608 609ret:610 store volatile <3 x bfloat> %add, ptr addrspace(3) poison611 ret void612}613 614define amdgpu_kernel void @undef_v4bf16(ptr addrspace(3) %ptr, i1 %cond) {615; GCN-LABEL: undef_v4bf16:616; GCN: ; %bb.0: ; %entry617; GCN-NEXT: s_load_dword s0, s[8:9], 0x4618; GCN-NEXT: s_waitcnt lgkmcnt(0)619; GCN-NEXT: s_bitcmp1_b32 s0, 0620; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0621; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1622; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]623; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0624; GCN-NEXT: ; implicit-def: $vgpr0625; GCN-NEXT: .LBB18_1: ; %loop626; GCN-NEXT: ; =>This Inner Loop Header: Depth=1627; GCN-NEXT: ds_read_b64 v[2:3], v0628; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]629; GCN-NEXT: s_waitcnt lgkmcnt(0)630; GCN-NEXT: v_pk_add_u16 v1, v3, v1631; GCN-NEXT: v_pk_add_u16 v0, v2, v0632; GCN-NEXT: s_cbranch_vccnz .LBB18_1633; GCN-NEXT: ; %bb.2: ; %ret634; GCN-NEXT: ds_write_b64 v0, v[0:1]635; GCN-NEXT: s_endpgm636entry:637 br label %loop638 639loop:640 %phi = phi <4 x bfloat> [ poison, %entry ], [ %add, %loop ]641 %load = load volatile <4 x bfloat>, ptr addrspace(3) poison642 %bc.0 = bitcast <4 x bfloat> %load to <4 x i16>643 %bc.1 = bitcast <4 x bfloat> %phi to <4 x i16>644 %add.i = add <4 x i16> %bc.0, %bc.1645 %add = bitcast <4 x i16> %add.i to <4 x bfloat>646 br i1 %cond, label %loop, label %ret647 648ret:649 store volatile <4 x bfloat> %add, ptr addrspace(3) poison650 ret void651}652 653define amdgpu_kernel void @undef_v6bf16(ptr addrspace(3) %ptr, i1 %cond) {654; GCN-LABEL: undef_v6bf16:655; GCN: ; %bb.0: ; %entry656; GCN-NEXT: s_load_dword s0, s[8:9], 0x4657; GCN-NEXT: ; implicit-def: $vgpr2658; GCN-NEXT: s_waitcnt lgkmcnt(0)659; GCN-NEXT: s_bitcmp1_b32 s0, 0660; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0661; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1662; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]663; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0664; GCN-NEXT: ; implicit-def: $vgpr0665; GCN-NEXT: .LBB19_1: ; %loop666; GCN-NEXT: ; =>This Inner Loop Header: Depth=1667; GCN-NEXT: ds_read_b64 v[3:4], v0668; GCN-NEXT: ds_read_b32 v5, v0669; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]670; GCN-NEXT: s_waitcnt lgkmcnt(1)671; GCN-NEXT: v_pk_add_u16 v1, v4, v1672; GCN-NEXT: s_waitcnt lgkmcnt(0)673; GCN-NEXT: v_pk_add_u16 v2, v5, v2674; GCN-NEXT: v_pk_add_u16 v0, v3, v0675; GCN-NEXT: s_cbranch_vccnz .LBB19_1676; GCN-NEXT: ; %bb.2: ; %ret677; GCN-NEXT: ds_write_b32 v0, v2678; GCN-NEXT: ds_write_b64 v0, v[0:1]679; GCN-NEXT: s_endpgm680entry:681 br label %loop682 683loop:684 %phi = phi <6 x bfloat> [ poison, %entry ], [ %add, %loop ]685 %load = load volatile <6 x bfloat>, ptr addrspace(3) poison686 %bc.0 = bitcast <6 x bfloat> %load to <6 x i16>687 %bc.1 = bitcast <6 x bfloat> %phi to <6 x i16>688 %add.i = add <6 x i16> %bc.0, %bc.1689 %add = bitcast <6 x i16> %add.i to <6 x bfloat>690 br i1 %cond, label %loop, label %ret691 692ret:693 store volatile <6 x bfloat> %add, ptr addrspace(3) poison694 ret void695}696 697define amdgpu_kernel void @undef_v8bf16(ptr addrspace(3) %ptr, i1 %cond) {698; GCN-LABEL: undef_v8bf16:699; GCN: ; %bb.0: ; %entry700; GCN-NEXT: s_load_dword s0, s[8:9], 0x4701; GCN-NEXT: s_waitcnt lgkmcnt(0)702; GCN-NEXT: s_bitcmp1_b32 s0, 0703; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0704; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1705; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]706; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0707; GCN-NEXT: ; implicit-def: $vgpr0708; GCN-NEXT: .LBB20_1: ; %loop709; GCN-NEXT: ; =>This Inner Loop Header: Depth=1710; GCN-NEXT: ds_read_b128 v[4:7], v0711; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]712; GCN-NEXT: s_waitcnt lgkmcnt(0)713; GCN-NEXT: v_pk_add_u16 v3, v7, v3714; GCN-NEXT: v_pk_add_u16 v2, v6, v2715; GCN-NEXT: v_pk_add_u16 v1, v5, v1716; GCN-NEXT: v_pk_add_u16 v0, v4, v0717; GCN-NEXT: s_cbranch_vccnz .LBB20_1718; GCN-NEXT: ; %bb.2: ; %ret719; GCN-NEXT: ds_write_b128 v0, v[0:3]720; GCN-NEXT: s_endpgm721entry:722 br label %loop723 724loop:725 %phi = phi <8 x bfloat> [ poison, %entry ], [ %add, %loop ]726 %load = load volatile <8 x bfloat>, ptr addrspace(3) poison727 %bc.0 = bitcast <8 x bfloat> %load to <8 x i16>728 %bc.1 = bitcast <8 x bfloat> %phi to <8 x i16>729 %add.i = add <8 x i16> %bc.0, %bc.1730 %add = bitcast <8 x i16> %add.i to <8 x bfloat>731 br i1 %cond, label %loop, label %ret732 733ret:734 store volatile <8 x bfloat> %add, ptr addrspace(3) poison735 ret void736}737 738define amdgpu_kernel void @undef_v16bf16(ptr addrspace(3) %ptr, i1 %cond) {739; GCN-LABEL: undef_v16bf16:740; GCN: ; %bb.0: ; %entry741; GCN-NEXT: s_load_dword s0, s[8:9], 0x4742; GCN-NEXT: ; implicit-def: $vgpr4743; GCN-NEXT: s_waitcnt lgkmcnt(0)744; GCN-NEXT: s_bitcmp1_b32 s0, 0745; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0746; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1747; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]748; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0749; GCN-NEXT: ; implicit-def: $vgpr0750; GCN-NEXT: .LBB21_1: ; %loop751; GCN-NEXT: ; =>This Inner Loop Header: Depth=1752; GCN-NEXT: ds_read_b128 v[8:11], v0753; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]754; GCN-NEXT: s_waitcnt lgkmcnt(0)755; GCN-NEXT: v_pk_add_u16 v7, v11, v7756; GCN-NEXT: v_pk_add_u16 v6, v10, v6757; GCN-NEXT: v_pk_add_u16 v5, v9, v5758; GCN-NEXT: v_pk_add_u16 v4, v8, v4759; GCN-NEXT: v_pk_add_u16 v3, v11, v3760; GCN-NEXT: v_pk_add_u16 v2, v10, v2761; GCN-NEXT: v_pk_add_u16 v1, v9, v1762; GCN-NEXT: v_pk_add_u16 v0, v8, v0763; GCN-NEXT: s_cbranch_vccnz .LBB21_1764; GCN-NEXT: ; %bb.2: ; %ret765; GCN-NEXT: ds_write_b128 v0, v[4:7]766; GCN-NEXT: ds_write_b128 v0, v[0:3]767; GCN-NEXT: s_endpgm768entry:769 br label %loop770 771loop:772 %phi = phi <16 x bfloat> [ poison, %entry ], [ %add, %loop ]773 %load = load volatile <16 x bfloat>, ptr addrspace(3) poison774 %bc.0 = bitcast <16 x bfloat> %load to <16 x i16>775 %bc.1 = bitcast <16 x bfloat> %phi to <16 x i16>776 %add.i = add <16 x i16> %bc.0, %bc.1777 %add = bitcast <16 x i16> %add.i to <16 x bfloat>778 br i1 %cond, label %loop, label %ret779 780ret:781 store volatile <16 x bfloat> %add, ptr addrspace(3) poison782 ret void783}784 785define amdgpu_kernel void @undef_v32bf16(ptr addrspace(3) %ptr, i1 %cond) {786; GCN-LABEL: undef_v32bf16:787; GCN: ; %bb.0: ; %entry788; GCN-NEXT: s_load_dword s0, s[8:9], 0x4789; GCN-NEXT: ; implicit-def: $vgpr4790; GCN-NEXT: ; implicit-def: $vgpr8791; GCN-NEXT: ; implicit-def: $vgpr12792; GCN-NEXT: s_waitcnt lgkmcnt(0)793; GCN-NEXT: s_bitcmp1_b32 s0, 0794; GCN-NEXT: s_cselect_b64 s[0:1], -1, 0795; GCN-NEXT: s_xor_b64 s[0:1], s[0:1], -1796; GCN-NEXT: v_cndmask_b32_e64 v0, 0, 1, s[0:1]797; GCN-NEXT: v_cmp_ne_u32_e64 s[0:1], 1, v0798; GCN-NEXT: ; implicit-def: $vgpr0799; GCN-NEXT: .LBB22_1: ; %loop800; GCN-NEXT: ; =>This Inner Loop Header: Depth=1801; GCN-NEXT: ds_read_b128 v[16:19], v0802; GCN-NEXT: s_and_b64 vcc, exec, s[0:1]803; GCN-NEXT: s_waitcnt lgkmcnt(0)804; GCN-NEXT: v_pk_add_u16 v15, v19, v15805; GCN-NEXT: v_pk_add_u16 v14, v18, v14806; GCN-NEXT: v_pk_add_u16 v13, v17, v13807; GCN-NEXT: v_pk_add_u16 v12, v16, v12808; GCN-NEXT: v_pk_add_u16 v11, v19, v11809; GCN-NEXT: v_pk_add_u16 v10, v18, v10810; GCN-NEXT: v_pk_add_u16 v9, v17, v9811; GCN-NEXT: v_pk_add_u16 v8, v16, v8812; GCN-NEXT: v_pk_add_u16 v7, v19, v7813; GCN-NEXT: v_pk_add_u16 v6, v18, v6814; GCN-NEXT: v_pk_add_u16 v5, v17, v5815; GCN-NEXT: v_pk_add_u16 v4, v16, v4816; GCN-NEXT: v_pk_add_u16 v3, v19, v3817; GCN-NEXT: v_pk_add_u16 v2, v18, v2818; GCN-NEXT: v_pk_add_u16 v1, v17, v1819; GCN-NEXT: v_pk_add_u16 v0, v16, v0820; GCN-NEXT: s_cbranch_vccnz .LBB22_1821; GCN-NEXT: ; %bb.2: ; %ret822; GCN-NEXT: ds_write_b128 v0, v[12:15]823; GCN-NEXT: ds_write_b128 v0, v[8:11]824; GCN-NEXT: ds_write_b128 v0, v[4:7]825; GCN-NEXT: ds_write_b128 v0, v[0:3]826; GCN-NEXT: s_endpgm827entry:828 br label %loop829 830loop:831 %phi = phi <32 x bfloat> [ poison, %entry ], [ %add, %loop ]832 %load = load volatile <32 x bfloat>, ptr addrspace(3) poison833 %bc.0 = bitcast <32 x bfloat> %load to <32 x i16>834 %bc.1 = bitcast <32 x bfloat> %phi to <32 x i16>835 %add.i = add <32 x i16> %bc.0, %bc.1836 %add = bitcast <32 x i16> %add.i to <32 x bfloat>837 br i1 %cond, label %loop, label %ret838 839ret:840 store volatile <32 x bfloat> %add, ptr addrspace(3) poison841 ret void842}843 844define i64 @poison_should_freeze(i1 %cond1, i32 %val, i16 %val2, i64 %a, i64 %b) {845; GCN-LABEL: poison_should_freeze:846; GCN: ; %bb.0:847; GCN-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)848; GCN-NEXT: v_and_b32_e32 v0, 1, v0849; GCN-NEXT: v_mov_b32_e32 v7, 0x5040100850; GCN-NEXT: v_perm_b32 v2, v2, s4, v7851; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 1, v0852; GCN-NEXT: v_cndmask_b32_e32 v0, v1, v2, vcc853; GCN-NEXT: v_cmp_eq_u32_e32 vcc, 0, v0854; GCN-NEXT: v_cndmask_b32_e32 v0, v5, v3, vcc855; GCN-NEXT: v_cndmask_b32_e32 v1, v6, v4, vcc856; GCN-NEXT: s_setpc_b64 s[30:31]857 %poisonv = insertelement <2 x i16> poison, i16 %val2, i32 1858 %poison = bitcast <2 x i16> %poisonv to i32859 %cond2 = select i1 %cond1, i32 %poison, i32 %val860 %cmp = icmp eq i32 %cond2, 0861 %select = select i1 %cmp, i64 %a, i64 %b862 ret i64 %select863}864