llvm-project/llvm/test/CodeGen/RISCV/machine-combiner.ll

240 lines
7.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs -mcpu=sifive-u74 \
; RUN: -O1 -riscv-enable-machine-combiner=true < %s | \
; RUN: FileCheck %s
define double @test_reassoc_fadd1(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd1:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft1, fa2, fa3
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %t0, %a2
%t2 = fadd nsz reassoc double %t1, %a3
ret double %t2
}
define double @test_reassoc_fadd2(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd2:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft1, fa2, fa3
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %a2, %t0
%t2 = fadd nsz reassoc double %t1, %a3
ret double %t2
}
define double @test_reassoc_fadd3(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd3:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft1, fa2, fa3
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %t0, %a2
%t2 = fadd nsz reassoc double %a3, %t1
ret double %t2
}
define double @test_reassoc_fadd4(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd4:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft1, fa2, fa3
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %a2, %t0
%t2 = fadd nsz reassoc double %a3, %t1
ret double %t2
}
define double @test_reassoc_fmul1(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fmul1:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmul.d ft1, fa2, fa3
; CHECK-NEXT: fmul.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fmul nsz reassoc double %a0, %a1
%t1 = fmul nsz reassoc double %t0, %a2
%t2 = fmul nsz reassoc double %t1, %a3
ret double %t2
}
define double @test_reassoc_fmul2(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fmul2:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmul.d ft1, fa2, fa3
; CHECK-NEXT: fmul.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fmul nsz reassoc double %a0, %a1
%t1 = fmul nsz reassoc double %a2, %t0
%t2 = fmul nsz reassoc double %t1, %a3
ret double %t2
}
define double @test_reassoc_fmul3(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fmul3:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmul.d ft1, fa2, fa3
; CHECK-NEXT: fmul.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fmul nsz reassoc double %a0, %a1
%t1 = fmul nsz reassoc double %t0, %a2
%t2 = fmul nsz reassoc double %a3, %t1
ret double %t2
}
define double @test_reassoc_fmul4(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fmul4:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmul.d ft1, fa2, fa3
; CHECK-NEXT: fmul.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fmul nsz reassoc double %a0, %a1
%t1 = fmul nsz reassoc double %a2, %t0
%t2 = fmul nsz reassoc double %a3, %t1
ret double %t2
}
define double @test_reassoc_big1(double %a0, double %a1, double %a2, double %a3, double %a4, double %a5, double %a6) {
; CHECK-LABEL: test_reassoc_big1:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft1, fa2, fa3
; CHECK-NEXT: fadd.d ft2, fa4, fa5
; CHECK-NEXT: fadd.d ft0, ft0, ft1
; CHECK-NEXT: fadd.d ft1, ft2, fa6
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %t0, %a2
%t2 = fadd nsz reassoc double %t1, %a3
%t3 = fadd nsz reassoc double %t2, %a4
%t4 = fadd nsz reassoc double %t3, %a5
%t5 = fadd nsz reassoc double %t4, %a6
ret double %t5
}
define double @test_reassoc_big2(double %a0, double %a1, i32 %a2, double %a3, i32 %a4, double %a5) {
; CHECK-LABEL: test_reassoc_big2:
; CHECK: # %bb.0:
; CHECK-NEXT: fcvt.d.w ft0, a0
; CHECK-NEXT: fcvt.d.w ft1, a1
; CHECK-NEXT: fmul.d ft0, fa2, ft0
; CHECK-NEXT: fmul.d ft1, ft1, fa1
; CHECK-NEXT: fadd.d ft2, fa0, fa1
; CHECK-NEXT: fadd.d ft3, fa2, fa1
; CHECK-NEXT: fmul.d ft0, ft0, ft1
; CHECK-NEXT: fadd.d ft1, fa2, ft2
; CHECK-NEXT: fmul.d ft2, fa0, ft3
; CHECK-NEXT: fsub.d ft1, fa3, ft1
; CHECK-NEXT: fmul.d ft0, ft0, ft2
; CHECK-NEXT: fmul.d fa0, ft1, ft0
; CHECK-NEXT: ret
%cvt1 = sitofp i32 %a2 to double
%cvt2 = sitofp i32 %a4 to double
%t5 = fmul nsz reassoc double %a3, %cvt1
%t9 = fmul nsz reassoc double %cvt2, %t5
%t4 = fmul nsz reassoc double %t9, %a1
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %a3, %t0
%t3 = fadd nsz reassoc double %a3, %a1
%t6 = fmul nsz reassoc double %t4, %a0
%t2 = fsub nsz reassoc double %a5, %t1
%t7 = fmul nsz reassoc double %t6, %t3
%t8 = fmul nsz reassoc double %t2, %t7
ret double %t8
}
; Negative test
define double @test_reassoc_fadd_flags_1(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd_flags_1:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft0, ft0, fa2
; CHECK-NEXT: fadd.d fa0, ft0, fa3
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd double %t0, %a2
%t2 = fadd nsz reassoc double %t1, %a3
ret double %t2
}
; Negative test
define double @test_reassoc_fadd_flags_2(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_reassoc_fadd_flags_2:
; CHECK: # %bb.0:
; CHECK-NEXT: fadd.d ft0, fa0, fa1
; CHECK-NEXT: fadd.d ft0, ft0, fa2
; CHECK-NEXT: fadd.d fa0, ft0, fa3
; CHECK-NEXT: ret
%t0 = fadd nsz reassoc double %a0, %a1
%t1 = fadd nsz reassoc double %t0, %a2
%t2 = fadd double %t1, %a3
ret double %t2
}
define double @test_fmadd1(double %a0, double %a1, double %a2, double %a3) {
; CHECK-LABEL: test_fmadd1:
; CHECK: # %bb.0:
; CHECK-NEXT: fmadd.d ft0, fa0, fa1, fa2
; CHECK-NEXT: fmadd.d ft1, fa0, fa1, fa3
; CHECK-NEXT: fadd.d fa0, ft0, ft1
; CHECK-NEXT: ret
%t0 = fmul contract double %a0, %a1
%t1 = fadd contract double %t0, %a2
%t2 = fadd contract double %a3, %t0
%t3 = fadd double %t1, %t2
ret double %t3
}
define double @test_fmadd2(double %a0, double %a1, double %a2) {
; CHECK-LABEL: test_fmadd2:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmadd.d ft1, fa0, fa1, fa2
; CHECK-NEXT: fdiv.d fa0, ft1, ft0
; CHECK-NEXT: ret
%t0 = fmul contract double %a0, %a1
%t1 = fadd contract double %t0, %a2
%t2 = fdiv double %t1, %t0
ret double %t2
}
define double @test_fmsub(double %a0, double %a1, double %a2) {
; CHECK-LABEL: test_fmsub:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fmsub.d ft1, fa0, fa1, fa2
; CHECK-NEXT: fdiv.d fa0, ft1, ft0
; CHECK-NEXT: ret
%t0 = fmul contract double %a0, %a1
%t1 = fsub contract double %t0, %a2
%t2 = fdiv double %t1, %t0
ret double %t2
}
define double @test_fnmsub(double %a0, double %a1, double %a2) {
; CHECK-LABEL: test_fnmsub:
; CHECK: # %bb.0:
; CHECK-NEXT: fmul.d ft0, fa0, fa1
; CHECK-NEXT: fnmsub.d ft1, fa0, fa1, fa2
; CHECK-NEXT: fdiv.d fa0, ft1, ft0
; CHECK-NEXT: ret
%t0 = fmul contract double %a0, %a1
%t1 = fsub contract double %a2, %t0
%t2 = fdiv double %t1, %t0
ret double %t2
}