[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / fp-fold.ll
blob74b5232a4df62d597323c0072c0a43aabff463d6
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s
3 define float @fadd_zero_strict(float %x) {
4 ; CHECK-LABEL: fadd_zero_strict:
5 ; CHECK:       # %bb.0:
6 ; CHECK-NEXT:    xorps %xmm1, %xmm1
7 ; CHECK-NEXT:    addss %xmm1, %xmm0
8 ; CHECK-NEXT:    retq
9   %r = fadd float %x, 0.0
10   ret float %r
13 define float @fadd_negzero(float %x) {
14 ; CHECK-LABEL: fadd_negzero:
15 ; CHECK:       # %bb.0:
16 ; CHECK-NEXT:    retq
17   %r = fadd float %x, -0.0
18   ret float %r
21 define float @fadd_produce_zero(float %x) {
22 ; CHECK-LABEL: fadd_produce_zero:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    xorps %xmm0, %xmm0
25 ; CHECK-NEXT:    retq
26   %neg = fsub nsz float 0.0, %x
27   %r = fadd nnan float %neg, %x
28   ret float %r
31 define float @fadd_reassociate(float %x) {
32 ; CHECK-LABEL: fadd_reassociate:
33 ; CHECK:       # %bb.0:
34 ; CHECK-NEXT:    addss {{.*}}(%rip), %xmm0
35 ; CHECK-NEXT:    retq
36   %sum = fadd float %x, 8.0
37   %r = fadd reassoc nsz float %sum, 12.0
38   ret float %r
41 define float @fadd_negzero_nsz(float %x) {
42 ; CHECK-LABEL: fadd_negzero_nsz:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    retq
45   %r = fadd nsz float %x, -0.0
46   ret float %r
49 define float @fadd_zero_nsz(float %x) {
50 ; CHECK-LABEL: fadd_zero_nsz:
51 ; CHECK:       # %bb.0:
52 ; CHECK-NEXT:    retq
53   %r = fadd nsz float %x, 0.0
54   ret float %r
57 define float @fsub_zero(float %x) {
58 ; CHECK-LABEL: fsub_zero:
59 ; CHECK:       # %bb.0:
60 ; CHECK-NEXT:    retq
61   %r = fsub float %x, 0.0
62   ret float %r
65 define float @fsub_self(float %x) {
66 ; CHECK-LABEL: fsub_self:
67 ; CHECK:       # %bb.0:
68 ; CHECK-NEXT:    xorps %xmm0, %xmm0
69 ; CHECK-NEXT:    retq
70   %r = fsub nnan float %x, %x
71   ret float %r
74 define float @fsub_neg_x_y(float %x, float %y) {
75 ; CHECK-LABEL: fsub_neg_x_y:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    subss %xmm0, %xmm1
78 ; CHECK-NEXT:    movaps %xmm1, %xmm0
79 ; CHECK-NEXT:    retq
80   %neg = fsub nsz float 0.0, %x
81   %r = fadd nsz float %neg, %y
82   ret float %r
85 define float @fsub_neg_y(float %x, float %y) {
86 ; CHECK-LABEL: fsub_neg_y:
87 ; CHECK:       # %bb.0:
88 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
89 ; CHECK-NEXT:    retq
90   %mul = fmul float %x, 5.0
91   %add = fadd float %mul, %y
92   %r = fsub nsz reassoc float %y, %add
93   ret float %r
96 define <4 x float> @fsub_neg_y_vector(<4 x float> %x, <4 x float> %y) {
97 ; CHECK-LABEL: fsub_neg_y_vector:
98 ; CHECK:       # %bb.0:
99 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
100 ; CHECK-NEXT:    retq
101   %mul = fmul <4 x float> %x, <float 5.0, float 5.0, float 5.0, float 5.0>
102   %add = fadd <4 x float> %mul, %y
103   %r = fsub nsz reassoc <4 x float> %y, %add
104   ret <4 x float> %r
107 define <4 x float> @fsub_neg_y_vector_nonuniform(<4 x float> %x, <4 x float> %y) {
108 ; CHECK-LABEL: fsub_neg_y_vector_nonuniform:
109 ; CHECK:       # %bb.0:
110 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
111 ; CHECK-NEXT:    retq
112   %mul = fmul <4 x float> %x, <float 5.0, float 6.0, float 7.0, float 8.0>
113   %add = fadd <4 x float> %mul, %y
114   %r = fsub nsz reassoc <4 x float> %y, %add
115   ret <4 x float> %r
118 define float @fsub_neg_y_commute(float %x, float %y) {
119 ; CHECK-LABEL: fsub_neg_y_commute:
120 ; CHECK:       # %bb.0:
121 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
122 ; CHECK-NEXT:    retq
123   %mul = fmul float %x, 5.0
124   %add = fadd float %y, %mul
125   %r = fsub nsz reassoc float %y, %add
126   ret float %r
129 define <4 x float> @fsub_neg_y_commute_vector(<4 x float> %x, <4 x float> %y) {
130 ; CHECK-LABEL: fsub_neg_y_commute_vector:
131 ; CHECK:       # %bb.0:
132 ; CHECK-NEXT:    mulps {{.*}}(%rip), %xmm0
133 ; CHECK-NEXT:    retq
134   %mul = fmul <4 x float> %x, <float 5.0, float 5.0, float 5.0, float 5.0>
135   %add = fadd <4 x float> %y, %mul
136   %r = fsub nsz reassoc <4 x float> %y, %add
137   ret <4 x float> %r
140 ; Y - (X + Y) --> -X
142 define float @fsub_fadd_common_op_fneg(float %x, float %y) {
143 ; CHECK-LABEL: fsub_fadd_common_op_fneg:
144 ; CHECK:       # %bb.0:
145 ; CHECK-NEXT:    xorps {{.*}}(%rip), %xmm0
146 ; CHECK-NEXT:    retq
147   %a = fadd float %x, %y
148   %r = fsub reassoc nsz float %y, %a
149   ret float %r
152 ; Y - (X + Y) --> -X
154 define <4 x float> @fsub_fadd_common_op_fneg_vec(<4 x float> %x, <4 x float> %y) {
155 ; CHECK-LABEL: fsub_fadd_common_op_fneg_vec:
156 ; CHECK:       # %bb.0:
157 ; CHECK-NEXT:    xorps {{.*}}(%rip), %xmm0
158 ; CHECK-NEXT:    retq
159   %a = fadd <4 x float> %x, %y
160   %r = fsub nsz reassoc <4 x float> %y, %a
161   ret <4 x float> %r
164 ; Y - (Y + X) --> -X
165 ; Commute operands of the 'add'.
167 define float @fsub_fadd_common_op_fneg_commute(float %x, float %y) {
168 ; CHECK-LABEL: fsub_fadd_common_op_fneg_commute:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    xorps {{.*}}(%rip), %xmm0
171 ; CHECK-NEXT:    retq
172   %a = fadd float %y, %x
173   %r = fsub reassoc nsz float %y, %a
174   ret float %r
177 ; Y - (Y + X) --> -X
179 define <4 x float> @fsub_fadd_common_op_fneg_commute_vec(<4 x float> %x, <4 x float> %y) {
180 ; CHECK-LABEL: fsub_fadd_common_op_fneg_commute_vec:
181 ; CHECK:       # %bb.0:
182 ; CHECK-NEXT:    xorps {{.*}}(%rip), %xmm0
183 ; CHECK-NEXT:    retq
184   %a = fadd <4 x float> %y, %x
185   %r = fsub reassoc nsz <4 x float> %y, %a
186   ret <4 x float> %r
189 define float @fsub_negzero_strict(float %x) {
190 ; CHECK-LABEL: fsub_negzero_strict:
191 ; CHECK:       # %bb.0:
192 ; CHECK-NEXT:    xorps %xmm1, %xmm1
193 ; CHECK-NEXT:    addss %xmm1, %xmm0
194 ; CHECK-NEXT:    retq
195   %r = fsub float %x, -0.0
196   ret float %r
199 define float @fsub_negzero_nsz(float %x) {
200 ; CHECK-LABEL: fsub_negzero_nsz:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    retq
203   %r = fsub nsz float %x, -0.0
204   ret float %r
207 define <4 x float> @fsub_negzero_strict_vector(<4 x float> %x) {
208 ; CHECK-LABEL: fsub_negzero_strict_vector:
209 ; CHECK:       # %bb.0:
210 ; CHECK-NEXT:    xorps %xmm1, %xmm1
211 ; CHECK-NEXT:    addps %xmm1, %xmm0
212 ; CHECK-NEXT:    retq
213   %r = fsub <4 x float> %x, <float -0.0, float -0.0, float -0.0, float -0.0>
214   ret <4 x float> %r
217 define <4 x float> @fsub_negzero_nsz_vector(<4 x float> %x) {
218 ; CHECK-LABEL: fsub_negzero_nsz_vector:
219 ; CHECK:       # %bb.0:
220 ; CHECK-NEXT:    retq
221   %r = fsub nsz <4 x float> %x, <float -0.0, float -0.0, float -0.0, float -0.0>
222   ret <4 x float> %r
225 define float @fsub_zero_nsz_1(float %x) {
226 ; CHECK-LABEL: fsub_zero_nsz_1:
227 ; CHECK:       # %bb.0:
228 ; CHECK-NEXT:    retq
229   %r = fsub nsz float %x, 0.0
230   ret float %r
233 define float @fsub_zero_nsz_2(float %x) {
234 ; CHECK-LABEL: fsub_zero_nsz_2:
235 ; CHECK:       # %bb.0:
236 ; CHECK-NEXT:    xorps {{.*}}(%rip), %xmm0
237 ; CHECK-NEXT:    retq
238   %r = fsub nsz float 0.0, %x
239   ret float %r
242 define float @fmul_zero(float %x) {
243 ; CHECK-LABEL: fmul_zero:
244 ; CHECK:       # %bb.0:
245 ; CHECK-NEXT:    xorps %xmm0, %xmm0
246 ; CHECK-NEXT:    retq
247   %r = fmul nnan nsz float %x, 0.0
248   ret float %r
251 define float @fmul_one(float %x) {
252 ; CHECK-LABEL: fmul_one:
253 ; CHECK:       # %bb.0:
254 ; CHECK-NEXT:    retq
255   %r = fmul float %x, 1.0
256   ret float %r
259 define float @fmul_x_const_const(float %x) {
260 ; CHECK-LABEL: fmul_x_const_const:
261 ; CHECK:       # %bb.0:
262 ; CHECK-NEXT:    mulss {{.*}}(%rip), %xmm0
263 ; CHECK-NEXT:    retq
264   %mul = fmul reassoc float %x, 9.0
265   %r = fmul reassoc float %mul, 4.0
266   ret float %r