1; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2
3define <2 x float> @fma_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
4; CHECK-LABEL: fma_1:
5; CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
6	%tmp1 = fmul contract <2 x float> %A, %B;
7	%tmp2 = fadd contract <2 x float> %C, %tmp1;
8	ret <2 x float> %tmp2
9}
10
11; This case will fold as it was only available through unsafe before, now available from
12; the contract on the fadd
13define <2 x float> @fma_2(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
14; CHECK-LABEL: fma_2:
15; CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
16	%tmp1 = fmul <2 x float> %A, %B;
17	%tmp2 = fadd contract <2 x float> %C, %tmp1;
18	ret <2 x float> %tmp2
19}
20
21define <2 x float> @no_fma_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
22; CHECK-LABEL: no_fma_1:
23; CHECK: fmul
24; CHECK: fadd
25	%tmp1 = fmul contract <2 x float> %A, %B;
26	%tmp2 = fadd <2 x float> %C, %tmp1;
27	ret <2 x float> %tmp2
28}
29
30define <2 x float> @fma_sub_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
31; CHECK-LABEL: fma_sub_1:
32; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
33	%tmp1 = fmul contract <2 x float> %A, %B;
34	%tmp2 = fsub contract <2 x float> %C, %tmp1;
35	ret <2 x float> %tmp2
36}
37
38; This case will fold as it was only available through unsafe before, now available from
39; the contract on the fsub
40define <2 x float> @fma_sub_2(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
41; CHECK-LABEL: fma_sub_2:
42; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
43	%tmp1 = fmul <2 x float> %A, %B;
44	%tmp2 = fsub contract <2 x float> %C, %tmp1;
45	ret <2 x float> %tmp2
46}
47
48define <2 x float> @no_fma_sub_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
49; CHECK-LABEL: no_fma_sub_1:
50; CHECK: fmul
51; CHECK: fsub
52	%tmp1 = fmul contract <2 x float> %A, %B;
53	%tmp2 = fsub <2 x float> %C, %tmp1;
54	ret <2 x float> %tmp2
55}
56