blob: 9afcd1f1f0d11c04a2b456761dcc27aa950cc9f1 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefix=RV32I %s
; RUN: llc -mtriple=riscv32 -mattr=+f < %s | FileCheck -check-prefix=RV32IF %s
; Chains of FADDs of the same value can fold into a multiplication. RV32I
; expands FMUL to a libcall, so the fold's gating on FMUL legality is
; observable here; RV32IF has a legal FMUL for comparison.
define float @fadd_chain_to_fmul(float %a) nounwind {
; RV32I-LABEL: fadd_chain_to_fmul:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 263168
; RV32I-NEXT: call __mulsf3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IF-LABEL: fadd_chain_to_fmul:
; RV32IF: # %bb.0:
; RV32IF-NEXT: lui a0, 263168
; RV32IF-NEXT: fmv.w.x fa5, a0
; RV32IF-NEXT: fmul.s fa0, fa0, fa5
; RV32IF-NEXT: ret
%1 = fadd fast float %a, %a
%2 = fadd fast float %1, %a
ret float %2
}
define float @fmul_fadd_to_fmul(float %a) nounwind {
; RV32I-LABEL: fmul_fadd_to_fmul:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 264192
; RV32I-NEXT: call __mulsf3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IF-LABEL: fmul_fadd_to_fmul:
; RV32IF: # %bb.0:
; RV32IF-NEXT: lui a0, 264192
; RV32IF-NEXT: fmv.w.x fa5, a0
; RV32IF-NEXT: fmul.s fa0, fa0, fa5
; RV32IF-NEXT: ret
%1 = fmul fast float %a, 3.0
%2 = fadd fast float %1, %a
ret float %2
}