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