brintos

brintos / llvm-project-archived public Read only

0
0
Text · 50.8 KiB · 02ce8be Raw
1152 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=tonga -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=VI,VI-DENORM %s3; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=tonga -denormal-fp-math=preserve-sign -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=VI,VI-FLUSH %s4; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX10,GFX10-DENORM %s5; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -denormal-fp-math=preserve-sign -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX10,GFX10-FLUSH %s6; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16,GFX11-DENORM,GFX11-DENORM-TRUE16 %s7; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16,GFX11-DENORM,GFX11-DENORM-FAKE16 %s8; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+real-true16 -denormal-fp-math=preserve-sign -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX11,GFX11-TRUE16,GFX11-FLUSH,GFX11-FLUSH-TRUE16 %s9; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=-real-true16 -denormal-fp-math=preserve-sign -denormal-fp-math-f32=preserve-sign  < %s | FileCheck -check-prefixes=GFX11,GFX11-FAKE16,GFX11-FLUSH,GFX11-FLUSH-FAKE16 %s10 11; Make sure (fmul (fadd x, x), c) -> (fmul x, (fmul 2.0, c)) doesn't12; make add an instruction if the fadd has more than one use.13 14declare half @llvm.fabs.f16(half) #115declare float @llvm.fabs.f32(float) #116 17define amdgpu_kernel void @multiple_fadd_use_test_f32(ptr addrspace(1) %out, float %x, float %y, float %z) #0 {18; VI-LABEL: multiple_fadd_use_test_f32:19; VI:       ; %bb.0:20; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x021; VI-NEXT:    s_add_i32 s12, s12, s1722; VI-NEXT:    s_mov_b32 flat_scratch_lo, s1323; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 824; VI-NEXT:    s_waitcnt lgkmcnt(0)25; VI-NEXT:    v_add_f32_e64 v0, s3, -1.026; VI-NEXT:    v_add_f32_e64 v1, s2, -1.027; VI-NEXT:    v_cmp_gt_f32_e64 vcc, |v0|, |v1|28; VI-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc29; VI-NEXT:    v_add_f32_e64 v0, |v0|, |v0|30; VI-NEXT:    v_mul_f32_e32 v1, v0, v031; VI-NEXT:    v_mad_f32 v2, -v1, v0, 1.032; VI-NEXT:    v_mov_b32_e32 v0, s033; VI-NEXT:    v_mov_b32_e32 v1, s134; VI-NEXT:    flat_store_dword v[0:1], v235; VI-NEXT:    s_endpgm36;37; GFX10-LABEL: multiple_fadd_use_test_f32:38; GFX10:       ; %bb.0:39; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x040; GFX10-NEXT:    v_mov_b32_e32 v2, 041; GFX10-NEXT:    s_waitcnt lgkmcnt(0)42; GFX10-NEXT:    v_add_f32_e64 v0, s3, -1.043; GFX10-NEXT:    v_add_f32_e64 v1, s2, -1.044; GFX10-NEXT:    v_cmp_gt_f32_e64 vcc_lo, |v0|, |v1|45; GFX10-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo46; GFX10-NEXT:    v_add_f32_e64 v0, |v0|, |v0|47; GFX10-NEXT:    v_mul_f32_e32 v1, v0, v048; GFX10-NEXT:    v_fma_f32 v0, -v1, v0, 1.049; GFX10-NEXT:    global_store_dword v2, v0, s[0:1]50; GFX10-NEXT:    s_endpgm51;52; GFX11-LABEL: multiple_fadd_use_test_f32:53; GFX11:       ; %bb.0:54; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x055; GFX11-NEXT:    v_mov_b32_e32 v2, 056; GFX11-NEXT:    s_waitcnt lgkmcnt(0)57; GFX11-NEXT:    v_add_f32_e64 v0, s3, -1.058; GFX11-NEXT:    v_add_f32_e64 v1, s2, -1.059; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)60; GFX11-NEXT:    v_cmp_gt_f32_e64 vcc_lo, |v0|, |v1|61; GFX11-NEXT:    v_cndmask_b32_e32 v0, v1, v0, vcc_lo62; GFX11-NEXT:    v_add_f32_e64 v0, |v0|, |v0|63; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)64; GFX11-NEXT:    v_mul_f32_e32 v1, v0, v065; GFX11-NEXT:    v_fma_f32 v0, -v1, v0, 1.066; GFX11-NEXT:    global_store_b32 v2, v0, s[0:1]67; GFX11-NEXT:    s_endpgm68  %a11 = fadd float %y, -1.069  %a12 = call float @llvm.fabs.f32(float %a11)70  %a13 = fadd float %x, -1.071  %a14 = call float @llvm.fabs.f32(float %a13)72  %a15 = fcmp ogt float %a12, %a1473  %a16 = select i1 %a15, float %a12, float %a1474  %a17 = fmul float %a16, 2.075  %a18 = fmul float %a17, %a1776  %a19 = fmul contract float %a18, %a1777  %a20 = fsub contract float 1.0, %a1978  store float %a20, ptr addrspace(1) %out79  ret void80}81 82define amdgpu_kernel void @multiple_use_fadd_fmac_f32(ptr addrspace(1) %out, float %x, [8 x i32], float %y) #0 {83; VI-LABEL: multiple_use_fadd_fmac_f32:84; VI:       ; %bb.0:85; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x086; VI-NEXT:    s_load_dword s4, s[8:9], 0x887; VI-NEXT:    s_load_dword s3, s[8:9], 0x2c88; VI-NEXT:    s_add_i32 s12, s12, s1789; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 890; VI-NEXT:    s_waitcnt lgkmcnt(0)91; VI-NEXT:    v_mov_b32_e32 v0, s092; VI-NEXT:    s_mov_b32 flat_scratch_lo, s1393; VI-NEXT:    s_add_u32 s2, s0, 494; VI-NEXT:    v_add_f32_e64 v2, s4, s495; VI-NEXT:    v_mov_b32_e32 v1, s196; VI-NEXT:    v_mov_b32_e32 v3, s397; VI-NEXT:    s_addc_u32 s3, s1, 098; VI-NEXT:    flat_store_dword v[0:1], v299; VI-NEXT:    s_waitcnt vmcnt(0)100; VI-NEXT:    v_mov_b32_e32 v0, s2101; VI-NEXT:    v_mac_f32_e64 v3, s4, 2.0102; VI-NEXT:    v_mov_b32_e32 v1, s3103; VI-NEXT:    flat_store_dword v[0:1], v3104; VI-NEXT:    s_waitcnt vmcnt(0)105; VI-NEXT:    s_endpgm106;107; GFX10-LABEL: multiple_use_fadd_fmac_f32:108; GFX10:       ; %bb.0:109; GFX10-NEXT:    s_clause 0x2110; GFX10-NEXT:    s_load_dword s2, s[8:9], 0x8111; GFX10-NEXT:    s_load_dword s3, s[8:9], 0x2c112; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0113; GFX10-NEXT:    v_mov_b32_e32 v0, 0114; GFX10-NEXT:    s_waitcnt lgkmcnt(0)115; GFX10-NEXT:    v_add_f32_e64 v1, s2, s2116; GFX10-NEXT:    v_fma_f32 v2, s2, 2.0, s3117; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]118; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0119; GFX10-NEXT:    global_store_dword v0, v2, s[0:1] offset:4120; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0121; GFX10-NEXT:    s_endpgm122;123; GFX11-LABEL: multiple_use_fadd_fmac_f32:124; GFX11:       ; %bb.0:125; GFX11-NEXT:    s_clause 0x2126; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x8127; GFX11-NEXT:    s_load_b32 s3, s[4:5], 0x2c128; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0129; GFX11-NEXT:    v_mov_b32_e32 v0, 0130; GFX11-NEXT:    s_waitcnt lgkmcnt(0)131; GFX11-NEXT:    v_add_f32_e64 v1, s2, s2132; GFX11-NEXT:    v_fma_f32 v2, s2, 2.0, s3133; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1] dlc134; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0135; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1] offset:4 dlc136; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0137; GFX11-NEXT:    s_endpgm138  %out.gep.1 = getelementptr float, ptr addrspace(1) %out, i32 1139  %mul2 = fmul fast float %x, 2.0140  %mad = fadd fast float %mul2, %y141  store volatile float %mul2, ptr addrspace(1) %out142  store volatile float %mad, ptr addrspace(1) %out.gep.1143  ret void144}145 146define amdgpu_kernel void @multiple_use_fadd_fmad_f32(ptr addrspace(1) %out, float %x, float %y) #0 {147; VI-LABEL: multiple_use_fadd_fmad_f32:148; VI:       ; %bb.0:149; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0150; VI-NEXT:    s_add_i32 s12, s12, s17151; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8152; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13153; VI-NEXT:    s_waitcnt lgkmcnt(0)154; VI-NEXT:    v_mov_b32_e32 v0, s0155; VI-NEXT:    s_add_u32 s4, s0, 4156; VI-NEXT:    v_add_f32_e64 v2, |s2|, |s2|157; VI-NEXT:    v_mov_b32_e32 v1, s1158; VI-NEXT:    v_mov_b32_e32 v3, s3159; VI-NEXT:    s_addc_u32 s5, s1, 0160; VI-NEXT:    flat_store_dword v[0:1], v2161; VI-NEXT:    s_waitcnt vmcnt(0)162; VI-NEXT:    v_mov_b32_e32 v0, s4163; VI-NEXT:    v_mad_f32 v3, |s2|, 2.0, v3164; VI-NEXT:    v_mov_b32_e32 v1, s5165; VI-NEXT:    flat_store_dword v[0:1], v3166; VI-NEXT:    s_waitcnt vmcnt(0)167; VI-NEXT:    s_endpgm168;169; GFX10-LABEL: multiple_use_fadd_fmad_f32:170; GFX10:       ; %bb.0:171; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0172; GFX10-NEXT:    v_mov_b32_e32 v0, 0173; GFX10-NEXT:    s_waitcnt lgkmcnt(0)174; GFX10-NEXT:    v_add_f32_e64 v1, |s2|, |s2|175; GFX10-NEXT:    v_fma_f32 v2, |s2|, 2.0, s3176; GFX10-NEXT:    global_store_dword v0, v1, s[0:1]177; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0178; GFX10-NEXT:    global_store_dword v0, v2, s[0:1] offset:4179; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0180; GFX10-NEXT:    s_endpgm181;182; GFX11-LABEL: multiple_use_fadd_fmad_f32:183; GFX11:       ; %bb.0:184; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0185; GFX11-NEXT:    v_mov_b32_e32 v0, 0186; GFX11-NEXT:    s_waitcnt lgkmcnt(0)187; GFX11-NEXT:    v_add_f32_e64 v1, |s2|, |s2|188; GFX11-NEXT:    v_fma_f32 v2, |s2|, 2.0, s3189; GFX11-NEXT:    global_store_b32 v0, v1, s[0:1] dlc190; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0191; GFX11-NEXT:    global_store_b32 v0, v2, s[0:1] offset:4 dlc192; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0193; GFX11-NEXT:    s_endpgm194  %out.gep.1 = getelementptr float, ptr addrspace(1) %out, i32 1195  %x.abs = call float @llvm.fabs.f32(float %x)196  %mul2 = fmul fast float %x.abs, 2.0197  %mad = fadd fast float %mul2, %y198  store volatile float %mul2, ptr addrspace(1) %out199  store volatile float %mad, ptr addrspace(1) %out.gep.1200  ret void201}202 203define amdgpu_kernel void @multiple_use_fadd_multi_fmad_f32(ptr addrspace(1) %out, float %x, float %y, float %z) #0 {204; VI-LABEL: multiple_use_fadd_multi_fmad_f32:205; VI:       ; %bb.0:206; VI-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0207; VI-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x8208; VI-NEXT:    s_add_i32 s12, s12, s17209; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8210; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13211; VI-NEXT:    s_waitcnt lgkmcnt(0)212; VI-NEXT:    s_add_u32 s6, s4, 4213; VI-NEXT:    v_mov_b32_e32 v0, s1214; VI-NEXT:    v_mov_b32_e32 v1, s2215; VI-NEXT:    v_mad_f32 v2, |s0|, 2.0, v0216; VI-NEXT:    v_mad_f32 v3, |s0|, 2.0, v1217; VI-NEXT:    v_mov_b32_e32 v0, s4218; VI-NEXT:    v_mov_b32_e32 v1, s5219; VI-NEXT:    s_addc_u32 s7, s5, 0220; VI-NEXT:    flat_store_dword v[0:1], v2221; VI-NEXT:    s_waitcnt vmcnt(0)222; VI-NEXT:    v_mov_b32_e32 v0, s6223; VI-NEXT:    v_mov_b32_e32 v1, s7224; VI-NEXT:    flat_store_dword v[0:1], v3225; VI-NEXT:    s_waitcnt vmcnt(0)226; VI-NEXT:    s_endpgm227;228; GFX10-LABEL: multiple_use_fadd_multi_fmad_f32:229; GFX10:       ; %bb.0:230; GFX10-NEXT:    s_clause 0x1231; GFX10-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x8232; GFX10-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0233; GFX10-NEXT:    v_mov_b32_e32 v0, 0234; GFX10-NEXT:    s_waitcnt lgkmcnt(0)235; GFX10-NEXT:    v_fma_f32 v1, |s0|, 2.0, s1236; GFX10-NEXT:    v_fma_f32 v2, |s0|, 2.0, s2237; GFX10-NEXT:    global_store_dword v0, v1, s[4:5]238; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0239; GFX10-NEXT:    global_store_dword v0, v2, s[4:5] offset:4240; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0241; GFX10-NEXT:    s_endpgm242;243; GFX11-LABEL: multiple_use_fadd_multi_fmad_f32:244; GFX11:       ; %bb.0:245; GFX11-NEXT:    s_clause 0x1246; GFX11-NEXT:    s_load_b128 s[0:3], s[4:5], 0x8247; GFX11-NEXT:    s_load_b64 s[4:5], s[4:5], 0x0248; GFX11-NEXT:    v_mov_b32_e32 v0, 0249; GFX11-NEXT:    s_waitcnt lgkmcnt(0)250; GFX11-NEXT:    v_fma_f32 v1, |s0|, 2.0, s1251; GFX11-NEXT:    v_fma_f32 v2, |s0|, 2.0, s2252; GFX11-NEXT:    global_store_b32 v0, v1, s[4:5] dlc253; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0254; GFX11-NEXT:    global_store_b32 v0, v2, s[4:5] offset:4 dlc255; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0256; GFX11-NEXT:    s_endpgm257  %out.gep.1 = getelementptr float, ptr addrspace(1) %out, i32 1258  %x.abs = call float @llvm.fabs.f32(float %x)259  %mul2 = fmul fast float %x.abs, 2.0260  %mad0 = fadd fast float %mul2, %y261  %mad1 = fadd fast float %mul2, %z262  store volatile float %mad0, ptr addrspace(1) %out263  store volatile float %mad1, ptr addrspace(1) %out.gep.1264  ret void265}266 267define amdgpu_kernel void @fmul_x2_xn2_f32(ptr addrspace(1) %out, float %x, float %y) #0 {268; VI-LABEL: fmul_x2_xn2_f32:269; VI:       ; %bb.0:270; VI-NEXT:    s_load_dword s2, s[8:9], 0x8271; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0272; VI-NEXT:    s_add_i32 s12, s12, s17273; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13274; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8275; VI-NEXT:    s_waitcnt lgkmcnt(0)276; VI-NEXT:    v_mul_f32_e64 v0, s2, -4.0277; VI-NEXT:    v_mul_f32_e32 v2, s2, v0278; VI-NEXT:    v_mov_b32_e32 v0, s0279; VI-NEXT:    v_mov_b32_e32 v1, s1280; VI-NEXT:    flat_store_dword v[0:1], v2281; VI-NEXT:    s_waitcnt vmcnt(0)282; VI-NEXT:    s_endpgm283;284; GFX10-LABEL: fmul_x2_xn2_f32:285; GFX10:       ; %bb.0:286; GFX10-NEXT:    s_clause 0x1287; GFX10-NEXT:    s_load_dword s2, s[8:9], 0x8288; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0289; GFX10-NEXT:    v_mov_b32_e32 v1, 0290; GFX10-NEXT:    s_waitcnt lgkmcnt(0)291; GFX10-NEXT:    v_mul_f32_e64 v0, s2, -4.0292; GFX10-NEXT:    v_mul_f32_e32 v0, s2, v0293; GFX10-NEXT:    global_store_dword v1, v0, s[0:1]294; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0295; GFX10-NEXT:    s_endpgm296;297; GFX11-LABEL: fmul_x2_xn2_f32:298; GFX11:       ; %bb.0:299; GFX11-NEXT:    s_clause 0x1300; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x8301; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0302; GFX11-NEXT:    s_waitcnt lgkmcnt(0)303; GFX11-NEXT:    v_mul_f32_e64 v0, s2, -4.0304; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)305; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mul_f32 v0, s2, v0306; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1] dlc307; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0308; GFX11-NEXT:    s_endpgm309  %out.gep.1 = getelementptr float, ptr addrspace(1) %out, i32 1310  %mul2 = fmul fast float %x, 2.0311  %muln2 = fmul fast float %x, -2.0312  %mul = fmul fast float %mul2, %muln2313  store volatile float %mul, ptr addrspace(1) %out314  ret void315}316 317define amdgpu_kernel void @fmul_x2_xn3_f32(ptr addrspace(1) %out, float %x, float %y) #0 {318; VI-LABEL: fmul_x2_xn3_f32:319; VI:       ; %bb.0:320; VI-NEXT:    s_load_dword s2, s[8:9], 0x8321; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0322; VI-NEXT:    v_mov_b32_e32 v0, 0xc0c00000323; VI-NEXT:    s_add_i32 s12, s12, s17324; VI-NEXT:    s_mov_b32 flat_scratch_lo, s13325; VI-NEXT:    s_waitcnt lgkmcnt(0)326; VI-NEXT:    v_mul_f32_e32 v0, s2, v0327; VI-NEXT:    v_mul_f32_e32 v2, s2, v0328; VI-NEXT:    v_mov_b32_e32 v0, s0329; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8330; VI-NEXT:    v_mov_b32_e32 v1, s1331; VI-NEXT:    flat_store_dword v[0:1], v2332; VI-NEXT:    s_waitcnt vmcnt(0)333; VI-NEXT:    s_endpgm334;335; GFX10-LABEL: fmul_x2_xn3_f32:336; GFX10:       ; %bb.0:337; GFX10-NEXT:    s_clause 0x1338; GFX10-NEXT:    s_load_dword s2, s[8:9], 0x8339; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0340; GFX10-NEXT:    v_mov_b32_e32 v1, 0341; GFX10-NEXT:    s_waitcnt lgkmcnt(0)342; GFX10-NEXT:    v_mul_f32_e64 v0, 0xc0c00000, s2343; GFX10-NEXT:    v_mul_f32_e32 v0, s2, v0344; GFX10-NEXT:    global_store_dword v1, v0, s[0:1]345; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0346; GFX10-NEXT:    s_endpgm347;348; GFX11-LABEL: fmul_x2_xn3_f32:349; GFX11:       ; %bb.0:350; GFX11-NEXT:    s_clause 0x1351; GFX11-NEXT:    s_load_b32 s2, s[4:5], 0x8352; GFX11-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0353; GFX11-NEXT:    s_waitcnt lgkmcnt(0)354; GFX11-NEXT:    v_mul_f32_e64 v0, 0xc0c00000, s2355; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)356; GFX11-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mul_f32 v0, s2, v0357; GFX11-NEXT:    global_store_b32 v1, v0, s[0:1] dlc358; GFX11-NEXT:    s_waitcnt_vscnt null, 0x0359; GFX11-NEXT:    s_endpgm360  %out.gep.1 = getelementptr float, ptr addrspace(1) %out, i32 1361  %mul2 = fmul fast float %x, 2.0362  %muln2 = fmul fast float %x, -3.0363  %mul = fmul fast float %mul2, %muln2364  store volatile float %mul, ptr addrspace(1) %out365  ret void366}367 368define amdgpu_kernel void @multiple_fadd_use_test_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg, i16 zeroext %z.arg) #0 {369; VI-DENORM-LABEL: multiple_fadd_use_test_f16:370; VI-DENORM:       ; %bb.0:371; VI-DENORM-NEXT:    s_load_dword s2, s[8:9], 0x8372; VI-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0373; VI-DENORM-NEXT:    s_add_i32 s12, s12, s17374; VI-DENORM-NEXT:    s_mov_b32 flat_scratch_lo, s13375; VI-DENORM-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8376; VI-DENORM-NEXT:    s_waitcnt lgkmcnt(0)377; VI-DENORM-NEXT:    s_lshr_b32 s3, s2, 16378; VI-DENORM-NEXT:    v_add_f16_e64 v0, s2, -1.0379; VI-DENORM-NEXT:    v_add_f16_e64 v1, s3, -1.0380; VI-DENORM-NEXT:    v_cmp_gt_f16_e64 vcc, |v1|, |v0|381; VI-DENORM-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc382; VI-DENORM-NEXT:    v_add_f16_e64 v0, |v0|, |v0|383; VI-DENORM-NEXT:    v_mul_f16_e32 v1, v0, v0384; VI-DENORM-NEXT:    v_fma_f16 v2, -v1, v0, 1.0385; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s0386; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s1387; VI-DENORM-NEXT:    flat_store_short v[0:1], v2388; VI-DENORM-NEXT:    s_endpgm389;390; VI-FLUSH-LABEL: multiple_fadd_use_test_f16:391; VI-FLUSH:       ; %bb.0:392; VI-FLUSH-NEXT:    s_load_dword s2, s[8:9], 0x8393; VI-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0394; VI-FLUSH-NEXT:    s_add_i32 s12, s12, s17395; VI-FLUSH-NEXT:    s_mov_b32 flat_scratch_lo, s13396; VI-FLUSH-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8397; VI-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)398; VI-FLUSH-NEXT:    s_lshr_b32 s3, s2, 16399; VI-FLUSH-NEXT:    v_add_f16_e64 v0, s2, -1.0400; VI-FLUSH-NEXT:    v_add_f16_e64 v1, s3, -1.0401; VI-FLUSH-NEXT:    v_cmp_gt_f16_e64 vcc, |v1|, |v0|402; VI-FLUSH-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc403; VI-FLUSH-NEXT:    v_add_f16_e64 v0, |v0|, |v0|404; VI-FLUSH-NEXT:    v_mul_f16_e32 v1, v0, v0405; VI-FLUSH-NEXT:    v_mad_f16 v2, -v1, v0, 1.0406; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s0407; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s1408; VI-FLUSH-NEXT:    flat_store_short v[0:1], v2409; VI-FLUSH-NEXT:    s_endpgm410;411; GFX10-DENORM-LABEL: multiple_fadd_use_test_f16:412; GFX10-DENORM:       ; %bb.0:413; GFX10-DENORM-NEXT:    s_load_dword s0, s[8:9], 0x8414; GFX10-DENORM-NEXT:    v_mov_b32_e32 v2, 0415; GFX10-DENORM-NEXT:    s_waitcnt lgkmcnt(0)416; GFX10-DENORM-NEXT:    s_lshr_b32 s1, s0, 16417; GFX10-DENORM-NEXT:    v_add_f16_e64 v0, s0, -1.0418; GFX10-DENORM-NEXT:    v_add_f16_e64 v1, s1, -1.0419; GFX10-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0420; GFX10-DENORM-NEXT:    v_cmp_gt_f16_e64 vcc_lo, |v1|, |v0|421; GFX10-DENORM-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo422; GFX10-DENORM-NEXT:    v_add_f16_e64 v0, |v0|, |v0|423; GFX10-DENORM-NEXT:    v_mul_f16_e32 v1, v0, v0424; GFX10-DENORM-NEXT:    v_fma_f16 v0, -v1, v0, 1.0425; GFX10-DENORM-NEXT:    s_waitcnt lgkmcnt(0)426; GFX10-DENORM-NEXT:    global_store_short v2, v0, s[0:1]427; GFX10-DENORM-NEXT:    s_endpgm428;429; GFX10-FLUSH-LABEL: multiple_fadd_use_test_f16:430; GFX10-FLUSH:       ; %bb.0:431; GFX10-FLUSH-NEXT:    s_load_dword s0, s[8:9], 0x8432; GFX10-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)433; GFX10-FLUSH-NEXT:    s_lshr_b32 s1, s0, 16434; GFX10-FLUSH-NEXT:    v_add_f16_e64 v0, s0, -1.0435; GFX10-FLUSH-NEXT:    v_add_f16_e64 v1, s1, -1.0436; GFX10-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0437; GFX10-FLUSH-NEXT:    v_cmp_gt_f16_e64 vcc_lo, |v1|, |v0|438; GFX10-FLUSH-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo439; GFX10-FLUSH-NEXT:    v_add_f16_e64 v0, |v0|, |v0|440; GFX10-FLUSH-NEXT:    v_mul_f16_e32 v1, v0, v0441; GFX10-FLUSH-NEXT:    v_mul_f16_e32 v0, v1, v0442; GFX10-FLUSH-NEXT:    v_mov_b32_e32 v1, 0443; GFX10-FLUSH-NEXT:    v_sub_f16_e32 v0, 1.0, v0444; GFX10-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)445; GFX10-FLUSH-NEXT:    global_store_short v1, v0, s[0:1]446; GFX10-FLUSH-NEXT:    s_endpgm447;448; GFX11-DENORM-TRUE16-LABEL: multiple_fadd_use_test_f16:449; GFX11-DENORM-TRUE16:       ; %bb.0:450; GFX11-DENORM-TRUE16-NEXT:    s_load_b32 s0, s[4:5], 0x8451; GFX11-DENORM-TRUE16-NEXT:    v_mov_b32_e32 v1, 0452; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)453; GFX11-DENORM-TRUE16-NEXT:    s_lshr_b32 s1, s0, 16454; GFX11-DENORM-TRUE16-NEXT:    v_add_f16_e64 v0.h, s0, -1.0455; GFX11-DENORM-TRUE16-NEXT:    v_add_f16_e64 v0.l, s1, -1.0456; GFX11-DENORM-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0457; GFX11-DENORM-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)458; GFX11-DENORM-TRUE16-NEXT:    v_cmp_gt_f16_e64 s2, |v0.l|, |v0.h|459; GFX11-DENORM-TRUE16-NEXT:    v_cndmask_b16 v0.l, v0.h, v0.l, s2460; GFX11-DENORM-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)461; GFX11-DENORM-TRUE16-NEXT:    v_add_f16_e64 v0.l, |v0.l|, |v0.l|462; GFX11-DENORM-TRUE16-NEXT:    v_mul_f16_e32 v0.h, v0.l, v0.l463; GFX11-DENORM-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)464; GFX11-DENORM-TRUE16-NEXT:    v_fma_f16 v0.l, -v0.h, v0.l, 1.0465; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)466; GFX11-DENORM-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1]467; GFX11-DENORM-TRUE16-NEXT:    s_endpgm468;469; GFX11-DENORM-FAKE16-LABEL: multiple_fadd_use_test_f16:470; GFX11-DENORM-FAKE16:       ; %bb.0:471; GFX11-DENORM-FAKE16-NEXT:    s_load_b32 s0, s[4:5], 0x8472; GFX11-DENORM-FAKE16-NEXT:    v_mov_b32_e32 v2, 0473; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)474; GFX11-DENORM-FAKE16-NEXT:    s_lshr_b32 s1, s0, 16475; GFX11-DENORM-FAKE16-NEXT:    v_add_f16_e64 v0, s0, -1.0476; GFX11-DENORM-FAKE16-NEXT:    v_add_f16_e64 v1, s1, -1.0477; GFX11-DENORM-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0478; GFX11-DENORM-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)479; GFX11-DENORM-FAKE16-NEXT:    v_cmp_gt_f16_e64 vcc_lo, |v1|, |v0|480; GFX11-DENORM-FAKE16-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo481; GFX11-DENORM-FAKE16-NEXT:    v_add_f16_e64 v0, |v0|, |v0|482; GFX11-DENORM-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)483; GFX11-DENORM-FAKE16-NEXT:    v_mul_f16_e32 v1, v0, v0484; GFX11-DENORM-FAKE16-NEXT:    v_fma_f16 v0, -v1, v0, 1.0485; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)486; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v2, v0, s[0:1]487; GFX11-DENORM-FAKE16-NEXT:    s_endpgm488;489; GFX11-FLUSH-TRUE16-LABEL: multiple_fadd_use_test_f16:490; GFX11-FLUSH-TRUE16:       ; %bb.0:491; GFX11-FLUSH-TRUE16-NEXT:    s_load_b32 s0, s[4:5], 0x8492; GFX11-FLUSH-TRUE16-NEXT:    v_mov_b32_e32 v1, 0493; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)494; GFX11-FLUSH-TRUE16-NEXT:    s_lshr_b32 s1, s0, 16495; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.h, s0, -1.0496; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.l, s1, -1.0497; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)498; GFX11-FLUSH-TRUE16-NEXT:    v_cmp_gt_f16_e64 s0, |v0.l|, |v0.h|499; GFX11-FLUSH-TRUE16-NEXT:    v_cndmask_b16 v0.l, v0.h, v0.l, s0500; GFX11-FLUSH-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0501; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)502; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.l, |v0.l|, |v0.l|503; GFX11-FLUSH-TRUE16-NEXT:    v_mul_f16_e32 v0.h, v0.l, v0.l504; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)505; GFX11-FLUSH-TRUE16-NEXT:    v_mul_f16_e32 v0.l, v0.h, v0.l506; GFX11-FLUSH-TRUE16-NEXT:    v_sub_f16_e32 v0.l, 1.0, v0.l507; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)508; GFX11-FLUSH-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1]509; GFX11-FLUSH-TRUE16-NEXT:    s_endpgm510;511; GFX11-FLUSH-FAKE16-LABEL: multiple_fadd_use_test_f16:512; GFX11-FLUSH-FAKE16:       ; %bb.0:513; GFX11-FLUSH-FAKE16-NEXT:    s_load_b32 s0, s[4:5], 0x8514; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)515; GFX11-FLUSH-FAKE16-NEXT:    s_lshr_b32 s1, s0, 16516; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v0, s0, -1.0517; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v1, s1, -1.0518; GFX11-FLUSH-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0519; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)520; GFX11-FLUSH-FAKE16-NEXT:    v_cmp_gt_f16_e64 vcc_lo, |v1|, |v0|521; GFX11-FLUSH-FAKE16-NEXT:    v_cndmask_b32_e32 v0, v0, v1, vcc_lo522; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v0, |v0|, |v0|523; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)524; GFX11-FLUSH-FAKE16-NEXT:    v_mul_f16_e32 v1, v0, v0525; GFX11-FLUSH-FAKE16-NEXT:    v_mul_f16_e32 v0, v1, v0526; GFX11-FLUSH-FAKE16-NEXT:    v_mov_b32_e32 v1, 0527; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_2)528; GFX11-FLUSH-FAKE16-NEXT:    v_sub_f16_e32 v0, 1.0, v0529; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)530; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1]531; GFX11-FLUSH-FAKE16-NEXT:    s_endpgm532  %x = bitcast i16 %x.arg to half533  %y = bitcast i16 %y.arg to half534  %z = bitcast i16 %z.arg to half535  %a11 = fadd half %y, -1.0536  %a12 = call half @llvm.fabs.f16(half %a11)537  %a13 = fadd half %x, -1.0538  %a14 = call half @llvm.fabs.f16(half %a13)539  %a15 = fcmp ogt half %a12, %a14540  %a16 = select i1 %a15, half %a12, half %a14541  %a17 = fmul half %a16, 2.0542  %a18 = fmul half %a17, %a17543  %a19 = fmul contract half %a18, %a17544  %a20 = fsub contract half 1.0, %a19545  store half %a20, ptr addrspace(1) %out546  ret void547}548 549define amdgpu_kernel void @multiple_use_fadd_fmac_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg) #0 {550; VI-DENORM-LABEL: multiple_use_fadd_fmac_f16:551; VI-DENORM:       ; %bb.0:552; VI-DENORM-NEXT:    s_load_dword s4, s[8:9], 0x8553; VI-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0554; VI-DENORM-NEXT:    s_add_i32 s12, s12, s17555; VI-DENORM-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8556; VI-DENORM-NEXT:    s_mov_b32 flat_scratch_lo, s13557; VI-DENORM-NEXT:    s_waitcnt lgkmcnt(0)558; VI-DENORM-NEXT:    s_lshr_b32 s3, s4, 16559; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s3560; VI-DENORM-NEXT:    v_fma_f16 v3, s4, 2.0, v0561; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s0562; VI-DENORM-NEXT:    v_add_f16_e64 v2, s4, s4563; VI-DENORM-NEXT:    s_add_u32 s2, s0, 2564; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s1565; VI-DENORM-NEXT:    s_addc_u32 s3, s1, 0566; VI-DENORM-NEXT:    flat_store_short v[0:1], v2567; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)568; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s2569; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s3570; VI-DENORM-NEXT:    flat_store_short v[0:1], v3571; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)572; VI-DENORM-NEXT:    s_endpgm573;574; VI-FLUSH-LABEL: multiple_use_fadd_fmac_f16:575; VI-FLUSH:       ; %bb.0:576; VI-FLUSH-NEXT:    s_load_dword s4, s[8:9], 0x8577; VI-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0578; VI-FLUSH-NEXT:    s_add_i32 s12, s12, s17579; VI-FLUSH-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8580; VI-FLUSH-NEXT:    s_mov_b32 flat_scratch_lo, s13581; VI-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)582; VI-FLUSH-NEXT:    s_lshr_b32 s3, s4, 16583; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s0584; VI-FLUSH-NEXT:    v_add_f16_e64 v2, s4, s4585; VI-FLUSH-NEXT:    s_add_u32 s2, s0, 2586; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s1587; VI-FLUSH-NEXT:    v_mov_b32_e32 v3, s3588; VI-FLUSH-NEXT:    s_addc_u32 s3, s1, 0589; VI-FLUSH-NEXT:    flat_store_short v[0:1], v2590; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)591; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s2592; VI-FLUSH-NEXT:    v_mac_f16_e64 v3, s4, 2.0593; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s3594; VI-FLUSH-NEXT:    flat_store_short v[0:1], v3595; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)596; VI-FLUSH-NEXT:    s_endpgm597;598; GFX10-DENORM-LABEL: multiple_use_fadd_fmac_f16:599; GFX10-DENORM:       ; %bb.0:600; GFX10-DENORM-NEXT:    s_clause 0x1601; GFX10-DENORM-NEXT:    s_load_dword s2, s[8:9], 0x8602; GFX10-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0603; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, 0604; GFX10-DENORM-NEXT:    s_waitcnt lgkmcnt(0)605; GFX10-DENORM-NEXT:    s_lshr_b32 s3, s2, 16606; GFX10-DENORM-NEXT:    v_add_f16_e64 v1, s2, s2607; GFX10-DENORM-NEXT:    v_fma_f16 v2, s2, 2.0, s3608; GFX10-DENORM-NEXT:    global_store_short v0, v1, s[0:1]609; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0610; GFX10-DENORM-NEXT:    global_store_short v0, v2, s[0:1] offset:2611; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0612; GFX10-DENORM-NEXT:    s_endpgm613;614; GFX10-FLUSH-LABEL: multiple_use_fadd_fmac_f16:615; GFX10-FLUSH:       ; %bb.0:616; GFX10-FLUSH-NEXT:    s_clause 0x1617; GFX10-FLUSH-NEXT:    s_load_dword s2, s[8:9], 0x8618; GFX10-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0619; GFX10-FLUSH-NEXT:    v_mov_b32_e32 v1, 0620; GFX10-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)621; GFX10-FLUSH-NEXT:    v_add_f16_e64 v0, s2, s2622; GFX10-FLUSH-NEXT:    s_lshr_b32 s2, s2, 16623; GFX10-FLUSH-NEXT:    v_add_f16_e32 v2, s2, v0624; GFX10-FLUSH-NEXT:    global_store_short v1, v0, s[0:1]625; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0626; GFX10-FLUSH-NEXT:    global_store_short v1, v2, s[0:1] offset:2627; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0628; GFX10-FLUSH-NEXT:    s_endpgm629;630; GFX11-DENORM-TRUE16-LABEL: multiple_use_fadd_fmac_f16:631; GFX11-DENORM-TRUE16:       ; %bb.0:632; GFX11-DENORM-TRUE16-NEXT:    s_clause 0x1633; GFX11-DENORM-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8634; GFX11-DENORM-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0635; GFX11-DENORM-TRUE16-NEXT:    v_mov_b32_e32 v1, 0636; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)637; GFX11-DENORM-TRUE16-NEXT:    s_lshr_b32 s3, s2, 16638; GFX11-DENORM-TRUE16-NEXT:    v_add_f16_e64 v0.l, s2, s2639; GFX11-DENORM-TRUE16-NEXT:    v_fma_f16 v0.h, s2, 2.0, s3640; GFX11-DENORM-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc641; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0642; GFX11-DENORM-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] offset:2 dlc643; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0644; GFX11-DENORM-TRUE16-NEXT:    s_endpgm645;646; GFX11-DENORM-FAKE16-LABEL: multiple_use_fadd_fmac_f16:647; GFX11-DENORM-FAKE16:       ; %bb.0:648; GFX11-DENORM-FAKE16-NEXT:    s_clause 0x1649; GFX11-DENORM-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8650; GFX11-DENORM-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0651; GFX11-DENORM-FAKE16-NEXT:    v_mov_b32_e32 v0, 0652; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)653; GFX11-DENORM-FAKE16-NEXT:    s_lshr_b32 s3, s2, 16654; GFX11-DENORM-FAKE16-NEXT:    v_add_f16_e64 v1, s2, s2655; GFX11-DENORM-FAKE16-NEXT:    v_fma_f16 v2, s2, 2.0, s3656; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1] dlc657; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0658; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v2, s[0:1] offset:2 dlc659; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0660; GFX11-DENORM-FAKE16-NEXT:    s_endpgm661;662; GFX11-FLUSH-TRUE16-LABEL: multiple_use_fadd_fmac_f16:663; GFX11-FLUSH-TRUE16:       ; %bb.0:664; GFX11-FLUSH-TRUE16-NEXT:    s_clause 0x1665; GFX11-FLUSH-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8666; GFX11-FLUSH-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0667; GFX11-FLUSH-TRUE16-NEXT:    v_mov_b32_e32 v1, 0668; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)669; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.l, s2, s2670; GFX11-FLUSH-TRUE16-NEXT:    s_lshr_b32 s2, s2, 16671; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)672; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e32 v0.h, s2, v0.l673; GFX11-FLUSH-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc674; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0675; GFX11-FLUSH-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] offset:2 dlc676; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0677; GFX11-FLUSH-TRUE16-NEXT:    s_endpgm678;679; GFX11-FLUSH-FAKE16-LABEL: multiple_use_fadd_fmac_f16:680; GFX11-FLUSH-FAKE16:       ; %bb.0:681; GFX11-FLUSH-FAKE16-NEXT:    s_clause 0x1682; GFX11-FLUSH-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8683; GFX11-FLUSH-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0684; GFX11-FLUSH-FAKE16-NEXT:    v_mov_b32_e32 v1, 0685; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)686; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v0, s2, s2687; GFX11-FLUSH-FAKE16-NEXT:    s_lshr_b32 s2, s2, 16688; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)689; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e32 v2, s2, v0690; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc691; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0692; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v2, s[0:1] offset:2 dlc693; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0694; GFX11-FLUSH-FAKE16-NEXT:    s_endpgm695  %x = bitcast i16 %x.arg to half696  %y = bitcast i16 %y.arg to half697  %out.gep.1 = getelementptr half, ptr addrspace(1) %out, i32 1698  %mul2 = fmul fast half %x, 2.0699  %mad = fadd fast half %mul2, %y700  store volatile half %mul2, ptr addrspace(1) %out701  store volatile half %mad, ptr addrspace(1) %out.gep.1702  ret void703}704 705define amdgpu_kernel void @multiple_use_fadd_fmad_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg) #0 {706; VI-DENORM-LABEL: multiple_use_fadd_fmad_f16:707; VI-DENORM:       ; %bb.0:708; VI-DENORM-NEXT:    s_load_dword s4, s[8:9], 0x8709; VI-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0710; VI-DENORM-NEXT:    s_add_i32 s12, s12, s17711; VI-DENORM-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8712; VI-DENORM-NEXT:    s_mov_b32 flat_scratch_lo, s13713; VI-DENORM-NEXT:    s_waitcnt lgkmcnt(0)714; VI-DENORM-NEXT:    s_lshr_b32 s3, s4, 16715; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s3716; VI-DENORM-NEXT:    v_fma_f16 v3, |s4|, 2.0, v0717; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s0718; VI-DENORM-NEXT:    v_add_f16_e64 v2, |s4|, |s4|719; VI-DENORM-NEXT:    s_add_u32 s2, s0, 2720; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s1721; VI-DENORM-NEXT:    s_addc_u32 s3, s1, 0722; VI-DENORM-NEXT:    flat_store_short v[0:1], v2723; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)724; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s2725; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s3726; VI-DENORM-NEXT:    flat_store_short v[0:1], v3727; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)728; VI-DENORM-NEXT:    s_endpgm729;730; VI-FLUSH-LABEL: multiple_use_fadd_fmad_f16:731; VI-FLUSH:       ; %bb.0:732; VI-FLUSH-NEXT:    s_load_dword s4, s[8:9], 0x8733; VI-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0734; VI-FLUSH-NEXT:    s_add_i32 s12, s12, s17735; VI-FLUSH-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8736; VI-FLUSH-NEXT:    s_mov_b32 flat_scratch_lo, s13737; VI-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)738; VI-FLUSH-NEXT:    s_lshr_b32 s3, s4, 16739; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s3740; VI-FLUSH-NEXT:    v_mad_f16 v3, |s4|, 2.0, v0741; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s0742; VI-FLUSH-NEXT:    v_add_f16_e64 v2, |s4|, |s4|743; VI-FLUSH-NEXT:    s_add_u32 s2, s0, 2744; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s1745; VI-FLUSH-NEXT:    s_addc_u32 s3, s1, 0746; VI-FLUSH-NEXT:    flat_store_short v[0:1], v2747; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)748; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s2749; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s3750; VI-FLUSH-NEXT:    flat_store_short v[0:1], v3751; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)752; VI-FLUSH-NEXT:    s_endpgm753;754; GFX10-DENORM-LABEL: multiple_use_fadd_fmad_f16:755; GFX10-DENORM:       ; %bb.0:756; GFX10-DENORM-NEXT:    s_clause 0x1757; GFX10-DENORM-NEXT:    s_load_dword s2, s[8:9], 0x8758; GFX10-DENORM-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0759; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, 0760; GFX10-DENORM-NEXT:    s_waitcnt lgkmcnt(0)761; GFX10-DENORM-NEXT:    s_lshr_b32 s3, s2, 16762; GFX10-DENORM-NEXT:    v_add_f16_e64 v1, |s2|, |s2|763; GFX10-DENORM-NEXT:    v_fma_f16 v2, |s2|, 2.0, s3764; GFX10-DENORM-NEXT:    global_store_short v0, v1, s[0:1]765; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0766; GFX10-DENORM-NEXT:    global_store_short v0, v2, s[0:1] offset:2767; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0768; GFX10-DENORM-NEXT:    s_endpgm769;770; GFX10-FLUSH-LABEL: multiple_use_fadd_fmad_f16:771; GFX10-FLUSH:       ; %bb.0:772; GFX10-FLUSH-NEXT:    s_clause 0x1773; GFX10-FLUSH-NEXT:    s_load_dword s2, s[8:9], 0x8774; GFX10-FLUSH-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x0775; GFX10-FLUSH-NEXT:    v_mov_b32_e32 v1, 0776; GFX10-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)777; GFX10-FLUSH-NEXT:    v_add_f16_e64 v0, |s2|, |s2|778; GFX10-FLUSH-NEXT:    s_lshr_b32 s2, s2, 16779; GFX10-FLUSH-NEXT:    v_add_f16_e32 v2, s2, v0780; GFX10-FLUSH-NEXT:    global_store_short v1, v0, s[0:1]781; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0782; GFX10-FLUSH-NEXT:    global_store_short v1, v2, s[0:1] offset:2783; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0784; GFX10-FLUSH-NEXT:    s_endpgm785;786; GFX11-DENORM-TRUE16-LABEL: multiple_use_fadd_fmad_f16:787; GFX11-DENORM-TRUE16:       ; %bb.0:788; GFX11-DENORM-TRUE16-NEXT:    s_clause 0x1789; GFX11-DENORM-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8790; GFX11-DENORM-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0791; GFX11-DENORM-TRUE16-NEXT:    v_mov_b32_e32 v1, 0792; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)793; GFX11-DENORM-TRUE16-NEXT:    s_lshr_b32 s3, s2, 16794; GFX11-DENORM-TRUE16-NEXT:    v_add_f16_e64 v0.l, |s2|, |s2|795; GFX11-DENORM-TRUE16-NEXT:    v_fma_f16 v0.h, |s2|, 2.0, s3796; GFX11-DENORM-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc797; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0798; GFX11-DENORM-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] offset:2 dlc799; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0800; GFX11-DENORM-TRUE16-NEXT:    s_endpgm801;802; GFX11-DENORM-FAKE16-LABEL: multiple_use_fadd_fmad_f16:803; GFX11-DENORM-FAKE16:       ; %bb.0:804; GFX11-DENORM-FAKE16-NEXT:    s_clause 0x1805; GFX11-DENORM-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8806; GFX11-DENORM-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0807; GFX11-DENORM-FAKE16-NEXT:    v_mov_b32_e32 v0, 0808; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)809; GFX11-DENORM-FAKE16-NEXT:    s_lshr_b32 s3, s2, 16810; GFX11-DENORM-FAKE16-NEXT:    v_add_f16_e64 v1, |s2|, |s2|811; GFX11-DENORM-FAKE16-NEXT:    v_fma_f16 v2, |s2|, 2.0, s3812; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1] dlc813; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0814; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v2, s[0:1] offset:2 dlc815; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0816; GFX11-DENORM-FAKE16-NEXT:    s_endpgm817;818; GFX11-FLUSH-TRUE16-LABEL: multiple_use_fadd_fmad_f16:819; GFX11-FLUSH-TRUE16:       ; %bb.0:820; GFX11-FLUSH-TRUE16-NEXT:    s_clause 0x1821; GFX11-FLUSH-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x8822; GFX11-FLUSH-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0823; GFX11-FLUSH-TRUE16-NEXT:    v_mov_b32_e32 v1, 0824; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)825; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.l, |s2|, |s2|826; GFX11-FLUSH-TRUE16-NEXT:    s_lshr_b32 s2, s2, 16827; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)828; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e32 v0.h, s2, v0.l829; GFX11-FLUSH-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc830; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0831; GFX11-FLUSH-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] offset:2 dlc832; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0833; GFX11-FLUSH-TRUE16-NEXT:    s_endpgm834;835; GFX11-FLUSH-FAKE16-LABEL: multiple_use_fadd_fmad_f16:836; GFX11-FLUSH-FAKE16:       ; %bb.0:837; GFX11-FLUSH-FAKE16-NEXT:    s_clause 0x1838; GFX11-FLUSH-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x8839; GFX11-FLUSH-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x0840; GFX11-FLUSH-FAKE16-NEXT:    v_mov_b32_e32 v1, 0841; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)842; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v0, |s2|, |s2|843; GFX11-FLUSH-FAKE16-NEXT:    s_lshr_b32 s2, s2, 16844; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)845; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e32 v2, s2, v0846; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc847; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0848; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v2, s[0:1] offset:2 dlc849; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0850; GFX11-FLUSH-FAKE16-NEXT:    s_endpgm851  %x = bitcast i16 %x.arg to half852  %y = bitcast i16 %y.arg to half853  %out.gep.1 = getelementptr half, ptr addrspace(1) %out, i32 1854  %x.abs = call half @llvm.fabs.f16(half %x)855  %mul2 = fmul fast half %x.abs, 2.0856  %mad = fadd fast half %mul2, %y857  store volatile half %mul2, ptr addrspace(1) %out858  store volatile half %mad, ptr addrspace(1) %out.gep.1859  ret void860}861 862define amdgpu_kernel void @multiple_use_fadd_multi_fmad_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg, i16 zeroext %z.arg) #0 {863; VI-DENORM-LABEL: multiple_use_fadd_multi_fmad_f16:864; VI-DENORM:       ; %bb.0:865; VI-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0866; VI-DENORM-NEXT:    s_add_i32 s12, s12, s17867; VI-DENORM-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8868; VI-DENORM-NEXT:    s_mov_b32 flat_scratch_lo, s13869; VI-DENORM-NEXT:    s_waitcnt lgkmcnt(0)870; VI-DENORM-NEXT:    s_lshr_b32 s5, s2, 16871; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s3872; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s5873; VI-DENORM-NEXT:    v_fma_f16 v2, |s2|, 2.0, v0874; VI-DENORM-NEXT:    v_fma_f16 v3, |s2|, 2.0, v1875; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s0876; VI-DENORM-NEXT:    s_add_u32 s4, s0, 2877; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s1878; VI-DENORM-NEXT:    s_addc_u32 s5, s1, 0879; VI-DENORM-NEXT:    flat_store_short v[0:1], v3880; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)881; VI-DENORM-NEXT:    v_mov_b32_e32 v0, s4882; VI-DENORM-NEXT:    v_mov_b32_e32 v1, s5883; VI-DENORM-NEXT:    flat_store_short v[0:1], v2884; VI-DENORM-NEXT:    s_waitcnt vmcnt(0)885; VI-DENORM-NEXT:    s_endpgm886;887; VI-FLUSH-LABEL: multiple_use_fadd_multi_fmad_f16:888; VI-FLUSH:       ; %bb.0:889; VI-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0890; VI-FLUSH-NEXT:    s_add_i32 s12, s12, s17891; VI-FLUSH-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 8892; VI-FLUSH-NEXT:    s_mov_b32 flat_scratch_lo, s13893; VI-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)894; VI-FLUSH-NEXT:    s_lshr_b32 s5, s2, 16895; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s3896; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s5897; VI-FLUSH-NEXT:    v_mad_f16 v2, |s2|, 2.0, v0898; VI-FLUSH-NEXT:    v_mad_f16 v3, |s2|, 2.0, v1899; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s0900; VI-FLUSH-NEXT:    s_add_u32 s4, s0, 2901; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s1902; VI-FLUSH-NEXT:    s_addc_u32 s5, s1, 0903; VI-FLUSH-NEXT:    flat_store_short v[0:1], v3904; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)905; VI-FLUSH-NEXT:    v_mov_b32_e32 v0, s4906; VI-FLUSH-NEXT:    v_mov_b32_e32 v1, s5907; VI-FLUSH-NEXT:    flat_store_short v[0:1], v2908; VI-FLUSH-NEXT:    s_waitcnt vmcnt(0)909; VI-FLUSH-NEXT:    s_endpgm910;911; GFX10-DENORM-LABEL: multiple_use_fadd_multi_fmad_f16:912; GFX10-DENORM:       ; %bb.0:913; GFX10-DENORM-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0914; GFX10-DENORM-NEXT:    v_mov_b32_e32 v0, 0915; GFX10-DENORM-NEXT:    s_waitcnt lgkmcnt(0)916; GFX10-DENORM-NEXT:    s_lshr_b32 s4, s2, 16917; GFX10-DENORM-NEXT:    v_fma_f16 v2, |s2|, 2.0, s3918; GFX10-DENORM-NEXT:    v_fma_f16 v1, |s2|, 2.0, s4919; GFX10-DENORM-NEXT:    global_store_short v0, v1, s[0:1]920; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0921; GFX10-DENORM-NEXT:    global_store_short v0, v2, s[0:1] offset:2922; GFX10-DENORM-NEXT:    s_waitcnt_vscnt null, 0x0923; GFX10-DENORM-NEXT:    s_endpgm924;925; GFX10-FLUSH-LABEL: multiple_use_fadd_multi_fmad_f16:926; GFX10-FLUSH:       ; %bb.0:927; GFX10-FLUSH-NEXT:    s_load_dwordx4 s[0:3], s[8:9], 0x0928; GFX10-FLUSH-NEXT:    v_mov_b32_e32 v1, 0929; GFX10-FLUSH-NEXT:    s_waitcnt lgkmcnt(0)930; GFX10-FLUSH-NEXT:    v_add_f16_e64 v0, |s2|, |s2|931; GFX10-FLUSH-NEXT:    s_lshr_b32 s2, s2, 16932; GFX10-FLUSH-NEXT:    v_add_f16_e32 v2, s2, v0933; GFX10-FLUSH-NEXT:    v_add_f16_e32 v0, s3, v0934; GFX10-FLUSH-NEXT:    global_store_short v1, v2, s[0:1]935; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0936; GFX10-FLUSH-NEXT:    global_store_short v1, v0, s[0:1] offset:2937; GFX10-FLUSH-NEXT:    s_waitcnt_vscnt null, 0x0938; GFX10-FLUSH-NEXT:    s_endpgm939;940; GFX11-DENORM-TRUE16-LABEL: multiple_use_fadd_multi_fmad_f16:941; GFX11-DENORM-TRUE16:       ; %bb.0:942; GFX11-DENORM-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0943; GFX11-DENORM-TRUE16-NEXT:    v_mov_b32_e32 v1, 0944; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)945; GFX11-DENORM-TRUE16-NEXT:    s_lshr_b32 s4, s2, 16946; GFX11-DENORM-TRUE16-NEXT:    v_fma_f16 v0.h, |s2|, 2.0, s3947; GFX11-DENORM-TRUE16-NEXT:    v_fma_f16 v0.l, |s2|, 2.0, s4948; GFX11-DENORM-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc949; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0950; GFX11-DENORM-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] offset:2 dlc951; GFX11-DENORM-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0952; GFX11-DENORM-TRUE16-NEXT:    s_endpgm953;954; GFX11-DENORM-FAKE16-LABEL: multiple_use_fadd_multi_fmad_f16:955; GFX11-DENORM-FAKE16:       ; %bb.0:956; GFX11-DENORM-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0957; GFX11-DENORM-FAKE16-NEXT:    v_mov_b32_e32 v0, 0958; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)959; GFX11-DENORM-FAKE16-NEXT:    s_lshr_b32 s4, s2, 16960; GFX11-DENORM-FAKE16-NEXT:    v_fma_f16 v2, |s2|, 2.0, s3961; GFX11-DENORM-FAKE16-NEXT:    v_fma_f16 v1, |s2|, 2.0, s4962; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v1, s[0:1] dlc963; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0964; GFX11-DENORM-FAKE16-NEXT:    global_store_b16 v0, v2, s[0:1] offset:2 dlc965; GFX11-DENORM-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0966; GFX11-DENORM-FAKE16-NEXT:    s_endpgm967;968; GFX11-FLUSH-TRUE16-LABEL: multiple_use_fadd_multi_fmad_f16:969; GFX11-FLUSH-TRUE16:       ; %bb.0:970; GFX11-FLUSH-TRUE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0971; GFX11-FLUSH-TRUE16-NEXT:    v_mov_b32_e32 v1, 0972; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)973; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e64 v0.l, |s2|, |s2|974; GFX11-FLUSH-TRUE16-NEXT:    s_lshr_b32 s2, s2, 16975; GFX11-FLUSH-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)976; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e32 v0.h, s2, v0.l977; GFX11-FLUSH-TRUE16-NEXT:    v_add_f16_e32 v0.l, s3, v0.l978; GFX11-FLUSH-TRUE16-NEXT:    global_store_d16_hi_b16 v1, v0, s[0:1] dlc979; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0980; GFX11-FLUSH-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] offset:2 dlc981; GFX11-FLUSH-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x0982; GFX11-FLUSH-TRUE16-NEXT:    s_endpgm983;984; GFX11-FLUSH-FAKE16-LABEL: multiple_use_fadd_multi_fmad_f16:985; GFX11-FLUSH-FAKE16:       ; %bb.0:986; GFX11-FLUSH-FAKE16-NEXT:    s_load_b128 s[0:3], s[4:5], 0x0987; GFX11-FLUSH-FAKE16-NEXT:    v_mov_b32_e32 v1, 0988; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)989; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e64 v0, |s2|, |s2|990; GFX11-FLUSH-FAKE16-NEXT:    s_lshr_b32 s2, s2, 16991; GFX11-FLUSH-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instid1(SALU_CYCLE_1)992; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e32 v2, s2, v0993; GFX11-FLUSH-FAKE16-NEXT:    v_add_f16_e32 v0, s3, v0994; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v2, s[0:1] dlc995; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0996; GFX11-FLUSH-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1] offset:2 dlc997; GFX11-FLUSH-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x0998; GFX11-FLUSH-FAKE16-NEXT:    s_endpgm999  %x = bitcast i16 %x.arg to half1000  %y = bitcast i16 %y.arg to half1001  %z = bitcast i16 %z.arg to half1002  %out.gep.1 = getelementptr half, ptr addrspace(1) %out, i32 11003  %x.abs = call half @llvm.fabs.f16(half %x)1004  %mul2 = fmul fast half %x.abs, 2.01005  %mad0 = fadd fast half %mul2, %y1006  %mad1 = fadd fast half %mul2, %z1007  store volatile half %mad0, ptr addrspace(1) %out1008  store volatile half %mad1, ptr addrspace(1) %out.gep.11009  ret void1010}1011 1012define amdgpu_kernel void @fmul_x2_xn2_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg) #0 {1013; VI-LABEL: fmul_x2_xn2_f16:1014; VI:       ; %bb.0:1015; VI-NEXT:    s_load_dword s2, s[8:9], 0x81016; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x01017; VI-NEXT:    s_add_i32 s12, s12, s171018; VI-NEXT:    s_mov_b32 flat_scratch_lo, s131019; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 81020; VI-NEXT:    s_waitcnt lgkmcnt(0)1021; VI-NEXT:    v_mul_f16_e64 v0, s2, -4.01022; VI-NEXT:    v_mul_f16_e32 v2, s2, v01023; VI-NEXT:    v_mov_b32_e32 v0, s01024; VI-NEXT:    v_mov_b32_e32 v1, s11025; VI-NEXT:    flat_store_short v[0:1], v21026; VI-NEXT:    s_waitcnt vmcnt(0)1027; VI-NEXT:    s_endpgm1028;1029; GFX10-LABEL: fmul_x2_xn2_f16:1030; GFX10:       ; %bb.0:1031; GFX10-NEXT:    s_clause 0x11032; GFX10-NEXT:    s_load_dword s2, s[8:9], 0x81033; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x01034; GFX10-NEXT:    v_mov_b32_e32 v1, 01035; GFX10-NEXT:    s_waitcnt lgkmcnt(0)1036; GFX10-NEXT:    v_mul_f16_e64 v0, s2, -4.01037; GFX10-NEXT:    v_mul_f16_e32 v0, s2, v01038; GFX10-NEXT:    global_store_short v1, v0, s[0:1]1039; GFX10-NEXT:    s_waitcnt_vscnt null, 0x01040; GFX10-NEXT:    s_endpgm1041;1042; GFX11-TRUE16-LABEL: fmul_x2_xn2_f16:1043; GFX11-TRUE16:       ; %bb.0:1044; GFX11-TRUE16-NEXT:    s_clause 0x11045; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x81046; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x01047; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, 01048; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)1049; GFX11-TRUE16-NEXT:    v_mul_f16_e64 v0.l, s2, -4.01050; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)1051; GFX11-TRUE16-NEXT:    v_mul_f16_e32 v0.l, s2, v0.l1052; GFX11-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc1053; GFX11-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x01054; GFX11-TRUE16-NEXT:    s_endpgm1055;1056; GFX11-FAKE16-LABEL: fmul_x2_xn2_f16:1057; GFX11-FAKE16:       ; %bb.0:1058; GFX11-FAKE16-NEXT:    s_clause 0x11059; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x81060; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x01061; GFX11-FAKE16-NEXT:    v_mov_b32_e32 v1, 01062; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)1063; GFX11-FAKE16-NEXT:    v_mul_f16_e64 v0, s2, -4.01064; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)1065; GFX11-FAKE16-NEXT:    v_mul_f16_e32 v0, s2, v01066; GFX11-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc1067; GFX11-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x01068; GFX11-FAKE16-NEXT:    s_endpgm1069  %x = bitcast i16 %x.arg to half1070  %y = bitcast i16 %y.arg to half1071  %out.gep.1 = getelementptr half, ptr addrspace(1) %out, i32 11072  %mul2 = fmul fast half %x, 2.01073  %muln2 = fmul fast half %x, -2.01074  %mul = fmul fast half %mul2, %muln21075  store volatile half %mul, ptr addrspace(1) %out1076  ret void1077}1078 1079define amdgpu_kernel void @fmul_x2_xn3_f16(ptr addrspace(1) %out, i16 zeroext %x.arg, i16 zeroext %y.arg) #0 {1080; VI-LABEL: fmul_x2_xn3_f16:1081; VI:       ; %bb.0:1082; VI-NEXT:    s_load_dword s2, s[8:9], 0x81083; VI-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x01084; VI-NEXT:    v_mov_b32_e32 v0, 0xc6001085; VI-NEXT:    s_add_i32 s12, s12, s171086; VI-NEXT:    s_mov_b32 flat_scratch_lo, s131087; VI-NEXT:    s_waitcnt lgkmcnt(0)1088; VI-NEXT:    v_mul_f16_e32 v0, s2, v01089; VI-NEXT:    v_mul_f16_e32 v2, s2, v01090; VI-NEXT:    v_mov_b32_e32 v0, s01091; VI-NEXT:    s_lshr_b32 flat_scratch_hi, s12, 81092; VI-NEXT:    v_mov_b32_e32 v1, s11093; VI-NEXT:    flat_store_short v[0:1], v21094; VI-NEXT:    s_waitcnt vmcnt(0)1095; VI-NEXT:    s_endpgm1096;1097; GFX10-LABEL: fmul_x2_xn3_f16:1098; GFX10:       ; %bb.0:1099; GFX10-NEXT:    s_clause 0x11100; GFX10-NEXT:    s_load_dword s2, s[8:9], 0x81101; GFX10-NEXT:    s_load_dwordx2 s[0:1], s[8:9], 0x01102; GFX10-NEXT:    v_mov_b32_e32 v1, 01103; GFX10-NEXT:    s_waitcnt lgkmcnt(0)1104; GFX10-NEXT:    v_mul_f16_e64 v0, 0xc600, s21105; GFX10-NEXT:    v_mul_f16_e32 v0, s2, v01106; GFX10-NEXT:    global_store_short v1, v0, s[0:1]1107; GFX10-NEXT:    s_waitcnt_vscnt null, 0x01108; GFX10-NEXT:    s_endpgm1109;1110; GFX11-TRUE16-LABEL: fmul_x2_xn3_f16:1111; GFX11-TRUE16:       ; %bb.0:1112; GFX11-TRUE16-NEXT:    s_clause 0x11113; GFX11-TRUE16-NEXT:    s_load_b32 s2, s[4:5], 0x81114; GFX11-TRUE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x01115; GFX11-TRUE16-NEXT:    v_mov_b32_e32 v1, 01116; GFX11-TRUE16-NEXT:    s_waitcnt lgkmcnt(0)1117; GFX11-TRUE16-NEXT:    v_mul_f16_e64 v0.l, 0xc600, s21118; GFX11-TRUE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)1119; GFX11-TRUE16-NEXT:    v_mul_f16_e32 v0.l, s2, v0.l1120; GFX11-TRUE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc1121; GFX11-TRUE16-NEXT:    s_waitcnt_vscnt null, 0x01122; GFX11-TRUE16-NEXT:    s_endpgm1123;1124; GFX11-FAKE16-LABEL: fmul_x2_xn3_f16:1125; GFX11-FAKE16:       ; %bb.0:1126; GFX11-FAKE16-NEXT:    s_clause 0x11127; GFX11-FAKE16-NEXT:    s_load_b32 s2, s[4:5], 0x81128; GFX11-FAKE16-NEXT:    s_load_b64 s[0:1], s[4:5], 0x01129; GFX11-FAKE16-NEXT:    v_mov_b32_e32 v1, 01130; GFX11-FAKE16-NEXT:    s_waitcnt lgkmcnt(0)1131; GFX11-FAKE16-NEXT:    v_mul_f16_e64 v0, 0xc600, s21132; GFX11-FAKE16-NEXT:    s_delay_alu instid0(VALU_DEP_1)1133; GFX11-FAKE16-NEXT:    v_mul_f16_e32 v0, s2, v01134; GFX11-FAKE16-NEXT:    global_store_b16 v1, v0, s[0:1] dlc1135; GFX11-FAKE16-NEXT:    s_waitcnt_vscnt null, 0x01136; GFX11-FAKE16-NEXT:    s_endpgm1137  %x = bitcast i16 %x.arg to half1138  %y = bitcast i16 %y.arg to half1139  %out.gep.1 = getelementptr half, ptr addrspace(1) %out, i32 11140  %mul2 = fmul fast half %x, 2.01141  %muln2 = fmul fast half %x, -3.01142  %mul = fmul fast half %mul2, %muln21143  store volatile half %mul, ptr addrspace(1) %out1144  ret void1145}1146 1147attributes #0 = { nounwind }1148attributes #1 = { nounwind readnone }1149;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:1150; GFX11-DENORM: {{.*}}1151; GFX11-FLUSH: {{.*}}1152