225b6421c818681d3c800f1fc4843dea82545021
[oota-llvm.git] / test / CodeGen / X86 / fadd-combines.ll
1 ; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s
2
3 define float @fadd_zero_f32(float %x) #0 {
4 ; CHECK-LABEL: fadd_zero_f32:
5 ; CHECK:       # BB#0:
6 ; CHECK-NEXT:    retq
7   %y = fadd float %x, 0.0
8   ret float %y
9 }
10
11 define <4 x float> @fadd_zero_4f32(<4 x float> %x) #0 {
12 ; CHECK-LABEL: fadd_zero_4f32:
13 ; CHECK:       # BB#0:
14 ; CHECK-NEXT:    retq
15   %y = fadd <4 x float> %x, zeroinitializer
16   ret <4 x float> %y
17 }
18
19 ; CHECK: float 3
20 define float @fadd_2const_f32(float %x) #0 {
21 ; CHECK-LABEL: fadd_2const_f32:
22 ; CHECK:       # BB#0:
23 ; CHECK-NEXT:    addss {{.*}}(%rip), %xmm0
24 ; CHECK-NEXT:    retq
25   %y = fadd float %x, 1.0
26   %z = fadd float %y, 2.0
27   ret float %z
28 }
29
30 ; CHECK: float 5.000000e+00
31 ; CHECK: float 5.000000e+00
32 ; CHECK: float 5.000000e+00
33 ; CHECK: float 5.000000e+00
34 define <4 x float> @fadd_2const_4f32(<4 x float> %x) #0 {
35 ; CHECK-LABEL: fadd_2const_4f32:
36 ; CHECK:       # BB#0:
37 ; CHECK-NEXT:    addps {{.*}}(%rip), %xmm0
38 ; CHECK-NEXT:    retq
39   %y = fadd <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
40   %z = fadd <4 x float> %y, <float 4.0, float 3.0, float 2.0, float 1.0>
41   ret <4 x float> %z
42 }
43
44 ; CHECK: float 3
45 define float @fadd_x_fmul_x_c_f32(float %x) #0 {
46 ; CHECK-LABEL: fadd_x_fmul_x_c_f32:
47 ; CHECK:       # BB#0:
48 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
49 ; CHECK-NEXT:    retq
50   %y = fmul float %x, 2.0
51   %z = fadd float %x, %y
52   ret float %z
53 }
54
55 ; CHECK: float 2.000000e+00
56 ; CHECK: float 3.000000e+00
57 ; CHECK: float 4.000000e+00
58 ; CHECK: float 5.000000e+00
59 define <4 x float> @fadd_x_fmul_x_c_4f32(<4 x float> %x) #0 {
60 ; CHECK-LABEL: fadd_x_fmul_x_c_4f32:
61 ; CHECK:       # BB#0:
62 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
63 ; CHECK-NEXT:    retq
64   %y = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
65   %z = fadd <4 x float> %x, %y
66   ret <4 x float> %z
67 }
68
69 ; CHECK: float 3
70 define float @fadd_fmul_x_c_x_f32(float %x) #0 {
71 ; CHECK-LABEL: fadd_fmul_x_c_x_f32:
72 ; CHECK:       # BB#0:
73 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
74 ; CHECK-NEXT:    retq
75   %y = fmul float %x, 2.0
76   %z = fadd float %y, %x
77   ret float %z
78 }
79
80 ; CHECK: float 2.000000e+00
81 ; CHECK: float 3.000000e+00
82 ; CHECK: float 4.000000e+00
83 ; CHECK: float 5.000000e+00
84 define <4 x float> @fadd_fmul_x_c_x_4f32(<4 x float> %x) #0 {
85 ; CHECK-LABEL: fadd_fmul_x_c_x_4f32:
86 ; CHECK:       # BB#0:
87 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
88 ; CHECK-NEXT:    retq
89   %y = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
90   %z = fadd <4 x float> %y, %x
91   ret <4 x float> %z
92 }
93
94 ; CHECK: float 4
95 define float @fadd_fadd_x_x_fmul_x_c_f32(float %x) #0 {
96 ; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_f32:
97 ; CHECK:       # BB#0:
98 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
99 ; CHECK-NEXT:    retq
100   %y = fadd float %x, %x
101   %z = fmul float %x, 2.0
102   %w = fadd float %y, %z
103   ret float %w
104 }
105
106 ; CHECK: float 3.000000e+00
107 ; CHECK: float 4.000000e+00
108 ; CHECK: float 5.000000e+00
109 ; CHECK: float 6.000000e+00
110 define <4 x float> @fadd_fadd_x_x_fmul_x_c_4f32(<4 x float> %x) #0 {
111 ; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_4f32:
112 ; CHECK:       # BB#0:
113 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
114 ; CHECK-NEXT:    retq
115   %y = fadd <4 x float> %x, %x
116   %z = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
117   %w = fadd <4 x float> %y, %z
118   ret <4 x float> %w
119 }
120
121 ; CHECK: float 4
122 define float @fadd_fmul_x_c_fadd_x_x_f32(float %x) #0 {
123 ; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_f32:
124 ; CHECK:       # BB#0:
125 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
126 ; CHECK-NEXT:    retq
127   %y = fadd float %x, %x
128   %z = fmul float %x, 2.0
129   %w = fadd float %z, %y
130   ret float %w
131 }
132
133 ; CHECK: float 3.000000e+00
134 ; CHECK: float 4.000000e+00
135 ; CHECK: float 5.000000e+00
136 ; CHECK: float 6.000000e+00
137 define <4 x float> @fadd_fmul_x_c_fadd_x_x_4f32(<4 x float> %x) #0 {
138 ; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_4f32:
139 ; CHECK:       # BB#0:
140 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
141 ; CHECK-NEXT:    retq
142   %y = fadd <4 x float> %x, %x
143   %z = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
144   %w = fadd <4 x float> %z, %y
145   ret <4 x float> %w
146 }
147
148 ; CHECK: float 3
149 define float @fadd_x_fadd_x_x_f32(float %x) #0 {
150 ; CHECK-LABEL: fadd_x_fadd_x_x_f32:
151 ; CHECK:       # BB#0:
152 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
153 ; CHECK-NEXT:    retq
154   %y = fadd float %x, %x
155   %z = fadd float %x, %y
156   ret float %z
157 }
158
159 ; CHECK: float 3.000000e+00
160 ; CHECK: float 3.000000e+00
161 ; CHECK: float 3.000000e+00
162 ; CHECK: float 3.000000e+00
163 define <4 x float> @fadd_x_fadd_x_x_4f32(<4 x float> %x) #0 {
164 ; CHECK-LABEL: fadd_x_fadd_x_x_4f32:
165 ; CHECK:       # BB#0:
166 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
167 ; CHECK-NEXT:    retq
168   %y = fadd <4 x float> %x, %x
169   %z = fadd <4 x float> %x, %y
170   ret <4 x float> %z
171 }
172
173 ; CHECK: float 3
174 define float @fadd_fadd_x_x_x_f32(float %x) #0 {
175 ; CHECK-LABEL: fadd_fadd_x_x_x_f32:
176 ; CHECK:       # BB#0:
177 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
178 ; CHECK-NEXT:    retq
179   %y = fadd float %x, %x
180   %z = fadd float %y, %x
181   ret float %z
182 }
183
184 ; CHECK: float 3.000000e+00
185 ; CHECK: float 3.000000e+00
186 ; CHECK: float 3.000000e+00
187 ; CHECK: float 3.000000e+00
188 define <4 x float> @fadd_fadd_x_x_x_4f32(<4 x float> %x) #0 {
189 ; CHECK-LABEL: fadd_fadd_x_x_x_4f32:
190 ; CHECK:       # BB#0:
191 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
192 ; CHECK-NEXT:    retq
193   %y = fadd <4 x float> %x, %x
194   %z = fadd <4 x float> %y, %x
195   ret <4 x float> %z
196 }
197
198 ; CHECK: float 4
199 define float @fadd_fadd_x_x_fadd_x_x_f32(float %x) #0 {
200 ; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_f32:
201 ; CHECK:       # BB#0:
202 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
203 ; CHECK-NEXT:    retq
204   %y = fadd float %x, %x
205   %z = fadd float %y, %y
206   ret float %z
207 }
208
209 ; CHECK: float 4.000000e+00
210 ; CHECK: float 4.000000e+00
211 ; CHECK: float 4.000000e+00
212 ; CHECK: float 4.000000e+00
213 define <4 x float> @fadd_fadd_x_x_fadd_x_x_4f32(<4 x float> %x) #0 {
214 ; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_4f32:
215 ; CHECK:       # BB#0:
216 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
217 ; CHECK-NEXT:    retq
218   %y = fadd <4 x float> %x, %x
219   %z = fadd <4 x float> %y, %y
220   ret <4 x float> %z
221 }
222
223 attributes #0 = { "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "unsafe-fp-math"="true" }