[TwoAddressInstructionPass] When looking for a 3 addr conversion after commuting...
[oota-llvm.git] / test / CodeGen / X86 / fma-intrinsics-phi-213-to-231.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+fma | FileCheck %s
2
3 ; CHECK-LABEL: fmaddsubpd_loop:
4 ; CHECK:   vfmaddsub231pd        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
5 define <4 x double> @fmaddsubpd_loop(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {
6 entry:
7   br label %for.cond
8
9 for.cond:
10   %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]
11   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
12   %cmp = icmp slt i32 %i.0, %iter
13   br i1 %cmp, label %for.body, label %for.end
14
15 for.body:
16   br label %for.inc
17
18 for.inc:
19   %0 = call <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)
20   %inc = add nsw i32 %i.0, 1
21   br label %for.cond
22
23 for.end:
24   ret <4 x double> %c.addr.0
25 }
26
27 ; CHECK-LABEL: fmsubaddpd_loop:
28 ; CHECK:   vfmsubadd231pd        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
29 define <4 x double> @fmsubaddpd_loop(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {
30 entry:
31   br label %for.cond
32
33 for.cond:
34   %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]
35   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
36   %cmp = icmp slt i32 %i.0, %iter
37   br i1 %cmp, label %for.body, label %for.end
38
39 for.body:
40   br label %for.inc
41
42 for.inc:
43   %0 = call <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)
44   %inc = add nsw i32 %i.0, 1
45   br label %for.cond
46
47 for.end:
48   ret <4 x double> %c.addr.0
49 }
50
51 ; CHECK-LABEL: fmaddpd_loop:
52 ; CHECK:   vfmadd231pd        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
53 define <4 x double> @fmaddpd_loop(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {
54 entry:
55   br label %for.cond
56
57 for.cond:
58   %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]
59   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
60   %cmp = icmp slt i32 %i.0, %iter
61   br i1 %cmp, label %for.body, label %for.end
62
63 for.body:
64   br label %for.inc
65
66 for.inc:
67   %0 = call <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)
68   %inc = add nsw i32 %i.0, 1
69   br label %for.cond
70
71 for.end:
72   ret <4 x double> %c.addr.0
73 }
74
75 ; CHECK-LABEL: fmsubpd_loop:
76 ; CHECK:   vfmsub231pd        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
77 define <4 x double> @fmsubpd_loop(i32 %iter, <4 x double> %a, <4 x double> %b, <4 x double> %c) {
78 entry:
79   br label %for.cond
80
81 for.cond:
82   %c.addr.0 = phi <4 x double> [ %c, %entry ], [ %0, %for.inc ]
83   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
84   %cmp = icmp slt i32 %i.0, %iter
85   br i1 %cmp, label %for.body, label %for.end
86
87 for.body:
88   br label %for.inc
89
90 for.inc:
91   %0 = call <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double> %a, <4 x double> %b, <4 x double> %c.addr.0)
92   %inc = add nsw i32 %i.0, 1
93   br label %for.cond
94
95 for.end:
96   ret <4 x double> %c.addr.0
97 }
98
99 declare <4 x double> @llvm.x86.fma.vfmaddsub.pd.256(<4 x double>, <4 x double>, <4 x double>)
100 declare <4 x double> @llvm.x86.fma.vfmsubadd.pd.256(<4 x double>, <4 x double>, <4 x double>)
101 declare <4 x double> @llvm.x86.fma.vfmadd.pd.256(<4 x double>, <4 x double>, <4 x double>)
102 declare <4 x double> @llvm.x86.fma.vfmsub.pd.256(<4 x double>, <4 x double>, <4 x double>)
103
104
105 ; CHECK-LABEL: fmaddsubps_loop:
106 ; CHECK:   vfmaddsub231ps        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
107 define <8 x float> @fmaddsubps_loop(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {
108 entry:
109   br label %for.cond
110
111 for.cond:
112   %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]
113   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
114   %cmp = icmp slt i32 %i.0, %iter
115   br i1 %cmp, label %for.body, label %for.end
116
117 for.body:
118   br label %for.inc
119
120 for.inc:
121   %0 = call <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)
122   %inc = add nsw i32 %i.0, 1
123   br label %for.cond
124
125 for.end:
126   ret <8 x float> %c.addr.0
127 }
128
129 ; CHECK-LABEL: fmsubaddps_loop:
130 ; CHECK:   vfmsubadd231ps        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
131 define <8 x float> @fmsubaddps_loop(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {
132 entry:
133   br label %for.cond
134
135 for.cond:
136   %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]
137   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
138   %cmp = icmp slt i32 %i.0, %iter
139   br i1 %cmp, label %for.body, label %for.end
140
141 for.body:
142   br label %for.inc
143
144 for.inc:
145   %0 = call <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)
146   %inc = add nsw i32 %i.0, 1
147   br label %for.cond
148
149 for.end:
150   ret <8 x float> %c.addr.0
151 }
152
153 ; CHECK-LABEL: fmaddps_loop:
154 ; CHECK:   vfmadd231ps        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
155 define <8 x float> @fmaddps_loop(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {
156 entry:
157   br label %for.cond
158
159 for.cond:
160   %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]
161   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
162   %cmp = icmp slt i32 %i.0, %iter
163   br i1 %cmp, label %for.body, label %for.end
164
165 for.body:
166   br label %for.inc
167
168 for.inc:
169   %0 = call <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)
170   %inc = add nsw i32 %i.0, 1
171   br label %for.cond
172
173 for.end:
174   ret <8 x float> %c.addr.0
175 }
176
177 ; CHECK-LABEL: fmsubps_loop:
178 ; CHECK:   vfmsub231ps        %ymm{{[0-9]+}}, %ymm{{[0-9]+}}, %ymm{{[0-9]+}}
179 define <8 x float> @fmsubps_loop(i32 %iter, <8 x float> %a, <8 x float> %b, <8 x float> %c) {
180 entry:
181   br label %for.cond
182
183 for.cond:
184   %c.addr.0 = phi <8 x float> [ %c, %entry ], [ %0, %for.inc ]
185   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
186   %cmp = icmp slt i32 %i.0, %iter
187   br i1 %cmp, label %for.body, label %for.end
188
189 for.body:
190   br label %for.inc
191
192 for.inc:
193   %0 = call <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float> %a, <8 x float> %b, <8 x float> %c.addr.0)
194   %inc = add nsw i32 %i.0, 1
195   br label %for.cond
196
197 for.end:
198   ret <8 x float> %c.addr.0
199 }
200
201 declare <8 x float> @llvm.x86.fma.vfmaddsub.ps.256(<8 x float>, <8 x float>, <8 x float>)
202 declare <8 x float> @llvm.x86.fma.vfmsubadd.ps.256(<8 x float>, <8 x float>, <8 x float>)
203 declare <8 x float> @llvm.x86.fma.vfmadd.ps.256(<8 x float>, <8 x float>, <8 x float>)
204 declare <8 x float> @llvm.x86.fma.vfmsub.ps.256(<8 x float>, <8 x float>, <8 x float>)