1629 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s3; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 -fp-contract=fast < %s | FileCheck -check-prefix=GFX9-CONTRACT %s4; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefix=GFX9-DENORM %s5; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s6; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 -fp-contract=fast < %s | FileCheck -check-prefix=GFX10-CONTRACT %s7; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 --denormal-fp-math=preserve-sign < %s | FileCheck -check-prefix=GFX10-DENORM %s8 9define float @test_f32_add_mul(float %x, float %y, float %z) {10; GFX9-LABEL: test_f32_add_mul:11; GFX9: ; %bb.0: ; %.entry12; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)13; GFX9-NEXT: v_mul_f32_e32 v0, v0, v114; GFX9-NEXT: v_add_f32_e32 v0, v0, v215; GFX9-NEXT: s_setpc_b64 s[30:31]16;17; GFX9-CONTRACT-LABEL: test_f32_add_mul:18; GFX9-CONTRACT: ; %bb.0: ; %.entry19; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)20; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v221; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]22;23; GFX9-DENORM-LABEL: test_f32_add_mul:24; GFX9-DENORM: ; %bb.0: ; %.entry25; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)26; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v1, v227; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]28;29; GFX10-LABEL: test_f32_add_mul:30; GFX10: ; %bb.0: ; %.entry31; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)32; GFX10-NEXT: v_mul_f32_e32 v0, v0, v133; GFX10-NEXT: v_add_f32_e32 v0, v0, v234; GFX10-NEXT: s_setpc_b64 s[30:31]35;36; GFX10-CONTRACT-LABEL: test_f32_add_mul:37; GFX10-CONTRACT: ; %bb.0: ; %.entry38; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)39; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v240; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]41;42; GFX10-DENORM-LABEL: test_f32_add_mul:43; GFX10-DENORM: ; %bb.0: ; %.entry44; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)45; GFX10-DENORM-NEXT: v_mad_f32 v0, v0, v1, v246; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]47; GFX10-UNSAFE-LABEL: test_f32_add_mul:48; GFX10-UNSAFE: ; %bb.0: ; %.entry49; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)50; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v251; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]52.entry:53 %a = fmul float %x, %y54 %b = fadd float %a, %z55 ret float %b56}57 58define float @test_f32_add_mul_contract(float %x, float %y, float %z) {59; GFX9-LABEL: test_f32_add_mul_contract:60; GFX9: ; %bb.0: ; %.entry61; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)62; GFX9-NEXT: v_fma_f32 v0, v0, v1, v263; GFX9-NEXT: s_setpc_b64 s[30:31]64;65; GFX9-CONTRACT-LABEL: test_f32_add_mul_contract:66; GFX9-CONTRACT: ; %bb.0: ; %.entry67; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)68; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v269; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]70;71; GFX9-DENORM-LABEL: test_f32_add_mul_contract:72; GFX9-DENORM: ; %bb.0: ; %.entry73; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)74; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v1, v275; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]76;77; GFX10-LABEL: test_f32_add_mul_contract:78; GFX10: ; %bb.0: ; %.entry79; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)80; GFX10-NEXT: v_fma_f32 v0, v0, v1, v281; GFX10-NEXT: s_setpc_b64 s[30:31]82;83; GFX10-CONTRACT-LABEL: test_f32_add_mul_contract:84; GFX10-CONTRACT: ; %bb.0: ; %.entry85; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)86; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v287; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]88;89; GFX10-DENORM-LABEL: test_f32_add_mul_contract:90; GFX10-DENORM: ; %bb.0: ; %.entry91; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)92; GFX10-DENORM-NEXT: v_fma_f32 v0, v0, v1, v293; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]94; GFX9-UNSAFE-LABEL: test_f32_add_mul_contract:95; GFX9-UNSAFE: ; %bb.0: ; %.entry96; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)97; GFX9-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v298; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]99; GFX10-UNSAFE-LABEL: test_f32_add_mul_contract:100; GFX10-UNSAFE: ; %bb.0: ; %.entry101; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)102; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v2103; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]104.entry:105 %a = fmul contract float %x, %y106 %b = fadd contract float %a, %z107 ret float %b108}109 110define float @test_f32_add_mul_rhs(float %x, float %y, float %z) {111; GFX9-LABEL: test_f32_add_mul_rhs:112; GFX9: ; %bb.0: ; %.entry113; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)114; GFX9-NEXT: v_mul_f32_e32 v0, v0, v1115; GFX9-NEXT: v_add_f32_e32 v0, v2, v0116; GFX9-NEXT: s_setpc_b64 s[30:31]117;118; GFX9-CONTRACT-LABEL: test_f32_add_mul_rhs:119; GFX9-CONTRACT: ; %bb.0: ; %.entry120; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)121; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2122; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]123;124; GFX9-DENORM-LABEL: test_f32_add_mul_rhs:125; GFX9-DENORM: ; %bb.0: ; %.entry126; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)127; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v1, v2128; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]129;130; GFX10-LABEL: test_f32_add_mul_rhs:131; GFX10: ; %bb.0: ; %.entry132; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)133; GFX10-NEXT: v_mul_f32_e32 v0, v0, v1134; GFX10-NEXT: v_add_f32_e32 v0, v2, v0135; GFX10-NEXT: s_setpc_b64 s[30:31]136;137; GFX10-CONTRACT-LABEL: test_f32_add_mul_rhs:138; GFX10-CONTRACT: ; %bb.0: ; %.entry139; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)140; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2141; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]142;143; GFX10-DENORM-LABEL: test_f32_add_mul_rhs:144; GFX10-DENORM: ; %bb.0: ; %.entry145; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)146; GFX10-DENORM-NEXT: v_mad_f32 v0, v0, v1, v2147; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]148; GFX10-UNSAFE-LABEL: test_f32_add_mul_rhs:149; GFX10-UNSAFE: ; %bb.0: ; %.entry150; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)151; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v2152; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]153.entry:154 %a = fmul float %x, %y155 %b = fadd float %z, %a156 ret float %b157}158 159define float @test_f32_add_mul_rhs_contract(float %x, float %y, float %z) {160; GFX9-LABEL: test_f32_add_mul_rhs_contract:161; GFX9: ; %bb.0: ; %.entry162; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)163; GFX9-NEXT: v_fma_f32 v0, v0, v1, v2164; GFX9-NEXT: s_setpc_b64 s[30:31]165;166; GFX9-CONTRACT-LABEL: test_f32_add_mul_rhs_contract:167; GFX9-CONTRACT: ; %bb.0: ; %.entry168; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)169; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2170; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]171;172; GFX9-DENORM-LABEL: test_f32_add_mul_rhs_contract:173; GFX9-DENORM: ; %bb.0: ; %.entry174; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)175; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v1, v2176; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]177;178; GFX10-LABEL: test_f32_add_mul_rhs_contract:179; GFX10: ; %bb.0: ; %.entry180; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)181; GFX10-NEXT: v_fma_f32 v0, v0, v1, v2182; GFX10-NEXT: s_setpc_b64 s[30:31]183;184; GFX10-CONTRACT-LABEL: test_f32_add_mul_rhs_contract:185; GFX10-CONTRACT: ; %bb.0: ; %.entry186; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)187; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2188; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]189;190; GFX10-DENORM-LABEL: test_f32_add_mul_rhs_contract:191; GFX10-DENORM: ; %bb.0: ; %.entry192; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)193; GFX10-DENORM-NEXT: v_fma_f32 v0, v0, v1, v2194; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]195; GFX9-UNSAFE-LABEL: test_f32_add_mul_rhs_contract:196; GFX9-UNSAFE: ; %bb.0: ; %.entry197; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)198; GFX9-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v2199; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]200; GFX10-UNSAFE-LABEL: test_f32_add_mul_rhs_contract:201; GFX10-UNSAFE: ; %bb.0: ; %.entry202; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)203; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v2204; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]205.entry:206 %a = fmul contract float %x, %y207 %b = fadd contract float %z, %a208 ret float %b209}210 211define float @test_add_mul_multiple_defs_z(float %x, float %y, ptr addrspace(1) %vec_ptr) {212; GFX9-LABEL: test_add_mul_multiple_defs_z:213; GFX9: ; %bb.0: ; %.entry214; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)215; GFX9-NEXT: global_load_dword v2, v[2:3], off offset:4216; GFX9-NEXT: v_mul_f32_e32 v0, v0, v1217; GFX9-NEXT: s_waitcnt vmcnt(0)218; GFX9-NEXT: v_add_f32_e32 v0, v0, v2219; GFX9-NEXT: s_setpc_b64 s[30:31]220;221; GFX9-CONTRACT-LABEL: test_add_mul_multiple_defs_z:222; GFX9-CONTRACT: ; %bb.0: ; %.entry223; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)224; GFX9-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4225; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0)226; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2227; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]228;229; GFX9-DENORM-LABEL: test_add_mul_multiple_defs_z:230; GFX9-DENORM: ; %bb.0: ; %.entry231; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)232; GFX9-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4233; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0)234; GFX9-DENORM-NEXT: v_mac_f32_e32 v2, v0, v1235; GFX9-DENORM-NEXT: v_mov_b32_e32 v0, v2236; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]237;238; GFX10-LABEL: test_add_mul_multiple_defs_z:239; GFX10: ; %bb.0: ; %.entry240; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)241; GFX10-NEXT: global_load_dword v2, v[2:3], off offset:4242; GFX10-NEXT: v_mul_f32_e32 v0, v0, v1243; GFX10-NEXT: s_waitcnt vmcnt(0)244; GFX10-NEXT: v_add_f32_e32 v0, v0, v2245; GFX10-NEXT: s_setpc_b64 s[30:31]246;247; GFX10-CONTRACT-LABEL: test_add_mul_multiple_defs_z:248; GFX10-CONTRACT: ; %bb.0: ; %.entry249; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)250; GFX10-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4251; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0)252; GFX10-CONTRACT-NEXT: v_fmac_f32_e32 v2, v0, v1253; GFX10-CONTRACT-NEXT: v_mov_b32_e32 v0, v2254; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]255;256; GFX10-DENORM-LABEL: test_add_mul_multiple_defs_z:257; GFX10-DENORM: ; %bb.0: ; %.entry258; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)259; GFX10-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4260; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0)261; GFX10-DENORM-NEXT: v_mac_f32_e32 v2, v0, v1262; GFX10-DENORM-NEXT: v_mov_b32_e32 v0, v2263; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]264; GFX10-UNSAFE-LABEL: test_add_mul_multiple_defs_z:265; GFX10-UNSAFE: ; %bb.0: ; %.entry266; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)267; GFX10-UNSAFE-NEXT: global_load_dword v2, v[2:3], off offset:4268; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0)269; GFX10-UNSAFE-NEXT: v_fmac_f32_e32 v2, v0, v1270; GFX10-UNSAFE-NEXT: v_mov_b32_e32 v0, v2271; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]272.entry:273 %a = fmul float %x, %y274 %vec = load <2 x float>, ptr addrspace(1) %vec_ptr275 %z = extractelement <2 x float> %vec, i64 1276 %b = fadd float %a, %z277 ret float %b278}279 280define float @test_add_mul_multiple_defs_z_contract(float %x, float %y, ptr addrspace(1) %vec_ptr) {281; GFX9-LABEL: test_add_mul_multiple_defs_z_contract:282; GFX9: ; %bb.0: ; %.entry283; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)284; GFX9-NEXT: global_load_dword v2, v[2:3], off offset:4285; GFX9-NEXT: s_waitcnt vmcnt(0)286; GFX9-NEXT: v_fma_f32 v0, v0, v1, v2287; GFX9-NEXT: s_setpc_b64 s[30:31]288;289; GFX9-CONTRACT-LABEL: test_add_mul_multiple_defs_z_contract:290; GFX9-CONTRACT: ; %bb.0: ; %.entry291; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)292; GFX9-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4293; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0)294; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2295; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]296;297; GFX9-DENORM-LABEL: test_add_mul_multiple_defs_z_contract:298; GFX9-DENORM: ; %bb.0: ; %.entry299; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)300; GFX9-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4301; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0)302; GFX9-DENORM-NEXT: v_mac_f32_e32 v2, v0, v1303; GFX9-DENORM-NEXT: v_mov_b32_e32 v0, v2304; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]305;306; GFX10-LABEL: test_add_mul_multiple_defs_z_contract:307; GFX10: ; %bb.0: ; %.entry308; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)309; GFX10-NEXT: global_load_dword v2, v[2:3], off offset:4310; GFX10-NEXT: s_waitcnt vmcnt(0)311; GFX10-NEXT: v_fmac_f32_e32 v2, v0, v1312; GFX10-NEXT: v_mov_b32_e32 v0, v2313; GFX10-NEXT: s_setpc_b64 s[30:31]314;315; GFX10-CONTRACT-LABEL: test_add_mul_multiple_defs_z_contract:316; GFX10-CONTRACT: ; %bb.0: ; %.entry317; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)318; GFX10-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4319; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0)320; GFX10-CONTRACT-NEXT: v_fmac_f32_e32 v2, v0, v1321; GFX10-CONTRACT-NEXT: v_mov_b32_e32 v0, v2322; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]323;324; GFX10-DENORM-LABEL: test_add_mul_multiple_defs_z_contract:325; GFX10-DENORM: ; %bb.0: ; %.entry326; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)327; GFX10-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4328; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0)329; GFX10-DENORM-NEXT: v_fmac_f32_e32 v2, v0, v1330; GFX10-DENORM-NEXT: v_mov_b32_e32 v0, v2331; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]332; GFX9-UNSAFE-LABEL: test_add_mul_multiple_defs_z_contract:333; GFX9-UNSAFE: ; %bb.0: ; %.entry334; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)335; GFX9-UNSAFE-NEXT: global_load_dword v2, v[2:3], off offset:4336; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0)337; GFX9-UNSAFE-NEXT: v_fma_f32 v0, v0, v1, v2338; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]339; GFX10-UNSAFE-LABEL: test_add_mul_multiple_defs_z_contract:340; GFX10-UNSAFE: ; %bb.0: ; %.entry341; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)342; GFX10-UNSAFE-NEXT: global_load_dword v2, v[2:3], off offset:4343; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0)344; GFX10-UNSAFE-NEXT: v_fmac_f32_e32 v2, v0, v1345; GFX10-UNSAFE-NEXT: v_mov_b32_e32 v0, v2346; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]347.entry:348 %a = fmul contract float %x, %y349 %vec = load <2 x float>, ptr addrspace(1) %vec_ptr350 %z = extractelement <2 x float> %vec, i64 1351 %b = fadd contract float %a, %z352 ret float %b353}354 355define float @test_add_mul_rhs_multiple_defs_z(float %x, float %y, ptr addrspace(1) %vec_ptr) {356; GFX9-LABEL: test_add_mul_rhs_multiple_defs_z:357; GFX9: ; %bb.0: ; %.entry358; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)359; GFX9-NEXT: global_load_dword v2, v[2:3], off offset:4360; GFX9-NEXT: v_mul_f32_e32 v0, v0, v1361; GFX9-NEXT: s_waitcnt vmcnt(0)362; GFX9-NEXT: v_add_f32_e32 v0, v2, v0363; GFX9-NEXT: s_setpc_b64 s[30:31]364;365; GFX9-CONTRACT-LABEL: test_add_mul_rhs_multiple_defs_z:366; GFX9-CONTRACT: ; %bb.0: ; %.entry367; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)368; GFX9-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4369; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0)370; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v1, v2371; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]372;373; GFX9-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z:374; GFX9-DENORM: ; %bb.0: ; %.entry375; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)376; GFX9-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4377; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0)378; GFX9-DENORM-NEXT: v_mac_f32_e32 v2, v0, v1379; GFX9-DENORM-NEXT: v_mov_b32_e32 v0, v2380; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]381;382; GFX10-LABEL: test_add_mul_rhs_multiple_defs_z:383; GFX10: ; %bb.0: ; %.entry384; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)385; GFX10-NEXT: global_load_dword v2, v[2:3], off offset:4386; GFX10-NEXT: v_mul_f32_e32 v0, v0, v1387; GFX10-NEXT: s_waitcnt vmcnt(0)388; GFX10-NEXT: v_add_f32_e32 v0, v2, v0389; GFX10-NEXT: s_setpc_b64 s[30:31]390;391; GFX10-CONTRACT-LABEL: test_add_mul_rhs_multiple_defs_z:392; GFX10-CONTRACT: ; %bb.0: ; %.entry393; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)394; GFX10-CONTRACT-NEXT: global_load_dword v2, v[2:3], off offset:4395; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0)396; GFX10-CONTRACT-NEXT: v_fmac_f32_e32 v2, v0, v1397; GFX10-CONTRACT-NEXT: v_mov_b32_e32 v0, v2398; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]399;400; GFX10-DENORM-LABEL: test_add_mul_rhs_multiple_defs_z:401; GFX10-DENORM: ; %bb.0: ; %.entry402; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)403; GFX10-DENORM-NEXT: global_load_dword v2, v[2:3], off offset:4404; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0)405; GFX10-DENORM-NEXT: v_mac_f32_e32 v2, v0, v1406; GFX10-DENORM-NEXT: v_mov_b32_e32 v0, v2407; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]408; GFX10-UNSAFE-LABEL: test_add_mul_rhs_multiple_defs_z:409; GFX10-UNSAFE: ; %bb.0: ; %.entry410; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)411; GFX10-UNSAFE-NEXT: global_load_dword v2, v[2:3], off offset:4412; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0)413; GFX10-UNSAFE-NEXT: v_fmac_f32_e32 v2, v0, v1414; GFX10-UNSAFE-NEXT: v_mov_b32_e32 v0, v2415; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]416.entry:417 %a = fmul float %x, %y418 %vec = load <2 x float>, ptr addrspace(1) %vec_ptr419 %z = extractelement <2 x float> %vec, i64 1420 %b = fadd float %z, %a421 ret float %b422}423 424define half @test_half_add_mul(half %x, half %y, half %z) {425; GFX9-LABEL: test_half_add_mul:426; GFX9: ; %bb.0: ; %.entry427; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)428; GFX9-NEXT: v_mul_f16_e32 v0, v0, v1429; GFX9-NEXT: v_add_f16_e32 v0, v0, v2430; GFX9-NEXT: s_setpc_b64 s[30:31]431;432; GFX9-CONTRACT-LABEL: test_half_add_mul:433; GFX9-CONTRACT: ; %bb.0: ; %.entry434; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)435; GFX9-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2436; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]437;438; GFX9-DENORM-LABEL: test_half_add_mul:439; GFX9-DENORM: ; %bb.0: ; %.entry440; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)441; GFX9-DENORM-NEXT: v_mad_legacy_f16 v0, v0, v1, v2442; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]443;444; GFX10-LABEL: test_half_add_mul:445; GFX10: ; %bb.0: ; %.entry446; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)447; GFX10-NEXT: v_mul_f16_e32 v0, v0, v1448; GFX10-NEXT: v_add_f16_e32 v0, v0, v2449; GFX10-NEXT: s_setpc_b64 s[30:31]450;451; GFX10-CONTRACT-LABEL: test_half_add_mul:452; GFX10-CONTRACT: ; %bb.0: ; %.entry453; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)454; GFX10-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2455; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]456;457; GFX10-DENORM-LABEL: test_half_add_mul:458; GFX10-DENORM: ; %bb.0: ; %.entry459; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)460; GFX10-DENORM-NEXT: v_mul_f16_e32 v0, v0, v1461; GFX10-DENORM-NEXT: v_add_f16_e32 v0, v0, v2462; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]463; GFX10-UNSAFE-LABEL: test_half_add_mul:464; GFX10-UNSAFE: ; %bb.0: ; %.entry465; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)466; GFX10-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2467; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]468.entry:469 %a = fmul half %x, %y470 %b = fadd half %a, %z471 ret half %b472}473 474define half @test_half_add_mul_contract(half %x, half %y, half %z) {475; GFX9-LABEL: test_half_add_mul_contract:476; GFX9: ; %bb.0: ; %.entry477; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)478; GFX9-NEXT: v_fma_f16 v0, v0, v1, v2479; GFX9-NEXT: s_setpc_b64 s[30:31]480;481; GFX9-CONTRACT-LABEL: test_half_add_mul_contract:482; GFX9-CONTRACT: ; %bb.0: ; %.entry483; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)484; GFX9-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2485; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]486;487; GFX9-DENORM-LABEL: test_half_add_mul_contract:488; GFX9-DENORM: ; %bb.0: ; %.entry489; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)490; GFX9-DENORM-NEXT: v_mad_legacy_f16 v0, v0, v1, v2491; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]492;493; GFX10-LABEL: test_half_add_mul_contract:494; GFX10: ; %bb.0: ; %.entry495; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)496; GFX10-NEXT: v_fma_f16 v0, v0, v1, v2497; GFX10-NEXT: s_setpc_b64 s[30:31]498;499; GFX10-CONTRACT-LABEL: test_half_add_mul_contract:500; GFX10-CONTRACT: ; %bb.0: ; %.entry501; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)502; GFX10-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2503; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]504;505; GFX10-DENORM-LABEL: test_half_add_mul_contract:506; GFX10-DENORM: ; %bb.0: ; %.entry507; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)508; GFX10-DENORM-NEXT: v_mul_f16_e32 v0, v0, v1509; GFX10-DENORM-NEXT: v_add_f16_e32 v0, v0, v2510; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]511; GFX9-UNSAFE-LABEL: test_half_add_mul_contract:512; GFX9-UNSAFE: ; %bb.0: ; %.entry513; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)514; GFX9-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2515; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]516; GFX10-UNSAFE-LABEL: test_half_add_mul_contract:517; GFX10-UNSAFE: ; %bb.0: ; %.entry518; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)519; GFX10-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2520; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]521.entry:522 %a = fmul contract half %x, %y523 %b = fadd contract half %a, %z524 ret half %b525}526 527define half @test_half_add_mul_rhs(half %x, half %y, half %z) {528; GFX9-LABEL: test_half_add_mul_rhs:529; GFX9: ; %bb.0: ; %.entry530; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)531; GFX9-NEXT: v_mul_f16_e32 v0, v0, v1532; GFX9-NEXT: v_add_f16_e32 v0, v2, v0533; GFX9-NEXT: s_setpc_b64 s[30:31]534;535; GFX9-CONTRACT-LABEL: test_half_add_mul_rhs:536; GFX9-CONTRACT: ; %bb.0: ; %.entry537; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)538; GFX9-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2539; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]540;541; GFX9-DENORM-LABEL: test_half_add_mul_rhs:542; GFX9-DENORM: ; %bb.0: ; %.entry543; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)544; GFX9-DENORM-NEXT: v_mad_legacy_f16 v0, v0, v1, v2545; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]546;547; GFX10-LABEL: test_half_add_mul_rhs:548; GFX10: ; %bb.0: ; %.entry549; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)550; GFX10-NEXT: v_mul_f16_e32 v0, v0, v1551; GFX10-NEXT: v_add_f16_e32 v0, v2, v0552; GFX10-NEXT: s_setpc_b64 s[30:31]553;554; GFX10-CONTRACT-LABEL: test_half_add_mul_rhs:555; GFX10-CONTRACT: ; %bb.0: ; %.entry556; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)557; GFX10-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2558; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]559;560; GFX10-DENORM-LABEL: test_half_add_mul_rhs:561; GFX10-DENORM: ; %bb.0: ; %.entry562; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)563; GFX10-DENORM-NEXT: v_mul_f16_e32 v0, v0, v1564; GFX10-DENORM-NEXT: v_add_f16_e32 v0, v2, v0565; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]566; GFX10-UNSAFE-LABEL: test_half_add_mul_rhs:567; GFX10-UNSAFE: ; %bb.0: ; %.entry568; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)569; GFX10-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2570; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]571.entry:572 %a = fmul half %x, %y573 %b = fadd half %z, %a574 ret half %b575}576 577define half @test_half_add_mul_rhs_contract(half %x, half %y, half %z) {578; GFX9-LABEL: test_half_add_mul_rhs_contract:579; GFX9: ; %bb.0: ; %.entry580; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)581; GFX9-NEXT: v_fma_f16 v0, v0, v1, v2582; GFX9-NEXT: s_setpc_b64 s[30:31]583;584; GFX9-CONTRACT-LABEL: test_half_add_mul_rhs_contract:585; GFX9-CONTRACT: ; %bb.0: ; %.entry586; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)587; GFX9-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2588; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]589;590; GFX9-DENORM-LABEL: test_half_add_mul_rhs_contract:591; GFX9-DENORM: ; %bb.0: ; %.entry592; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)593; GFX9-DENORM-NEXT: v_mad_legacy_f16 v0, v0, v1, v2594; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]595;596; GFX10-LABEL: test_half_add_mul_rhs_contract:597; GFX10: ; %bb.0: ; %.entry598; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)599; GFX10-NEXT: v_fma_f16 v0, v0, v1, v2600; GFX10-NEXT: s_setpc_b64 s[30:31]601;602; GFX10-CONTRACT-LABEL: test_half_add_mul_rhs_contract:603; GFX10-CONTRACT: ; %bb.0: ; %.entry604; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)605; GFX10-CONTRACT-NEXT: v_fma_f16 v0, v0, v1, v2606; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]607;608; GFX10-DENORM-LABEL: test_half_add_mul_rhs_contract:609; GFX10-DENORM: ; %bb.0: ; %.entry610; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)611; GFX10-DENORM-NEXT: v_mul_f16_e32 v0, v0, v1612; GFX10-DENORM-NEXT: v_add_f16_e32 v0, v2, v0613; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]614; GFX9-UNSAFE-LABEL: test_half_add_mul_rhs_contract:615; GFX9-UNSAFE: ; %bb.0: ; %.entry616; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)617; GFX9-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2618; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]619; GFX10-UNSAFE-LABEL: test_half_add_mul_rhs_contract:620; GFX10-UNSAFE: ; %bb.0: ; %.entry621; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)622; GFX10-UNSAFE-NEXT: v_fma_f16 v0, v0, v1, v2623; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]624.entry:625 %a = fmul contract half %x, %y626 %b = fadd contract half %z, %a627 ret half %b628}629 630define double @test_double_add_mul(double %x, double %y, double %z) {631; GFX9-LABEL: test_double_add_mul:632; GFX9: ; %bb.0: ; %.entry633; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)634; GFX9-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]635; GFX9-NEXT: v_add_f64 v[0:1], v[0:1], v[4:5]636; GFX9-NEXT: s_setpc_b64 s[30:31]637;638; GFX9-CONTRACT-LABEL: test_double_add_mul:639; GFX9-CONTRACT: ; %bb.0: ; %.entry640; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)641; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]642; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]643;644; GFX9-DENORM-LABEL: test_double_add_mul:645; GFX9-DENORM: ; %bb.0: ; %.entry646; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)647; GFX9-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]648; GFX9-DENORM-NEXT: v_add_f64 v[0:1], v[0:1], v[4:5]649; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]650;651; GFX10-LABEL: test_double_add_mul:652; GFX10: ; %bb.0: ; %.entry653; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)654; GFX10-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]655; GFX10-NEXT: v_add_f64 v[0:1], v[0:1], v[4:5]656; GFX10-NEXT: s_setpc_b64 s[30:31]657;658; GFX10-CONTRACT-LABEL: test_double_add_mul:659; GFX10-CONTRACT: ; %bb.0: ; %.entry660; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)661; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]662; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]663;664; GFX10-DENORM-LABEL: test_double_add_mul:665; GFX10-DENORM: ; %bb.0: ; %.entry666; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)667; GFX10-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]668; GFX10-DENORM-NEXT: v_add_f64 v[0:1], v[0:1], v[4:5]669; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]670.entry:671 %a = fmul double %x, %y672 %b = fadd double %a, %z673 ret double %b674}675 676define double @test_double_add_mul_contract(double %x, double %y, double %z) {677; GFX9-LABEL: test_double_add_mul_contract:678; GFX9: ; %bb.0: ; %.entry679; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)680; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]681; GFX9-NEXT: s_setpc_b64 s[30:31]682;683; GFX9-CONTRACT-LABEL: test_double_add_mul_contract:684; GFX9-CONTRACT: ; %bb.0: ; %.entry685; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)686; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]687; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]688;689; GFX9-DENORM-LABEL: test_double_add_mul_contract:690; GFX9-DENORM: ; %bb.0: ; %.entry691; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)692; GFX9-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]693; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]694;695; GFX10-LABEL: test_double_add_mul_contract:696; GFX10: ; %bb.0: ; %.entry697; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)698; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]699; GFX10-NEXT: s_setpc_b64 s[30:31]700;701; GFX10-CONTRACT-LABEL: test_double_add_mul_contract:702; GFX10-CONTRACT: ; %bb.0: ; %.entry703; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)704; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]705; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]706;707; GFX10-DENORM-LABEL: test_double_add_mul_contract:708; GFX10-DENORM: ; %bb.0: ; %.entry709; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)710; GFX10-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]711; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]712; GFX9-UNSAFE-LABEL: test_double_add_mul_contract:713; GFX9-UNSAFE: ; %bb.0: ; %.entry714; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)715; GFX9-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]716; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]717; GFX10-UNSAFE-LABEL: test_double_add_mul:718; GFX10-UNSAFE: ; %bb.0: ; %.entry719; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)720; GFX10-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]721; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]722.entry:723 %a = fmul contract double %x, %y724 %b = fadd contract double %a, %z725 ret double %b726}727 728define double @test_double_add_mul_rhs(double %x, double %y, double %z) {729; GFX9-LABEL: test_double_add_mul_rhs:730; GFX9: ; %bb.0: ; %.entry731; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)732; GFX9-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]733; GFX9-NEXT: v_add_f64 v[0:1], v[4:5], v[0:1]734; GFX9-NEXT: s_setpc_b64 s[30:31]735;736; GFX9-CONTRACT-LABEL: test_double_add_mul_rhs:737; GFX9-CONTRACT: ; %bb.0: ; %.entry738; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)739; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]740; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]741;742; GFX9-DENORM-LABEL: test_double_add_mul_rhs:743; GFX9-DENORM: ; %bb.0: ; %.entry744; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)745; GFX9-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]746; GFX9-DENORM-NEXT: v_add_f64 v[0:1], v[4:5], v[0:1]747; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]748;749; GFX10-LABEL: test_double_add_mul_rhs:750; GFX10: ; %bb.0: ; %.entry751; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)752; GFX10-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]753; GFX10-NEXT: v_add_f64 v[0:1], v[4:5], v[0:1]754; GFX10-NEXT: s_setpc_b64 s[30:31]755;756; GFX10-CONTRACT-LABEL: test_double_add_mul_rhs:757; GFX10-CONTRACT: ; %bb.0: ; %.entry758; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)759; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]760; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]761;762; GFX10-DENORM-LABEL: test_double_add_mul_rhs:763; GFX10-DENORM: ; %bb.0: ; %.entry764; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)765; GFX10-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[2:3]766; GFX10-DENORM-NEXT: v_add_f64 v[0:1], v[4:5], v[0:1]767; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]768.entry:769 %a = fmul double %x, %y770 %b = fadd double %z, %a771 ret double %b772}773 774define double @test_double_add_mul_rhs_contract(double %x, double %y, double %z) {775; GFX9-LABEL: test_double_add_mul_rhs_contract:776; GFX9: ; %bb.0: ; %.entry777; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)778; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]779; GFX9-NEXT: s_setpc_b64 s[30:31]780;781; GFX9-CONTRACT-LABEL: test_double_add_mul_rhs_contract:782; GFX9-CONTRACT: ; %bb.0: ; %.entry783; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)784; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]785; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]786;787; GFX9-DENORM-LABEL: test_double_add_mul_rhs_contract:788; GFX9-DENORM: ; %bb.0: ; %.entry789; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)790; GFX9-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]791; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]792;793; GFX10-LABEL: test_double_add_mul_rhs_contract:794; GFX10: ; %bb.0: ; %.entry795; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)796; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]797; GFX10-NEXT: s_setpc_b64 s[30:31]798;799; GFX10-CONTRACT-LABEL: test_double_add_mul_rhs_contract:800; GFX10-CONTRACT: ; %bb.0: ; %.entry801; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)802; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]803; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]804;805; GFX10-DENORM-LABEL: test_double_add_mul_rhs_contract:806; GFX10-DENORM: ; %bb.0: ; %.entry807; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)808; GFX10-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]809; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]810; GFX9-UNSAFE-LABEL: test_double_add_mul_rhs_contract:811; GFX9-UNSAFE: ; %bb.0: ; %.entry812; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)813; GFX9-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]814; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]815; GFX10-UNSAFE-LABEL: test_double_add_mul_rhs_contract:816; GFX10-UNSAFE: ; %bb.0: ; %.entry817; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)818; GFX10-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[2:3], v[4:5]819; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]820.entry:821 %a = fmul contract double %x, %y822 %b = fadd contract double %z, %a823 ret double %b824}825 826define <4 x float> @test_4xfloat_add_mul(<4 x float> %x, <4 x float> %y, <4 x float> %z) {827; GFX9-LABEL: test_4xfloat_add_mul:828; GFX9: ; %bb.0: ; %.entry829; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)830; GFX9-NEXT: v_mul_f32_e32 v0, v0, v4831; GFX9-NEXT: v_mul_f32_e32 v1, v1, v5832; GFX9-NEXT: v_mul_f32_e32 v2, v2, v6833; GFX9-NEXT: v_mul_f32_e32 v3, v3, v7834; GFX9-NEXT: v_add_f32_e32 v0, v0, v8835; GFX9-NEXT: v_add_f32_e32 v1, v1, v9836; GFX9-NEXT: v_add_f32_e32 v2, v2, v10837; GFX9-NEXT: v_add_f32_e32 v3, v3, v11838; GFX9-NEXT: s_setpc_b64 s[30:31]839;840; GFX9-CONTRACT-LABEL: test_4xfloat_add_mul:841; GFX9-CONTRACT: ; %bb.0: ; %.entry842; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)843; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v4, v8844; GFX9-CONTRACT-NEXT: v_fma_f32 v1, v1, v5, v9845; GFX9-CONTRACT-NEXT: v_fma_f32 v2, v2, v6, v10846; GFX9-CONTRACT-NEXT: v_fma_f32 v3, v3, v7, v11847; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]848;849; GFX9-DENORM-LABEL: test_4xfloat_add_mul:850; GFX9-DENORM: ; %bb.0: ; %.entry851; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)852; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v4, v8853; GFX9-DENORM-NEXT: v_mad_f32 v1, v1, v5, v9854; GFX9-DENORM-NEXT: v_mad_f32 v2, v2, v6, v10855; GFX9-DENORM-NEXT: v_mad_f32 v3, v3, v7, v11856; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]857;858; GFX10-LABEL: test_4xfloat_add_mul:859; GFX10: ; %bb.0: ; %.entry860; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)861; GFX10-NEXT: v_mul_f32_e32 v0, v0, v4862; GFX10-NEXT: v_mul_f32_e32 v1, v1, v5863; GFX10-NEXT: v_mul_f32_e32 v2, v2, v6864; GFX10-NEXT: v_mul_f32_e32 v3, v3, v7865; GFX10-NEXT: v_add_f32_e32 v0, v0, v8866; GFX10-NEXT: v_add_f32_e32 v1, v1, v9867; GFX10-NEXT: v_add_f32_e32 v2, v2, v10868; GFX10-NEXT: v_add_f32_e32 v3, v3, v11869; GFX10-NEXT: s_setpc_b64 s[30:31]870;871; GFX10-CONTRACT-LABEL: test_4xfloat_add_mul:872; GFX10-CONTRACT: ; %bb.0: ; %.entry873; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)874; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v4, v8875; GFX10-CONTRACT-NEXT: v_fma_f32 v1, v1, v5, v9876; GFX10-CONTRACT-NEXT: v_fma_f32 v2, v2, v6, v10877; GFX10-CONTRACT-NEXT: v_fma_f32 v3, v3, v7, v11878; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]879;880; GFX10-DENORM-LABEL: test_4xfloat_add_mul:881; GFX10-DENORM: ; %bb.0: ; %.entry882; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)883; GFX10-DENORM-NEXT: v_mad_f32 v0, v0, v4, v8884; GFX10-DENORM-NEXT: v_mad_f32 v1, v1, v5, v9885; GFX10-DENORM-NEXT: v_mad_f32 v2, v2, v6, v10886; GFX10-DENORM-NEXT: v_mad_f32 v3, v3, v7, v11887; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]888.entry:889 %a = fmul <4 x float> %x, %y890 %b = fadd <4 x float> %a, %z891 ret <4 x float> %b892}893 894define <4 x float> @test_4xfloat_add_mul_contract(<4 x float> %x, <4 x float> %y, <4 x float> %z) {895; GFX9-LABEL: test_4xfloat_add_mul_contract:896; GFX9: ; %bb.0: ; %.entry897; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)898; GFX9-NEXT: v_fma_f32 v0, v0, v4, v8899; GFX9-NEXT: v_fma_f32 v1, v1, v5, v9900; GFX9-NEXT: v_fma_f32 v2, v2, v6, v10901; GFX9-NEXT: v_fma_f32 v3, v3, v7, v11902; GFX9-NEXT: s_setpc_b64 s[30:31]903;904; GFX9-CONTRACT-LABEL: test_4xfloat_add_mul_contract:905; GFX9-CONTRACT: ; %bb.0: ; %.entry906; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)907; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v4, v8908; GFX9-CONTRACT-NEXT: v_fma_f32 v1, v1, v5, v9909; GFX9-CONTRACT-NEXT: v_fma_f32 v2, v2, v6, v10910; GFX9-CONTRACT-NEXT: v_fma_f32 v3, v3, v7, v11911; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]912;913; GFX9-DENORM-LABEL: test_4xfloat_add_mul_contract:914; GFX9-DENORM: ; %bb.0: ; %.entry915; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)916; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v4, v8917; GFX9-DENORM-NEXT: v_mad_f32 v1, v1, v5, v9918; GFX9-DENORM-NEXT: v_mad_f32 v2, v2, v6, v10919; GFX9-DENORM-NEXT: v_mad_f32 v3, v3, v7, v11920; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]921;922; GFX10-LABEL: test_4xfloat_add_mul_contract:923; GFX10: ; %bb.0: ; %.entry924; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)925; GFX10-NEXT: v_fma_f32 v0, v0, v4, v8926; GFX10-NEXT: v_fma_f32 v1, v1, v5, v9927; GFX10-NEXT: v_fma_f32 v2, v2, v6, v10928; GFX10-NEXT: v_fma_f32 v3, v3, v7, v11929; GFX10-NEXT: s_setpc_b64 s[30:31]930;931; GFX10-CONTRACT-LABEL: test_4xfloat_add_mul_contract:932; GFX10-CONTRACT: ; %bb.0: ; %.entry933; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)934; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v4, v8935; GFX10-CONTRACT-NEXT: v_fma_f32 v1, v1, v5, v9936; GFX10-CONTRACT-NEXT: v_fma_f32 v2, v2, v6, v10937; GFX10-CONTRACT-NEXT: v_fma_f32 v3, v3, v7, v11938; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]939;940; GFX10-DENORM-LABEL: test_4xfloat_add_mul_contract:941; GFX10-DENORM: ; %bb.0: ; %.entry942; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)943; GFX10-DENORM-NEXT: v_fma_f32 v0, v0, v4, v8944; GFX10-DENORM-NEXT: v_fma_f32 v1, v1, v5, v9945; GFX10-DENORM-NEXT: v_fma_f32 v2, v2, v6, v10946; GFX10-DENORM-NEXT: v_fma_f32 v3, v3, v7, v11947; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]948; GFX9-UNSAFE-LABEL: test_4xfloat_add_mul_contract:949; GFX9-UNSAFE: ; %bb.0: ; %.entry950; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)951; GFX9-UNSAFE-NEXT: v_fma_f32 v0, v0, v4, v8952; GFX9-UNSAFE-NEXT: v_fma_f32 v1, v1, v5, v9953; GFX9-UNSAFE-NEXT: v_fma_f32 v2, v2, v6, v10954; GFX9-UNSAFE-NEXT: v_fma_f32 v3, v3, v7, v11955; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]956; GFX10-UNSAFE-LABEL: test_4xfloat_add_mul_contract:957; GFX10-UNSAFE: ; %bb.0: ; %.entry958; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)959; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v4, v8960; GFX10-UNSAFE-NEXT: v_fma_f32 v1, v1, v5, v9961; GFX10-UNSAFE-NEXT: v_fma_f32 v2, v2, v6, v10962; GFX10-UNSAFE-NEXT: v_fma_f32 v3, v3, v7, v11963; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]964.entry:965 %a = fmul contract <4 x float> %x, %y966 %b = fadd contract <4 x float> %a, %z967 ret <4 x float> %b968}969 970define <3 x float> @test_3xfloat_add_mul_rhs(<3 x float> %x, <3 x float> %y, <3 x float> %z) {971; GFX9-LABEL: test_3xfloat_add_mul_rhs:972; GFX9: ; %bb.0: ; %.entry973; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)974; GFX9-NEXT: v_mul_f32_e32 v0, v0, v3975; GFX9-NEXT: v_mul_f32_e32 v1, v1, v4976; GFX9-NEXT: v_mul_f32_e32 v2, v2, v5977; GFX9-NEXT: v_add_f32_e32 v0, v6, v0978; GFX9-NEXT: v_add_f32_e32 v1, v7, v1979; GFX9-NEXT: v_add_f32_e32 v2, v8, v2980; GFX9-NEXT: s_setpc_b64 s[30:31]981;982; GFX9-CONTRACT-LABEL: test_3xfloat_add_mul_rhs:983; GFX9-CONTRACT: ; %bb.0: ; %.entry984; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)985; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v3, v6986; GFX9-CONTRACT-NEXT: v_fma_f32 v1, v1, v4, v7987; GFX9-CONTRACT-NEXT: v_fma_f32 v2, v2, v5, v8988; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]989;990; GFX9-DENORM-LABEL: test_3xfloat_add_mul_rhs:991; GFX9-DENORM: ; %bb.0: ; %.entry992; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)993; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v3, v6994; GFX9-DENORM-NEXT: v_mad_f32 v1, v1, v4, v7995; GFX9-DENORM-NEXT: v_mad_f32 v2, v2, v5, v8996; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]997;998; GFX10-LABEL: test_3xfloat_add_mul_rhs:999; GFX10: ; %bb.0: ; %.entry1000; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1001; GFX10-NEXT: v_mul_f32_e32 v0, v0, v31002; GFX10-NEXT: v_mul_f32_e32 v1, v1, v41003; GFX10-NEXT: v_mul_f32_e32 v2, v2, v51004; GFX10-NEXT: v_add_f32_e32 v0, v6, v01005; GFX10-NEXT: v_add_f32_e32 v1, v7, v11006; GFX10-NEXT: v_add_f32_e32 v2, v8, v21007; GFX10-NEXT: s_setpc_b64 s[30:31]1008;1009; GFX10-CONTRACT-LABEL: test_3xfloat_add_mul_rhs:1010; GFX10-CONTRACT: ; %bb.0: ; %.entry1011; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1012; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v3, v61013; GFX10-CONTRACT-NEXT: v_fma_f32 v1, v1, v4, v71014; GFX10-CONTRACT-NEXT: v_fma_f32 v2, v2, v5, v81015; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1016;1017; GFX10-DENORM-LABEL: test_3xfloat_add_mul_rhs:1018; GFX10-DENORM: ; %bb.0: ; %.entry1019; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1020; GFX10-DENORM-NEXT: v_mad_f32 v0, v0, v3, v61021; GFX10-DENORM-NEXT: v_mad_f32 v1, v1, v4, v71022; GFX10-DENORM-NEXT: v_mad_f32 v2, v2, v5, v81023; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1024.entry:1025 %a = fmul <3 x float> %x, %y1026 %b = fadd <3 x float> %z, %a1027 ret <3 x float> %b1028}1029 1030define <3 x float> @test_3xfloat_add_mul_rhs_contract(<3 x float> %x, <3 x float> %y, <3 x float> %z) {1031; GFX9-LABEL: test_3xfloat_add_mul_rhs_contract:1032; GFX9: ; %bb.0: ; %.entry1033; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1034; GFX9-NEXT: v_fma_f32 v0, v0, v3, v61035; GFX9-NEXT: v_fma_f32 v1, v1, v4, v71036; GFX9-NEXT: v_fma_f32 v2, v2, v5, v81037; GFX9-NEXT: s_setpc_b64 s[30:31]1038;1039; GFX9-CONTRACT-LABEL: test_3xfloat_add_mul_rhs_contract:1040; GFX9-CONTRACT: ; %bb.0: ; %.entry1041; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1042; GFX9-CONTRACT-NEXT: v_fma_f32 v0, v0, v3, v61043; GFX9-CONTRACT-NEXT: v_fma_f32 v1, v1, v4, v71044; GFX9-CONTRACT-NEXT: v_fma_f32 v2, v2, v5, v81045; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1046;1047; GFX9-DENORM-LABEL: test_3xfloat_add_mul_rhs_contract:1048; GFX9-DENORM: ; %bb.0: ; %.entry1049; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1050; GFX9-DENORM-NEXT: v_mad_f32 v0, v0, v3, v61051; GFX9-DENORM-NEXT: v_mad_f32 v1, v1, v4, v71052; GFX9-DENORM-NEXT: v_mad_f32 v2, v2, v5, v81053; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1054;1055; GFX10-LABEL: test_3xfloat_add_mul_rhs_contract:1056; GFX10: ; %bb.0: ; %.entry1057; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1058; GFX10-NEXT: v_fma_f32 v0, v0, v3, v61059; GFX10-NEXT: v_fma_f32 v1, v1, v4, v71060; GFX10-NEXT: v_fma_f32 v2, v2, v5, v81061; GFX10-NEXT: s_setpc_b64 s[30:31]1062;1063; GFX10-CONTRACT-LABEL: test_3xfloat_add_mul_rhs_contract:1064; GFX10-CONTRACT: ; %bb.0: ; %.entry1065; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1066; GFX10-CONTRACT-NEXT: v_fma_f32 v0, v0, v3, v61067; GFX10-CONTRACT-NEXT: v_fma_f32 v1, v1, v4, v71068; GFX10-CONTRACT-NEXT: v_fma_f32 v2, v2, v5, v81069; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1070;1071; GFX10-DENORM-LABEL: test_3xfloat_add_mul_rhs_contract:1072; GFX10-DENORM: ; %bb.0: ; %.entry1073; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1074; GFX10-DENORM-NEXT: v_fma_f32 v0, v0, v3, v61075; GFX10-DENORM-NEXT: v_fma_f32 v1, v1, v4, v71076; GFX10-DENORM-NEXT: v_fma_f32 v2, v2, v5, v81077; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1078; GFX9-UNSAFE-LABEL: test_3xfloat_add_mul_rhs_contract:1079; GFX9-UNSAFE: ; %bb.0: ; %.entry1080; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1081; GFX9-UNSAFE-NEXT: v_fma_f32 v0, v0, v3, v61082; GFX9-UNSAFE-NEXT: v_fma_f32 v1, v1, v4, v71083; GFX9-UNSAFE-NEXT: v_fma_f32 v2, v2, v5, v81084; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]1085; GFX10-UNSAFE-LABEL: test_3xfloat_add_mul_rhs_contract:1086; GFX10-UNSAFE: ; %bb.0: ; %.entry1087; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1088; GFX10-UNSAFE-NEXT: v_fma_f32 v0, v0, v3, v61089; GFX10-UNSAFE-NEXT: v_fma_f32 v1, v1, v4, v71090; GFX10-UNSAFE-NEXT: v_fma_f32 v2, v2, v5, v81091; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1092.entry:1093 %a = fmul contract <3 x float> %x, %y1094 %b = fadd contract <3 x float> %z, %a1095 ret <3 x float> %b1096}1097 1098define <4 x half> @test_4xhalf_add_mul(<4 x half> %x, <4 x half> %y, <4 x half> %z) {1099; GFX9-LABEL: test_4xhalf_add_mul:1100; GFX9: ; %bb.0: ; %.entry1101; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1102; GFX9-NEXT: v_pk_mul_f16 v0, v0, v21103; GFX9-NEXT: v_pk_mul_f16 v1, v1, v31104; GFX9-NEXT: v_pk_add_f16 v0, v0, v41105; GFX9-NEXT: v_pk_add_f16 v1, v1, v51106; GFX9-NEXT: s_setpc_b64 s[30:31]1107;1108; GFX9-CONTRACT-LABEL: test_4xhalf_add_mul:1109; GFX9-CONTRACT: ; %bb.0: ; %.entry1110; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1111; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41112; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51113; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1114;1115; GFX9-DENORM-LABEL: test_4xhalf_add_mul:1116; GFX9-DENORM: ; %bb.0: ; %.entry1117; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1118; GFX9-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21119; GFX9-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31120; GFX9-DENORM-NEXT: v_pk_add_f16 v0, v0, v41121; GFX9-DENORM-NEXT: v_pk_add_f16 v1, v1, v51122; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1123;1124; GFX10-LABEL: test_4xhalf_add_mul:1125; GFX10: ; %bb.0: ; %.entry1126; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1127; GFX10-NEXT: v_pk_mul_f16 v0, v0, v21128; GFX10-NEXT: v_pk_mul_f16 v1, v1, v31129; GFX10-NEXT: v_pk_add_f16 v0, v0, v41130; GFX10-NEXT: v_pk_add_f16 v1, v1, v51131; GFX10-NEXT: s_setpc_b64 s[30:31]1132;1133; GFX10-CONTRACT-LABEL: test_4xhalf_add_mul:1134; GFX10-CONTRACT: ; %bb.0: ; %.entry1135; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1136; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41137; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51138; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1139;1140; GFX10-DENORM-LABEL: test_4xhalf_add_mul:1141; GFX10-DENORM: ; %bb.0: ; %.entry1142; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1143; GFX10-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21144; GFX10-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31145; GFX10-DENORM-NEXT: v_pk_add_f16 v0, v0, v41146; GFX10-DENORM-NEXT: v_pk_add_f16 v1, v1, v51147; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1148; GFX10-UNSAFE-LABEL: test_4xhalf_add_mul:1149; GFX10-UNSAFE: ; %bb.0: ; %.entry1150; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1151; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v0, v0, v2, v41152; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v1, v1, v3, v51153; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1154.entry:1155 %a = fmul <4 x half> %x, %y1156 %b = fadd <4 x half> %a, %z1157 ret <4 x half> %b1158}1159 1160define <4 x half> @test_4xhalf_add_mul_contract(<4 x half> %x, <4 x half> %y, <4 x half> %z) {1161; GFX9-LABEL: test_4xhalf_add_mul_contract:1162; GFX9: ; %bb.0: ; %.entry1163; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1164; GFX9-NEXT: v_pk_fma_f16 v0, v0, v2, v41165; GFX9-NEXT: v_pk_fma_f16 v1, v1, v3, v51166; GFX9-NEXT: s_setpc_b64 s[30:31]1167;1168; GFX9-CONTRACT-LABEL: test_4xhalf_add_mul_contract:1169; GFX9-CONTRACT: ; %bb.0: ; %.entry1170; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1171; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41172; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51173; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1174;1175; GFX9-DENORM-LABEL: test_4xhalf_add_mul_contract:1176; GFX9-DENORM: ; %bb.0: ; %.entry1177; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1178; GFX9-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21179; GFX9-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31180; GFX9-DENORM-NEXT: v_pk_add_f16 v0, v0, v41181; GFX9-DENORM-NEXT: v_pk_add_f16 v1, v1, v51182; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1183;1184; GFX10-LABEL: test_4xhalf_add_mul_contract:1185; GFX10: ; %bb.0: ; %.entry1186; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1187; GFX10-NEXT: v_pk_fma_f16 v0, v0, v2, v41188; GFX10-NEXT: v_pk_fma_f16 v1, v1, v3, v51189; GFX10-NEXT: s_setpc_b64 s[30:31]1190;1191; GFX10-CONTRACT-LABEL: test_4xhalf_add_mul_contract:1192; GFX10-CONTRACT: ; %bb.0: ; %.entry1193; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1194; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41195; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51196; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1197;1198; GFX10-DENORM-LABEL: test_4xhalf_add_mul_contract:1199; GFX10-DENORM: ; %bb.0: ; %.entry1200; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1201; GFX10-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21202; GFX10-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31203; GFX10-DENORM-NEXT: v_pk_add_f16 v0, v0, v41204; GFX10-DENORM-NEXT: v_pk_add_f16 v1, v1, v51205; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1206; GFX9-UNSAFE-LABEL: test_4xhalf_add_mul_contract:1207; GFX9-UNSAFE: ; %bb.0: ; %.entry1208; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1209; GFX9-UNSAFE-NEXT: v_pk_fma_f16 v0, v0, v2, v41210; GFX9-UNSAFE-NEXT: v_pk_fma_f16 v1, v1, v3, v51211; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]1212; GFX10-UNSAFE-LABEL: test_4xhalf_add_mul_contract:1213; GFX10-UNSAFE: ; %bb.0: ; %.entry1214; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1215; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v0, v0, v2, v41216; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v1, v1, v3, v51217; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1218.entry:1219 %a = fmul contract <4 x half> %x, %y1220 %b = fadd contract <4 x half> %a, %z1221 ret <4 x half> %b1222}1223 1224define <3 x half> @test_3xhalf_add_mul_rhs(<3 x half> %x, <3 x half> %y, <3 x half> %z) {1225; GFX9-LABEL: test_3xhalf_add_mul_rhs:1226; GFX9: ; %bb.0: ; %.entry1227; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1228; GFX9-NEXT: v_pk_mul_f16 v0, v0, v21229; GFX9-NEXT: v_pk_mul_f16 v1, v1, v31230; GFX9-NEXT: v_pk_add_f16 v0, v4, v01231; GFX9-NEXT: v_pk_add_f16 v1, v5, v11232; GFX9-NEXT: s_setpc_b64 s[30:31]1233;1234; GFX9-CONTRACT-LABEL: test_3xhalf_add_mul_rhs:1235; GFX9-CONTRACT: ; %bb.0: ; %.entry1236; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1237; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41238; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51239; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1240;1241; GFX9-DENORM-LABEL: test_3xhalf_add_mul_rhs:1242; GFX9-DENORM: ; %bb.0: ; %.entry1243; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1244; GFX9-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21245; GFX9-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31246; GFX9-DENORM-NEXT: v_pk_add_f16 v0, v4, v01247; GFX9-DENORM-NEXT: v_pk_add_f16 v1, v5, v11248; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1249;1250; GFX10-LABEL: test_3xhalf_add_mul_rhs:1251; GFX10: ; %bb.0: ; %.entry1252; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1253; GFX10-NEXT: v_pk_mul_f16 v0, v0, v21254; GFX10-NEXT: v_pk_mul_f16 v1, v1, v31255; GFX10-NEXT: v_pk_add_f16 v0, v4, v01256; GFX10-NEXT: v_pk_add_f16 v1, v5, v11257; GFX10-NEXT: s_setpc_b64 s[30:31]1258;1259; GFX10-CONTRACT-LABEL: test_3xhalf_add_mul_rhs:1260; GFX10-CONTRACT: ; %bb.0: ; %.entry1261; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1262; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41263; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51264; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1265;1266; GFX10-DENORM-LABEL: test_3xhalf_add_mul_rhs:1267; GFX10-DENORM: ; %bb.0: ; %.entry1268; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1269; GFX10-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21270; GFX10-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31271; GFX10-DENORM-NEXT: v_pk_add_f16 v0, v4, v01272; GFX10-DENORM-NEXT: v_pk_add_f16 v1, v5, v11273; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1274.entry:1275 %a = fmul <3 x half> %x, %y1276 %b = fadd <3 x half> %z, %a1277 ret <3 x half> %b1278}1279 1280define <3 x half> @test_3xhalf_add_mul_rhs_contract(<3 x half> %x, <3 x half> %y, <3 x half> %z) {1281; GFX9-LABEL: test_3xhalf_add_mul_rhs_contract:1282; GFX9: ; %bb.0: ; %.entry1283; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1284; GFX9-NEXT: v_pk_fma_f16 v0, v0, v2, v41285; GFX9-NEXT: v_pk_fma_f16 v1, v1, v3, v51286; GFX9-NEXT: s_setpc_b64 s[30:31]1287;1288; GFX9-CONTRACT-LABEL: test_3xhalf_add_mul_rhs_contract:1289; GFX9-CONTRACT: ; %bb.0: ; %.entry1290; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1291; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41292; GFX9-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51293; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1294;1295; GFX9-DENORM-LABEL: test_3xhalf_add_mul_rhs_contract:1296; GFX9-DENORM: ; %bb.0: ; %.entry1297; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1298; GFX9-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21299; GFX9-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31300; GFX9-DENORM-NEXT: v_pk_add_f16 v0, v4, v01301; GFX9-DENORM-NEXT: v_pk_add_f16 v1, v5, v11302; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1303;1304; GFX10-LABEL: test_3xhalf_add_mul_rhs_contract:1305; GFX10: ; %bb.0: ; %.entry1306; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1307; GFX10-NEXT: v_pk_fma_f16 v0, v0, v2, v41308; GFX10-NEXT: v_pk_fma_f16 v1, v1, v3, v51309; GFX10-NEXT: s_setpc_b64 s[30:31]1310;1311; GFX10-CONTRACT-LABEL: test_3xhalf_add_mul_rhs_contract:1312; GFX10-CONTRACT: ; %bb.0: ; %.entry1313; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1314; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v0, v0, v2, v41315; GFX10-CONTRACT-NEXT: v_pk_fma_f16 v1, v1, v3, v51316; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1317;1318; GFX10-DENORM-LABEL: test_3xhalf_add_mul_rhs_contract:1319; GFX10-DENORM: ; %bb.0: ; %.entry1320; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1321; GFX10-DENORM-NEXT: v_pk_mul_f16 v0, v0, v21322; GFX10-DENORM-NEXT: v_pk_mul_f16 v1, v1, v31323; GFX10-DENORM-NEXT: v_pk_add_f16 v0, v4, v01324; GFX10-DENORM-NEXT: v_pk_add_f16 v1, v5, v11325; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1326; GFX9-UNSAFE-LABEL: test_3xhalf_add_mul_rhs_contract:1327; GFX9-UNSAFE: ; %bb.0: ; %.entry1328; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1329; GFX9-UNSAFE-NEXT: v_pk_fma_f16 v0, v0, v2, v41330; GFX9-UNSAFE-NEXT: v_pk_fma_f16 v1, v1, v3, v51331; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]1332; GFX10-UNSAFE-LABEL: test_3xhalf_add_mul_rhs_contract:1333; GFX10-UNSAFE: ; %bb.0: ; %.entry1334; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1335; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v0, v0, v2, v41336; GFX10-UNSAFE-NEXT: v_pk_fma_f16 v1, v1, v3, v51337; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1338.entry:1339 %a = fmul contract <3 x half> %x, %y1340 %b = fadd contract <3 x half> %z, %a1341 ret <3 x half> %b1342}1343 1344define <4 x double> @test_4xdouble_add_mul(<4 x double> %x, <4 x double> %y, <4 x double> %z) {1345; GFX9-LABEL: test_4xdouble_add_mul:1346; GFX9: ; %bb.0: ; %.entry1347; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1348; GFX9-NEXT: v_mul_f64 v[0:1], v[0:1], v[8:9]1349; GFX9-NEXT: v_mul_f64 v[2:3], v[2:3], v[10:11]1350; GFX9-NEXT: v_mul_f64 v[4:5], v[4:5], v[12:13]1351; GFX9-NEXT: v_mul_f64 v[6:7], v[6:7], v[14:15]1352; GFX9-NEXT: v_add_f64 v[0:1], v[0:1], v[16:17]1353; GFX9-NEXT: v_add_f64 v[2:3], v[2:3], v[18:19]1354; GFX9-NEXT: v_add_f64 v[4:5], v[4:5], v[20:21]1355; GFX9-NEXT: v_add_f64 v[6:7], v[6:7], v[22:23]1356; GFX9-NEXT: s_setpc_b64 s[30:31]1357;1358; GFX9-CONTRACT-LABEL: test_4xdouble_add_mul:1359; GFX9-CONTRACT: ; %bb.0: ; %.entry1360; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1361; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1362; GFX9-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1363; GFX9-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1364; GFX9-CONTRACT-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1365; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1366;1367; GFX9-DENORM-LABEL: test_4xdouble_add_mul:1368; GFX9-DENORM: ; %bb.0: ; %.entry1369; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1370; GFX9-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[8:9]1371; GFX9-DENORM-NEXT: v_mul_f64 v[2:3], v[2:3], v[10:11]1372; GFX9-DENORM-NEXT: v_mul_f64 v[4:5], v[4:5], v[12:13]1373; GFX9-DENORM-NEXT: v_mul_f64 v[6:7], v[6:7], v[14:15]1374; GFX9-DENORM-NEXT: v_add_f64 v[0:1], v[0:1], v[16:17]1375; GFX9-DENORM-NEXT: v_add_f64 v[2:3], v[2:3], v[18:19]1376; GFX9-DENORM-NEXT: v_add_f64 v[4:5], v[4:5], v[20:21]1377; GFX9-DENORM-NEXT: v_add_f64 v[6:7], v[6:7], v[22:23]1378; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1379;1380; GFX10-LABEL: test_4xdouble_add_mul:1381; GFX10: ; %bb.0: ; %.entry1382; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1383; GFX10-NEXT: v_mul_f64 v[0:1], v[0:1], v[8:9]1384; GFX10-NEXT: v_mul_f64 v[2:3], v[2:3], v[10:11]1385; GFX10-NEXT: v_mul_f64 v[4:5], v[4:5], v[12:13]1386; GFX10-NEXT: v_mul_f64 v[6:7], v[6:7], v[14:15]1387; GFX10-NEXT: v_add_f64 v[0:1], v[0:1], v[16:17]1388; GFX10-NEXT: v_add_f64 v[2:3], v[2:3], v[18:19]1389; GFX10-NEXT: v_add_f64 v[4:5], v[4:5], v[20:21]1390; GFX10-NEXT: v_add_f64 v[6:7], v[6:7], v[22:23]1391; GFX10-NEXT: s_setpc_b64 s[30:31]1392;1393; GFX10-CONTRACT-LABEL: test_4xdouble_add_mul:1394; GFX10-CONTRACT: ; %bb.0: ; %.entry1395; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1396; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1397; GFX10-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1398; GFX10-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1399; GFX10-CONTRACT-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1400; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1401;1402; GFX10-DENORM-LABEL: test_4xdouble_add_mul:1403; GFX10-DENORM: ; %bb.0: ; %.entry1404; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1405; GFX10-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[8:9]1406; GFX10-DENORM-NEXT: v_mul_f64 v[2:3], v[2:3], v[10:11]1407; GFX10-DENORM-NEXT: v_mul_f64 v[4:5], v[4:5], v[12:13]1408; GFX10-DENORM-NEXT: v_mul_f64 v[6:7], v[6:7], v[14:15]1409; GFX10-DENORM-NEXT: v_add_f64 v[0:1], v[0:1], v[16:17]1410; GFX10-DENORM-NEXT: v_add_f64 v[2:3], v[2:3], v[18:19]1411; GFX10-DENORM-NEXT: v_add_f64 v[4:5], v[4:5], v[20:21]1412; GFX10-DENORM-NEXT: v_add_f64 v[6:7], v[6:7], v[22:23]1413; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1414; GFX9-UNSAFE-LABEL: test_4xdouble_add_mul:1415; GFX9-UNSAFE: ; %bb.0: ; %.entry1416; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1417; GFX9-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1418; GFX9-UNSAFE-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1419; GFX9-UNSAFE-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1420; GFX9-UNSAFE-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1421; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]1422; GFX10-UNSAFE-LABEL: test_4xdouble_add_mul:1423; GFX10-UNSAFE: ; %bb.0: ; %.entry1424; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1425; GFX10-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1426; GFX10-UNSAFE-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1427; GFX10-UNSAFE-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1428; GFX10-UNSAFE-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1429; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1430.entry:1431 %a = fmul <4 x double> %x, %y1432 %b = fadd <4 x double> %a, %z1433 ret <4 x double> %b1434}1435 1436define <4 x double> @test_4xdouble_add_mul_contract(<4 x double> %x, <4 x double> %y, <4 x double> %z) {1437; GFX9-LABEL: test_4xdouble_add_mul_contract:1438; GFX9: ; %bb.0: ; %.entry1439; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1440; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1441; GFX9-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1442; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1443; GFX9-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1444; GFX9-NEXT: s_setpc_b64 s[30:31]1445;1446; GFX9-CONTRACT-LABEL: test_4xdouble_add_mul_contract:1447; GFX9-CONTRACT: ; %bb.0: ; %.entry1448; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1449; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1450; GFX9-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1451; GFX9-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1452; GFX9-CONTRACT-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1453; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1454;1455; GFX9-DENORM-LABEL: test_4xdouble_add_mul_contract:1456; GFX9-DENORM: ; %bb.0: ; %.entry1457; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1458; GFX9-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1459; GFX9-DENORM-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1460; GFX9-DENORM-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1461; GFX9-DENORM-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1462; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1463;1464; GFX10-LABEL: test_4xdouble_add_mul_contract:1465; GFX10: ; %bb.0: ; %.entry1466; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1467; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1468; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1469; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1470; GFX10-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1471; GFX10-NEXT: s_setpc_b64 s[30:31]1472;1473; GFX10-CONTRACT-LABEL: test_4xdouble_add_mul_contract:1474; GFX10-CONTRACT: ; %bb.0: ; %.entry1475; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1476; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1477; GFX10-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1478; GFX10-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1479; GFX10-CONTRACT-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1480; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1481;1482; GFX10-DENORM-LABEL: test_4xdouble_add_mul_contract:1483; GFX10-DENORM: ; %bb.0: ; %.entry1484; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1485; GFX10-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[8:9], v[16:17]1486; GFX10-DENORM-NEXT: v_fma_f64 v[2:3], v[2:3], v[10:11], v[18:19]1487; GFX10-DENORM-NEXT: v_fma_f64 v[4:5], v[4:5], v[12:13], v[20:21]1488; GFX10-DENORM-NEXT: v_fma_f64 v[6:7], v[6:7], v[14:15], v[22:23]1489; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1490.entry:1491 %a = fmul contract <4 x double> %x, %y1492 %b = fadd contract <4 x double> %a, %z1493 ret <4 x double> %b1494}1495 1496define <3 x double> @test_3xdouble_add_mul_rhs(<3 x double> %x, <3 x double> %y, <3 x double> %z) {1497; GFX9-LABEL: test_3xdouble_add_mul_rhs:1498; GFX9: ; %bb.0: ; %.entry1499; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1500; GFX9-NEXT: v_mul_f64 v[0:1], v[0:1], v[6:7]1501; GFX9-NEXT: v_mul_f64 v[2:3], v[2:3], v[8:9]1502; GFX9-NEXT: v_mul_f64 v[4:5], v[4:5], v[10:11]1503; GFX9-NEXT: v_add_f64 v[0:1], v[12:13], v[0:1]1504; GFX9-NEXT: v_add_f64 v[2:3], v[14:15], v[2:3]1505; GFX9-NEXT: v_add_f64 v[4:5], v[16:17], v[4:5]1506; GFX9-NEXT: s_setpc_b64 s[30:31]1507;1508; GFX9-CONTRACT-LABEL: test_3xdouble_add_mul_rhs:1509; GFX9-CONTRACT: ; %bb.0: ; %.entry1510; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1511; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1512; GFX9-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1513; GFX9-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1514; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1515;1516; GFX9-DENORM-LABEL: test_3xdouble_add_mul_rhs:1517; GFX9-DENORM: ; %bb.0: ; %.entry1518; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1519; GFX9-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[6:7]1520; GFX9-DENORM-NEXT: v_mul_f64 v[2:3], v[2:3], v[8:9]1521; GFX9-DENORM-NEXT: v_mul_f64 v[4:5], v[4:5], v[10:11]1522; GFX9-DENORM-NEXT: v_add_f64 v[0:1], v[12:13], v[0:1]1523; GFX9-DENORM-NEXT: v_add_f64 v[2:3], v[14:15], v[2:3]1524; GFX9-DENORM-NEXT: v_add_f64 v[4:5], v[16:17], v[4:5]1525; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1526;1527; GFX10-LABEL: test_3xdouble_add_mul_rhs:1528; GFX10: ; %bb.0: ; %.entry1529; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1530; GFX10-NEXT: v_mul_f64 v[0:1], v[0:1], v[6:7]1531; GFX10-NEXT: v_mul_f64 v[2:3], v[2:3], v[8:9]1532; GFX10-NEXT: v_mul_f64 v[4:5], v[4:5], v[10:11]1533; GFX10-NEXT: v_add_f64 v[0:1], v[12:13], v[0:1]1534; GFX10-NEXT: v_add_f64 v[2:3], v[14:15], v[2:3]1535; GFX10-NEXT: v_add_f64 v[4:5], v[16:17], v[4:5]1536; GFX10-NEXT: s_setpc_b64 s[30:31]1537;1538; GFX10-CONTRACT-LABEL: test_3xdouble_add_mul_rhs:1539; GFX10-CONTRACT: ; %bb.0: ; %.entry1540; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1541; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1542; GFX10-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1543; GFX10-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1544; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1545;1546; GFX10-DENORM-LABEL: test_3xdouble_add_mul_rhs:1547; GFX10-DENORM: ; %bb.0: ; %.entry1548; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1549; GFX10-DENORM-NEXT: v_mul_f64 v[0:1], v[0:1], v[6:7]1550; GFX10-DENORM-NEXT: v_mul_f64 v[2:3], v[2:3], v[8:9]1551; GFX10-DENORM-NEXT: v_mul_f64 v[4:5], v[4:5], v[10:11]1552; GFX10-DENORM-NEXT: v_add_f64 v[0:1], v[12:13], v[0:1]1553; GFX10-DENORM-NEXT: v_add_f64 v[2:3], v[14:15], v[2:3]1554; GFX10-DENORM-NEXT: v_add_f64 v[4:5], v[16:17], v[4:5]1555; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1556; GFX9-UNSAFE-LABEL: test_3xdouble_add_mul_rhs:1557; GFX9-UNSAFE: ; %bb.0: ; %.entry1558; GFX9-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1559; GFX9-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1560; GFX9-UNSAFE-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1561; GFX9-UNSAFE-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1562; GFX9-UNSAFE-NEXT: s_setpc_b64 s[30:31]1563; GFX10-UNSAFE-LABEL: test_3xdouble_add_mul_rhs:1564; GFX10-UNSAFE: ; %bb.0: ; %.entry1565; GFX10-UNSAFE-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1566; GFX10-UNSAFE-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1567; GFX10-UNSAFE-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1568; GFX10-UNSAFE-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1569; GFX10-UNSAFE-NEXT: s_setpc_b64 s[30:31]1570.entry:1571 %a = fmul <3 x double> %x, %y1572 %b = fadd <3 x double> %z, %a1573 ret <3 x double> %b1574}1575 1576define <3 x double> @test_3xdouble_add_mul_rhs_contract(<3 x double> %x, <3 x double> %y, <3 x double> %z) {1577; GFX9-LABEL: test_3xdouble_add_mul_rhs_contract:1578; GFX9: ; %bb.0: ; %.entry1579; GFX9-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1580; GFX9-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1581; GFX9-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1582; GFX9-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1583; GFX9-NEXT: s_setpc_b64 s[30:31]1584;1585; GFX9-CONTRACT-LABEL: test_3xdouble_add_mul_rhs_contract:1586; GFX9-CONTRACT: ; %bb.0: ; %.entry1587; GFX9-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1588; GFX9-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1589; GFX9-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1590; GFX9-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1591; GFX9-CONTRACT-NEXT: s_setpc_b64 s[30:31]1592;1593; GFX9-DENORM-LABEL: test_3xdouble_add_mul_rhs_contract:1594; GFX9-DENORM: ; %bb.0: ; %.entry1595; GFX9-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1596; GFX9-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1597; GFX9-DENORM-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1598; GFX9-DENORM-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1599; GFX9-DENORM-NEXT: s_setpc_b64 s[30:31]1600;1601; GFX10-LABEL: test_3xdouble_add_mul_rhs_contract:1602; GFX10: ; %bb.0: ; %.entry1603; GFX10-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1604; GFX10-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1605; GFX10-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1606; GFX10-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1607; GFX10-NEXT: s_setpc_b64 s[30:31]1608;1609; GFX10-CONTRACT-LABEL: test_3xdouble_add_mul_rhs_contract:1610; GFX10-CONTRACT: ; %bb.0: ; %.entry1611; GFX10-CONTRACT-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1612; GFX10-CONTRACT-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1613; GFX10-CONTRACT-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1614; GFX10-CONTRACT-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1615; GFX10-CONTRACT-NEXT: s_setpc_b64 s[30:31]1616;1617; GFX10-DENORM-LABEL: test_3xdouble_add_mul_rhs_contract:1618; GFX10-DENORM: ; %bb.0: ; %.entry1619; GFX10-DENORM-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)1620; GFX10-DENORM-NEXT: v_fma_f64 v[0:1], v[0:1], v[6:7], v[12:13]1621; GFX10-DENORM-NEXT: v_fma_f64 v[2:3], v[2:3], v[8:9], v[14:15]1622; GFX10-DENORM-NEXT: v_fma_f64 v[4:5], v[4:5], v[10:11], v[16:17]1623; GFX10-DENORM-NEXT: s_setpc_b64 s[30:31]1624.entry:1625 %a = fmul contract <3 x double> %x, %y1626 %b = fadd contract <3 x double> %z, %a1627 ret <3 x double> %b1628}1629