; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \ ; RUN: -verify-machineinstrs < %s | FileCheck %s declare @llvm.vp.fma.nxv1f64(, , , , i32) declare @llvm.vp.fneg.nxv1f64(, , i32) declare @llvm.vp.fmul.nxv1f64(, , , i32) ; (-N0 * -N1) + N2 --> (N0 * N1) + N2 define @test1( %a, %b, %c, %m, i32 zeroext %evl) { ; CHECK-LABEL: test1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma ; CHECK-NEXT: vfmadd.vv v9, v8, v10, v0.t ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %nega = call @llvm.vp.fneg.nxv1f64( %a, %m, i32 %evl) %negb = call @llvm.vp.fneg.nxv1f64( %b, %m, i32 %evl) %v = call @llvm.vp.fma.nxv1f64( %nega, %negb, %c, %m, i32 %evl) ret %v } ; (fma x, c1, (fmul x, c2)) -> (fmul x, c1+c2) define @test2( %a, %m, i32 zeroext %evl) { ; CHECK-LABEL: test2: ; CHECK: # %bb.0: ; CHECK-NEXT: lui a1, %hi(.LCPI1_0) ; CHECK-NEXT: addi a1, a1, %lo(.LCPI1_0) ; CHECK-NEXT: vsetvli a2, zero, e64, m1, ta, ma ; CHECK-NEXT: vlse64.v v9, (a1), zero ; CHECK-NEXT: lui a1, %hi(.LCPI1_1) ; CHECK-NEXT: fld fa5, %lo(.LCPI1_1)(a1) ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma ; CHECK-NEXT: vfadd.vf v9, v9, fa5, v0.t ; CHECK-NEXT: vfmul.vv v8, v8, v9, v0.t ; CHECK-NEXT: ret %elt.head1 = insertelement poison, double 2.0, i32 0 %c1 = shufflevector %elt.head1, poison, zeroinitializer %t = call @llvm.vp.fmul.nxv1f64( %a, %c1, %m, i32 %evl) %elt.head2 = insertelement poison, double 4.0, i32 0 %c2 = shufflevector %elt.head2, poison, zeroinitializer %v = call fast @llvm.vp.fma.nxv1f64( %a, %c2, %t, %m, i32 %evl) ret %v } ; (fma (fmul x, c1), c2, y) -> (fma x, c1*c2, y) define @test3( %a, %b, %m, i32 zeroext %evl) { ; CHECK-LABEL: test3: ; CHECK: # %bb.0: ; CHECK-NEXT: lui a1, %hi(.LCPI2_0) ; CHECK-NEXT: addi a1, a1, %lo(.LCPI2_0) ; CHECK-NEXT: vsetvli a2, zero, e64, m1, ta, ma ; CHECK-NEXT: vlse64.v v10, (a1), zero ; CHECK-NEXT: lui a1, %hi(.LCPI2_1) ; CHECK-NEXT: fld fa5, %lo(.LCPI2_1)(a1) ; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma ; CHECK-NEXT: vfmul.vf v10, v10, fa5, v0.t ; CHECK-NEXT: vfmadd.vv v10, v8, v9, v0.t ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %elt.head1 = insertelement poison, double 2.0, i32 0 %c1 = shufflevector %elt.head1, poison, zeroinitializer %t = call @llvm.vp.fmul.nxv1f64( %a, %c1, %m, i32 %evl) %elt.head2 = insertelement poison, double 4.0, i32 0 %c2 = shufflevector %elt.head2, poison, zeroinitializer %v = call fast @llvm.vp.fma.nxv1f64( %t, %c2, %b, %m, i32 %evl) ret %v }