diff --git a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp @@ -2079,7 +2079,7 @@ return DAG.getMergeValues(Res, DL); } -// (frem x, y) -> (fsub x, (fmul (ftrunc (fdiv x, y)), y)) +// (frem x, y) -> (fma (fneg (ftrunc (fdiv x, y))), y, x) SDValue AMDGPUTargetLowering::LowerFREM(SDValue Op, SelectionDAG &DAG) const { SDLoc SL(Op); EVT VT = Op.getValueType(); @@ -2090,9 +2090,8 @@ SDValue Div = DAG.getNode(ISD::FDIV, SL, VT, X, Y); SDValue Floor = DAG.getNode(ISD::FTRUNC, SL, VT, Div); - SDValue Mul = DAG.getNode(ISD::FMUL, SL, VT, Floor, Y); - - return DAG.getNode(ISD::FSUB, SL, VT, X, Mul); + SDValue Neg = DAG.getNode(ISD::FNEG, SL, VT, Floor); + return DAG.getNode(ISD::FMA, SL, VT, Neg, Y, X); } SDValue AMDGPUTargetLowering::LowerFCEIL(SDValue Op, SelectionDAG &DAG) const { diff --git a/llvm/test/CodeGen/AMDGPU/frem.ll b/llvm/test/CodeGen/AMDGPU/frem.ll --- a/llvm/test/CodeGen/AMDGPU/frem.ll +++ b/llvm/test/CodeGen/AMDGPU/frem.ll @@ -36,7 +36,7 @@ ; SI-NEXT: v_div_fmas_f32 v2, v2, v4, v5 ; SI-NEXT: v_div_fixup_f32 v2, v2, v1, v0 ; SI-NEXT: v_trunc_f32_e32 v2, v2 -; SI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; SI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 ; SI-NEXT: s_endpgm ; @@ -72,7 +72,7 @@ ; CI-NEXT: v_div_fmas_f32 v2, v2, v4, v5 ; CI-NEXT: v_div_fixup_f32 v2, v2, v1, v0 ; CI-NEXT: v_trunc_f32_e32 v2, v2 -; CI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; CI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; CI-NEXT: buffer_store_dword v0, off, s[8:11], 0 ; CI-NEXT: s_endpgm ; @@ -108,7 +108,7 @@ ; VI-NEXT: v_div_fmas_f32 v2, v2, v4, v5 ; VI-NEXT: v_div_fixup_f32 v2, v2, v1, v0 ; VI-NEXT: v_trunc_f32_e32 v2, v2 -; VI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; VI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 ; VI-NEXT: s_endpgm float addrspace(1)* %in2) #0 { @@ -142,7 +142,7 @@ ; SI-NEXT: v_rcp_f32_e32 v2, v1 ; SI-NEXT: v_mul_f32_e32 v2, v0, v2 ; SI-NEXT: v_trunc_f32_e32 v2, v2 -; SI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; SI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; SI-NEXT: buffer_store_dword v0, off, s[0:3], 0 ; SI-NEXT: s_endpgm ; @@ -167,7 +167,7 @@ ; CI-NEXT: v_rcp_f32_e32 v2, v1 ; CI-NEXT: v_mul_f32_e32 v2, v0, v2 ; CI-NEXT: v_trunc_f32_e32 v2, v2 -; CI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; CI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; CI-NEXT: buffer_store_dword v0, off, s[8:11], 0 ; CI-NEXT: s_endpgm ; @@ -192,7 +192,7 @@ ; VI-NEXT: v_rcp_f32_e32 v2, v1 ; VI-NEXT: v_mul_f32_e32 v2, v0, v2 ; VI-NEXT: v_trunc_f32_e32 v2, v2 -; VI-NEXT: v_mad_f32 v0, -v2, v1, v0 +; VI-NEXT: v_fma_f32 v0, -v2, v1, v0 ; VI-NEXT: buffer_store_dword v0, off, s[8:11], 0 ; VI-NEXT: s_endpgm float addrspace(1)* %in2) #1 { @@ -255,8 +255,7 @@ ; SI-NEXT: v_cndmask_b32_e64 v5, v7, v5, s[0:1] ; SI-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc ; SI-NEXT: v_cndmask_b32_e64 v4, v6, v4, s[0:1] -; SI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; SI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; SI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[4:7], 0 ; SI-NEXT: s_endpgm ; @@ -291,8 +290,7 @@ ; CI-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11] ; CI-NEXT: v_div_fixup_f64 v[4:5], v[4:5], v[2:3], v[0:1] ; CI-NEXT: v_trunc_f64_e32 v[4:5], v[4:5] -; CI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; CI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; CI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; CI-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 0 ; CI-NEXT: s_endpgm ; @@ -327,8 +325,7 @@ ; VI-NEXT: v_div_fmas_f64 v[4:5], v[4:5], v[6:7], v[10:11] ; VI-NEXT: v_div_fixup_f64 v[4:5], v[4:5], v[2:3], v[0:1] ; VI-NEXT: v_trunc_f64_e32 v[4:5], v[4:5] -; VI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; VI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; VI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 0 ; VI-NEXT: s_endpgm double addrspace(1)* %in2) #0 { @@ -376,8 +373,7 @@ ; SI-NEXT: v_cndmask_b32_e64 v5, v7, v5, s[0:1] ; SI-NEXT: v_cndmask_b32_e64 v6, v6, 0, vcc ; SI-NEXT: v_cndmask_b32_e64 v4, v6, v4, s[0:1] -; SI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; SI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; SI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[12:15], 0 ; SI-NEXT: s_endpgm ; @@ -402,8 +398,7 @@ ; CI-NEXT: v_rcp_f64_e32 v[4:5], v[2:3] ; CI-NEXT: v_mul_f64 v[4:5], v[0:1], v[4:5] ; CI-NEXT: v_trunc_f64_e32 v[4:5], v[4:5] -; CI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; CI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; CI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; CI-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 0 ; CI-NEXT: s_endpgm ; @@ -428,8 +423,7 @@ ; VI-NEXT: v_rcp_f64_e32 v[4:5], v[2:3] ; VI-NEXT: v_mul_f64 v[4:5], v[0:1], v[4:5] ; VI-NEXT: v_trunc_f64_e32 v[4:5], v[4:5] -; VI-NEXT: v_mul_f64 v[2:3], v[4:5], v[2:3] -; VI-NEXT: v_add_f64 v[0:1], v[0:1], -v[2:3] +; VI-NEXT: v_fma_f64 v[0:1], -v[4:5], v[2:3], v[0:1] ; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[8:11], 0 ; VI-NEXT: s_endpgm double addrspace(1)* %in2) #1 { @@ -475,7 +469,7 @@ ; SI-NEXT: v_div_fmas_f32 v4, v4, v6, v7 ; SI-NEXT: v_div_fixup_f32 v4, v4, v3, v1 ; SI-NEXT: v_trunc_f32_e32 v4, v4 -; SI-NEXT: v_mad_f32 v1, -v4, v3, v1 +; SI-NEXT: v_fma_f32 v1, -v4, v3, v1 ; SI-NEXT: v_div_scale_f32 v3, vcc, v0, v2, v0 ; SI-NEXT: v_div_scale_f32 v4, s[4:5], v2, v2, v0 ; SI-NEXT: v_rcp_f32_e32 v5, v4 @@ -490,7 +484,7 @@ ; SI-NEXT: v_div_fmas_f32 v3, v3, v5, v6 ; SI-NEXT: v_div_fixup_f32 v3, v3, v2, v0 ; SI-NEXT: v_trunc_f32_e32 v3, v3 -; SI-NEXT: v_mad_f32 v0, -v3, v2, v0 +; SI-NEXT: v_fma_f32 v0, -v3, v2, v0 ; SI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 ; SI-NEXT: s_endpgm ; @@ -528,7 +522,7 @@ ; CI-NEXT: v_div_fmas_f32 v4, v4, v6, v7 ; CI-NEXT: v_div_fixup_f32 v4, v4, v3, v1 ; CI-NEXT: v_trunc_f32_e32 v4, v4 -; CI-NEXT: v_mad_f32 v1, -v4, v3, v1 +; CI-NEXT: v_fma_f32 v1, -v4, v3, v1 ; CI-NEXT: v_div_scale_f32 v4, s[4:5], v2, v2, v0 ; CI-NEXT: v_div_scale_f32 v3, vcc, v0, v2, v0 ; CI-NEXT: v_rcp_f32_e32 v5, v4 @@ -543,7 +537,7 @@ ; CI-NEXT: v_div_fmas_f32 v3, v3, v5, v6 ; CI-NEXT: v_div_fixup_f32 v3, v3, v2, v0 ; CI-NEXT: v_trunc_f32_e32 v3, v3 -; CI-NEXT: v_mad_f32 v0, -v3, v2, v0 +; CI-NEXT: v_fma_f32 v0, -v3, v2, v0 ; CI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 ; CI-NEXT: s_endpgm ; @@ -581,7 +575,7 @@ ; VI-NEXT: v_div_fmas_f32 v4, v4, v6, v7 ; VI-NEXT: v_div_fixup_f32 v4, v4, v3, v1 ; VI-NEXT: v_trunc_f32_e32 v4, v4 -; VI-NEXT: v_mad_f32 v1, -v4, v3, v1 +; VI-NEXT: v_fma_f32 v1, -v4, v3, v1 ; VI-NEXT: v_div_scale_f32 v4, s[4:5], v2, v2, v0 ; VI-NEXT: v_div_scale_f32 v3, vcc, v0, v2, v0 ; VI-NEXT: v_rcp_f32_e32 v5, v4 @@ -596,7 +590,7 @@ ; VI-NEXT: v_div_fmas_f32 v3, v3, v5, v6 ; VI-NEXT: v_div_fixup_f32 v3, v3, v2, v0 ; VI-NEXT: v_trunc_f32_e32 v3, v3 -; VI-NEXT: v_mad_f32 v0, -v3, v2, v0 +; VI-NEXT: v_fma_f32 v0, -v3, v2, v0 ; VI-NEXT: buffer_store_dwordx2 v[0:1], off, s[0:3], 0 ; VI-NEXT: s_endpgm <2 x float> addrspace(1)* %in2) #0 { @@ -643,7 +637,7 @@ ; SI-NEXT: v_div_fmas_f32 v8, v8, v10, v11 ; SI-NEXT: v_div_fixup_f32 v8, v8, v7, v3 ; SI-NEXT: v_trunc_f32_e32 v8, v8 -; SI-NEXT: v_mad_f32 v3, -v8, v7, v3 +; SI-NEXT: v_fma_f32 v3, -v8, v7, v3 ; SI-NEXT: v_div_scale_f32 v7, vcc, v2, v6, v2 ; SI-NEXT: v_div_scale_f32 v8, s[4:5], v6, v6, v2 ; SI-NEXT: v_rcp_f32_e32 v9, v8 @@ -658,7 +652,7 @@ ; SI-NEXT: v_div_fmas_f32 v7, v7, v9, v10 ; SI-NEXT: v_div_fixup_f32 v7, v7, v6, v2 ; SI-NEXT: v_trunc_f32_e32 v7, v7 -; SI-NEXT: v_mad_f32 v2, -v7, v6, v2 +; SI-NEXT: v_fma_f32 v2, -v7, v6, v2 ; SI-NEXT: v_div_scale_f32 v6, vcc, v1, v5, v1 ; SI-NEXT: v_div_scale_f32 v7, s[4:5], v5, v5, v1 ; SI-NEXT: v_rcp_f32_e32 v8, v7 @@ -673,7 +667,7 @@ ; SI-NEXT: v_div_fmas_f32 v6, v6, v8, v9 ; SI-NEXT: v_div_fixup_f32 v6, v6, v5, v1 ; SI-NEXT: v_trunc_f32_e32 v6, v6 -; SI-NEXT: v_mad_f32 v1, -v6, v5, v1 +; SI-NEXT: v_fma_f32 v1, -v6, v5, v1 ; SI-NEXT: v_div_scale_f32 v5, vcc, v0, v4, v0 ; SI-NEXT: v_div_scale_f32 v6, s[4:5], v4, v4, v0 ; SI-NEXT: v_rcp_f32_e32 v7, v6 @@ -688,7 +682,7 @@ ; SI-NEXT: v_div_fmas_f32 v5, v5, v7, v8 ; SI-NEXT: v_div_fixup_f32 v5, v5, v4, v0 ; SI-NEXT: v_trunc_f32_e32 v5, v5 -; SI-NEXT: v_mad_f32 v0, -v5, v4, v0 +; SI-NEXT: v_fma_f32 v0, -v5, v4, v0 ; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 ; SI-NEXT: s_endpgm ; @@ -726,7 +720,7 @@ ; CI-NEXT: v_div_fmas_f32 v8, v8, v10, v11 ; CI-NEXT: v_div_fixup_f32 v8, v8, v7, v3 ; CI-NEXT: v_trunc_f32_e32 v8, v8 -; CI-NEXT: v_mad_f32 v3, -v8, v7, v3 +; CI-NEXT: v_fma_f32 v3, -v8, v7, v3 ; CI-NEXT: v_div_scale_f32 v8, s[4:5], v6, v6, v2 ; CI-NEXT: v_div_scale_f32 v7, vcc, v2, v6, v2 ; CI-NEXT: v_rcp_f32_e32 v9, v8 @@ -741,7 +735,7 @@ ; CI-NEXT: v_div_fmas_f32 v7, v7, v9, v10 ; CI-NEXT: v_div_fixup_f32 v7, v7, v6, v2 ; CI-NEXT: v_trunc_f32_e32 v7, v7 -; CI-NEXT: v_mad_f32 v2, -v7, v6, v2 +; CI-NEXT: v_fma_f32 v2, -v7, v6, v2 ; CI-NEXT: v_div_scale_f32 v7, s[4:5], v5, v5, v1 ; CI-NEXT: v_div_scale_f32 v6, vcc, v1, v5, v1 ; CI-NEXT: v_rcp_f32_e32 v8, v7 @@ -756,7 +750,7 @@ ; CI-NEXT: v_div_fmas_f32 v6, v6, v8, v9 ; CI-NEXT: v_div_fixup_f32 v6, v6, v5, v1 ; CI-NEXT: v_trunc_f32_e32 v6, v6 -; CI-NEXT: v_mad_f32 v1, -v6, v5, v1 +; CI-NEXT: v_fma_f32 v1, -v6, v5, v1 ; CI-NEXT: v_div_scale_f32 v6, s[4:5], v4, v4, v0 ; CI-NEXT: v_div_scale_f32 v5, vcc, v0, v4, v0 ; CI-NEXT: v_rcp_f32_e32 v7, v6 @@ -771,7 +765,7 @@ ; CI-NEXT: v_div_fmas_f32 v5, v5, v7, v8 ; CI-NEXT: v_div_fixup_f32 v5, v5, v4, v0 ; CI-NEXT: v_trunc_f32_e32 v5, v5 -; CI-NEXT: v_mad_f32 v0, -v5, v4, v0 +; CI-NEXT: v_fma_f32 v0, -v5, v4, v0 ; CI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 ; CI-NEXT: s_endpgm ; @@ -809,7 +803,7 @@ ; VI-NEXT: v_div_fmas_f32 v8, v8, v10, v11 ; VI-NEXT: v_div_fixup_f32 v8, v8, v7, v3 ; VI-NEXT: v_trunc_f32_e32 v8, v8 -; VI-NEXT: v_mad_f32 v3, -v8, v7, v3 +; VI-NEXT: v_fma_f32 v3, -v8, v7, v3 ; VI-NEXT: v_div_scale_f32 v8, s[4:5], v6, v6, v2 ; VI-NEXT: v_div_scale_f32 v7, vcc, v2, v6, v2 ; VI-NEXT: v_rcp_f32_e32 v9, v8 @@ -824,7 +818,7 @@ ; VI-NEXT: v_div_fmas_f32 v7, v7, v9, v10 ; VI-NEXT: v_div_fixup_f32 v7, v7, v6, v2 ; VI-NEXT: v_trunc_f32_e32 v7, v7 -; VI-NEXT: v_mad_f32 v2, -v7, v6, v2 +; VI-NEXT: v_fma_f32 v2, -v7, v6, v2 ; VI-NEXT: v_div_scale_f32 v7, s[4:5], v5, v5, v1 ; VI-NEXT: v_div_scale_f32 v6, vcc, v1, v5, v1 ; VI-NEXT: v_rcp_f32_e32 v8, v7 @@ -839,7 +833,7 @@ ; VI-NEXT: v_div_fmas_f32 v6, v6, v8, v9 ; VI-NEXT: v_div_fixup_f32 v6, v6, v5, v1 ; VI-NEXT: v_trunc_f32_e32 v6, v6 -; VI-NEXT: v_mad_f32 v1, -v6, v5, v1 +; VI-NEXT: v_fma_f32 v1, -v6, v5, v1 ; VI-NEXT: v_div_scale_f32 v6, s[4:5], v4, v4, v0 ; VI-NEXT: v_div_scale_f32 v5, vcc, v0, v4, v0 ; VI-NEXT: v_rcp_f32_e32 v7, v6 @@ -854,7 +848,7 @@ ; VI-NEXT: v_div_fmas_f32 v5, v5, v7, v8 ; VI-NEXT: v_div_fixup_f32 v5, v5, v4, v0 ; VI-NEXT: v_trunc_f32_e32 v5, v5 -; VI-NEXT: v_mad_f32 v0, -v5, v4, v0 +; VI-NEXT: v_fma_f32 v0, -v5, v4, v0 ; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 ; VI-NEXT: s_endpgm <4 x float> addrspace(1)* %in2) #0 { @@ -918,8 +912,7 @@ ; SI-NEXT: v_cndmask_b32_e64 v9, v11, v9, s[0:1] ; SI-NEXT: v_cndmask_b32_e64 v10, v10, 0, vcc ; SI-NEXT: v_cndmask_b32_e64 v8, v10, v8, s[0:1] -; SI-NEXT: v_mul_f64 v[6:7], v[8:9], v[6:7] -; SI-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] +; SI-NEXT: v_fma_f64 v[2:3], -v[8:9], v[6:7], v[2:3] ; SI-NEXT: v_div_scale_f64 v[6:7], s[0:1], v[4:5], v[4:5], v[0:1] ; SI-NEXT: v_rcp_f64_e32 v[8:9], v[6:7] ; SI-NEXT: v_fma_f64 v[10:11], -v[6:7], v[8:9], 1.0 @@ -950,8 +943,7 @@ ; SI-NEXT: v_cndmask_b32_e64 v7, v9, v7, s[0:1] ; SI-NEXT: v_cndmask_b32_e64 v8, v8, 0, vcc ; SI-NEXT: v_cndmask_b32_e64 v6, v8, v6, s[0:1] -; SI-NEXT: v_mul_f64 v[4:5], v[6:7], v[4:5] -; SI-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] +; SI-NEXT: v_fma_f64 v[0:1], -v[6:7], v[4:5], v[0:1] ; SI-NEXT: buffer_store_dwordx4 v[0:3], off, s[4:7], 0 ; SI-NEXT: s_endpgm ; @@ -986,8 +978,7 @@ ; CI-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[10:11], v[14:15] ; CI-NEXT: v_div_fixup_f64 v[8:9], v[8:9], v[6:7], v[2:3] ; CI-NEXT: v_trunc_f64_e32 v[8:9], v[8:9] -; CI-NEXT: v_mul_f64 v[6:7], v[8:9], v[6:7] -; CI-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] +; CI-NEXT: v_fma_f64 v[2:3], -v[8:9], v[6:7], v[2:3] ; CI-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[4:5], v[4:5], v[0:1] ; CI-NEXT: v_rcp_f64_e32 v[8:9], v[6:7] ; CI-NEXT: v_fma_f64 v[10:11], -v[6:7], v[8:9], 1.0 @@ -1001,8 +992,7 @@ ; CI-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[8:9], v[12:13] ; CI-NEXT: v_div_fixup_f64 v[6:7], v[6:7], v[4:5], v[0:1] ; CI-NEXT: v_trunc_f64_e32 v[6:7], v[6:7] -; CI-NEXT: v_mul_f64 v[4:5], v[6:7], v[4:5] -; CI-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] +; CI-NEXT: v_fma_f64 v[0:1], -v[6:7], v[4:5], v[0:1] ; CI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 ; CI-NEXT: s_endpgm ; @@ -1037,8 +1027,7 @@ ; VI-NEXT: v_div_fmas_f64 v[8:9], v[8:9], v[10:11], v[14:15] ; VI-NEXT: v_div_fixup_f64 v[8:9], v[8:9], v[6:7], v[2:3] ; VI-NEXT: v_trunc_f64_e32 v[8:9], v[8:9] -; VI-NEXT: v_mul_f64 v[6:7], v[8:9], v[6:7] -; VI-NEXT: v_add_f64 v[2:3], v[2:3], -v[6:7] +; VI-NEXT: v_fma_f64 v[2:3], -v[8:9], v[6:7], v[2:3] ; VI-NEXT: v_div_scale_f64 v[6:7], s[4:5], v[4:5], v[4:5], v[0:1] ; VI-NEXT: v_rcp_f64_e32 v[8:9], v[6:7] ; VI-NEXT: v_fma_f64 v[10:11], -v[6:7], v[8:9], 1.0 @@ -1052,8 +1041,7 @@ ; VI-NEXT: v_div_fmas_f64 v[6:7], v[6:7], v[8:9], v[12:13] ; VI-NEXT: v_div_fixup_f64 v[6:7], v[6:7], v[4:5], v[0:1] ; VI-NEXT: v_trunc_f64_e32 v[6:7], v[6:7] -; VI-NEXT: v_mul_f64 v[4:5], v[6:7], v[4:5] -; VI-NEXT: v_add_f64 v[0:1], v[0:1], -v[4:5] +; VI-NEXT: v_fma_f64 v[0:1], -v[6:7], v[4:5], v[0:1] ; VI-NEXT: buffer_store_dwordx4 v[0:3], off, s[0:3], 0 ; VI-NEXT: s_endpgm <2 x double> addrspace(1)* %in2) #0 {