[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-fma-FMF.ll
blob1585526e69ee6a352632ad227c9d38f9c4c6e4af
1 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2 ; RUN: llc < %s -O3 -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
4 define <2 x float> @fma_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
5 ; CHECK-LABEL: fma_1:
6 ; CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
7         %tmp1 = fmul contract <2 x float> %A, %B;
8         %tmp2 = fadd contract <2 x float> %C, %tmp1;
9         ret <2 x float> %tmp2
12 ; This case will fold as it was only available through unsafe before, now available from
13 ; the contract on the fadd
14 define <2 x float> @fma_2(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
15 ; CHECK-LABEL: fma_2:
16 ; CHECK: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
17         %tmp1 = fmul <2 x float> %A, %B;
18         %tmp2 = fadd contract <2 x float> %C, %tmp1;
19         ret <2 x float> %tmp2
22 define <2 x float> @no_fma_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
23 ; CHECK-LABEL: no_fma_1:
24 ; CHECK: fmul
25 ; CHECK: fadd
26         %tmp1 = fmul contract <2 x float> %A, %B;
27         %tmp2 = fadd <2 x float> %C, %tmp1;
28         ret <2 x float> %tmp2
31 define <2 x float> @fma_sub_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
32 ; CHECK-LABEL: fma_sub_1:
33 ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
34         %tmp1 = fmul contract <2 x float> %A, %B;
35         %tmp2 = fsub contract <2 x float> %C, %tmp1;
36         ret <2 x float> %tmp2
39 ; This case will fold as it was only available through unsafe before, now available from
40 ; the contract on the fsub
41 define <2 x float> @fma_sub_2(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
42 ; CHECK-LABEL: fma_sub_2:
43 ; CHECK: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
44         %tmp1 = fmul <2 x float> %A, %B;
45         %tmp2 = fsub contract <2 x float> %C, %tmp1;
46         ret <2 x float> %tmp2
49 define <2 x float> @no_fma_sub_1(<2 x float> %A, <2 x float> %B, <2 x float> %C) {
50 ; CHECK-LABEL: no_fma_sub_1:
51 ; CHECK: fmul
52 ; CHECK: fsub
53         %tmp1 = fmul contract <2 x float> %A, %B;
54         %tmp2 = fsub <2 x float> %C, %tmp1;
55         ret <2 x float> %tmp2
58 ; Regression test: contract FMF allows folding (A * 0 + B) to FMA(A, 0, B), but
59 ; reassoc FMF must not allow further folding to just (B) without additional
60 ; FMFs (ninf, nnan)
61 define float @fma_zero(float %A, float %B) {
62 ; CHECK-LABEL: fma_zero:
63 ; CHECK:       // %bb.0:
64 ; CHECK-NEXT:    movi d2, #0000000000000000
65 ; CHECK-NEXT:    fmadd s0, s0, s2, s1
66 ; CHECK-NEXT:    ret
67         %tmp1 = fmul contract reassoc float %A, 0.0e+0;
68         %tmp2 = fadd contract reassoc float %B, %tmp1;
69         ret float %tmp2