5eb455d14c15c74b2d441285cd68aa7c4b373648
[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:    xorps %xmm1, %xmm1
15 ; CHECK-NEXT:    addps %xmm1, %xmm0
16 ; CHECK-NEXT:    retq
17   %y = fadd <4 x float> %x, zeroinitializer
18   ret <4 x float> %y
19 }
20
21 define float @fadd_2const_f32(float %x) #0 {
22 ; CHECK-LABEL: fadd_2const_f32:
23 ; CHECK:       # BB#0:
24 ; CHECK-NEXT:    addss {{.*}}(%rip), %xmm0
25 ; CHECK-NEXT:    retq
26   %y = fadd float %x, 1.0
27   %z = fadd float %y, 2.0
28   ret float %z
29 }
30
31 define <4 x float> @fadd_2const_4f32(<4 x float> %x) #0 {
32 ; CHECK-LABEL: fadd_2const_4f32:
33 ; CHECK:       # BB#0:
34 ; CHECK-NEXT:    addps {{.*}}(%rip), %xmm0
35 ; CHECK-NEXT:    addps {{.*}}(%rip), %xmm0
36 ; CHECK-NEXT:    retq
37   %y = fadd <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
38   %z = fadd <4 x float> %y, <float 4.0, float 3.0, float 2.0, float 1.0>
39   ret <4 x float> %z
40 }
41
42 define float @fadd_x_fmul_x_c_f32(float %x) #0 {
43 ; CHECK-LABEL: fadd_x_fmul_x_c_f32:
44 ; CHECK:       # BB#0:
45 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
46 ; CHECK-NEXT:    retq
47   %y = fmul float %x, 2.0
48   %z = fadd float %x, %y
49   ret float %z
50 }
51
52 define <4 x float> @fadd_x_fmul_x_c_4f32(<4 x float> %x) #0 {
53 ; CHECK-LABEL: fadd_x_fmul_x_c_4f32:
54 ; CHECK:       # BB#0:
55 ; CHECK-NEXT:    movaps {{.*#+}} xmm1 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
56 ; CHECK-NEXT:    mulps %xmm0, %xmm1
57 ; CHECK-NEXT:    addps %xmm1, %xmm0
58 ; CHECK-NEXT:    retq
59   %y = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
60   %z = fadd <4 x float> %x, %y
61   ret <4 x float> %z
62 }
63
64 define float @fadd_fmul_x_c_x_f32(float %x) #0 {
65 ; CHECK-LABEL: fadd_fmul_x_c_x_f32:
66 ; CHECK:       # BB#0:
67 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
68 ; CHECK-NEXT:    retq
69   %y = fmul float %x, 2.0
70   %z = fadd float %y, %x
71   ret float %z
72 }
73
74 define <4 x float> @fadd_fmul_x_c_x_4f32(<4 x float> %x) #0 {
75 ; CHECK-LABEL: fadd_fmul_x_c_x_4f32:
76 ; CHECK:       # BB#0:
77 ; CHECK-NEXT:    movaps {{.*#+}} xmm1 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
78 ; CHECK-NEXT:    mulps %xmm0, %xmm1
79 ; CHECK-NEXT:    addps %xmm1, %xmm0
80 ; CHECK-NEXT:    retq
81   %y = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
82   %z = fadd <4 x float> %y, %x
83   ret <4 x float> %z
84 }
85
86 define float @fadd_fadd_x_x_fmul_x_c_f32(float %x) #0 {
87 ; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_f32:
88 ; CHECK:       # BB#0:
89 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
90 ; CHECK-NEXT:    retq
91   %y = fadd float %x, %x
92   %z = fmul float %x, 2.0
93   %w = fadd float %y, %z
94   ret float %w
95 }
96
97 define <4 x float> @fadd_fadd_x_x_fmul_x_c_4f32(<4 x float> %x) #0 {
98 ; CHECK-LABEL: fadd_fadd_x_x_fmul_x_c_4f32:
99 ; CHECK:       # BB#0:
100 ; CHECK-NEXT:    movaps {{.*#+}} xmm1 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
101 ; CHECK-NEXT:    mulps %xmm0, %xmm1
102 ; CHECK-NEXT:    addps %xmm0, %xmm1
103 ; CHECK-NEXT:    addps %xmm1, %xmm0
104 ; CHECK-NEXT:    retq
105   %y = fadd <4 x float> %x, %x
106   %z = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
107   %w = fadd <4 x float> %y, %z
108   ret <4 x float> %w
109 }
110
111 define float @fadd_fmul_x_c_fadd_x_x_f32(float %x) #0 {
112 ; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_f32:
113 ; CHECK:       # BB#0:
114 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
115 ; CHECK-NEXT:    retq
116   %y = fadd float %x, %x
117   %z = fmul float %x, 2.0
118   %w = fadd float %z, %y
119   ret float %w
120 }
121
122 define <4 x float> @fadd_fmul_x_c_fadd_x_x_4f32(<4 x float> %x) #0 {
123 ; CHECK-LABEL: fadd_fmul_x_c_fadd_x_x_4f32:
124 ; CHECK:       # BB#0:
125 ; CHECK-NEXT:    movaps {{.*#+}} xmm1 = [1.000000e+00,2.000000e+00,3.000000e+00,4.000000e+00]
126 ; CHECK-NEXT:    mulps %xmm0, %xmm1
127 ; CHECK-NEXT:    addps %xmm0, %xmm1
128 ; CHECK-NEXT:    addps %xmm1, %xmm0
129 ; CHECK-NEXT:    retq
130   %y = fadd <4 x float> %x, %x
131   %z = fmul <4 x float> %x, <float 1.0, float 2.0, float 3.0, float 4.0>
132   %w = fadd <4 x float> %z, %y
133   ret <4 x float> %w
134 }
135
136 define float @fadd_x_fadd_x_x_f32(float %x) #0 {
137 ; CHECK-LABEL: fadd_x_fadd_x_x_f32:
138 ; CHECK:       # BB#0:
139 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
140 ; CHECK-NEXT:    retq
141   %y = fadd float %x, %x
142   %z = fadd float %x, %y
143   ret float %z
144 }
145
146 define <4 x float> @fadd_x_fadd_x_x_4f32(<4 x float> %x) #0 {
147 ; CHECK-LABEL: fadd_x_fadd_x_x_4f32:
148 ; CHECK:       # BB#0:
149 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
150 ; CHECK-NEXT:    retq
151   %y = fadd <4 x float> %x, %x
152   %z = fadd <4 x float> %x, %y
153   ret <4 x float> %z
154 }
155
156 define float @fadd_fadd_x_x_x_f32(float %x) #0 {
157 ; CHECK-LABEL: fadd_fadd_x_x_x_f32:
158 ; CHECK:       # BB#0:
159 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
160 ; CHECK-NEXT:    retq
161   %y = fadd float %x, %x
162   %z = fadd float %y, %x
163   ret float %z
164 }
165
166 define <4 x float> @fadd_fadd_x_x_x_4f32(<4 x float> %x) #0 {
167 ; CHECK-LABEL: fadd_fadd_x_x_x_4f32:
168 ; CHECK:       # BB#0:
169 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
170 ; CHECK-NEXT:    retq
171   %y = fadd <4 x float> %x, %x
172   %z = fadd <4 x float> %y, %x
173   ret <4 x float> %z
174 }
175
176 define float @fadd_fadd_x_x_fadd_x_x_f32(float %x) #0 {
177 ; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_f32:
178 ; CHECK:       # BB#0:
179 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
180 ; CHECK-NEXT:    retq
181   %y = fadd float %x, %x
182   %z = fadd float %y, %y
183   ret float %z
184 }
185
186 define <4 x float> @fadd_fadd_x_x_fadd_x_x_4f32(<4 x float> %x) #0 {
187 ; CHECK-LABEL: fadd_fadd_x_x_fadd_x_x_4f32:
188 ; CHECK:       # BB#0:
189 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
190 ; CHECK-NEXT:    retq
191   %y = fadd <4 x float> %x, %x
192   %z = fadd <4 x float> %y, %y
193   ret <4 x float> %z
194 }
195
196 attributes #0 = { "less-precise-fpmad"="true" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "unsafe-fp-math"="true" }