[AArch64] Check fmul node single use in fused multiply patterns

Check for single use of fmul node in fused multiply patterns
to allow generation of fused multiply add/sub instructions.
Otherwise fmul operation ends up being repeated more than
once which does not help peformance on targets with
only one MAC unit, as for example cortex-a53.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197929 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ana Pazos
2013-12-24 00:47:29 +00:00
parent f5bfe97875
commit 25f4d51bcb
4 changed files with 64 additions and 10 deletions

View File

@@ -135,3 +135,29 @@ define float @test_fnmsub_unfused(float %a, float %b, float %c) {
ret float %sum
}
; Another set of tests that check for multiply single use
define float @test_fmadd_unfused_su(float %a, float %b, float %c) {
; CHECK-LABEL: test_fmadd_unfused_su:
%prod = fmul float %b, %c
%sum = fadd float %a, %prod
%res = fadd float %sum, %prod
; CHECK-NOT: fmadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
ret float %res
}
define float @test_fmsub_unfused_su(float %a, float %b, float %c) {
; CHECK-LABEL: test_fmsub_unfused_su:
%prod = fmul float %b, %c
%diff = fsub float %a, %prod
%res = fsub float %diff, %prod
; CHECK-NOT: fmsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fmul {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
; CHECK: fsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}}
ret float %res
}

View File

@@ -111,3 +111,22 @@ define <2 x double> @fmuladd2xdouble_fused(<2 x double> %A, <2 x double> %B, <2
ret <2 x double> %val
}
; Another set of tests that check for multiply single use
define <2 x float> @fmla2xfloati_su(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
;CHECK-NOT: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
%tmp1 = fmul <2 x float> %A, %B;
%tmp2 = fadd <2 x float> %C, %tmp1;
%tmp3 = fadd <2 x float> %tmp2, %tmp1;
ret <2 x float> %tmp3
}
define <2 x double> @fmls2xdouble_su(<2 x double> %A, <2 x double> %B, <2 x double> %C) {
;CHECK-NOT: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
%tmp1 = fmul <2 x double> %A, %B;
%tmp2 = fsub <2 x double> %C, %tmp1;
%tmp3 = fsub <2 x double> %tmp2, %tmp1;
ret <2 x double> %tmp3
}