OSDN Git Service

[NFC] adding tests for Y - (X + Y) --> -X
[android-x86/external-llvm.git] / test / CodeGen / X86 / fp-fold.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown                        | FileCheck %s --check-prefixes=ANY,STRICT
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -enable-unsafe-fp-math | FileCheck %s --check-prefixes=ANY,UNSAFE
4
5 define float @fadd_zero(float %x) {
6 ; STRICT-LABEL: fadd_zero:
7 ; STRICT:       # %bb.0:
8 ; STRICT-NEXT:    xorps %xmm1, %xmm1
9 ; STRICT-NEXT:    addss %xmm1, %xmm0
10 ; STRICT-NEXT:    retq
11 ;
12 ; UNSAFE-LABEL: fadd_zero:
13 ; UNSAFE:       # %bb.0:
14 ; UNSAFE-NEXT:    retq
15   %r = fadd float %x, 0.0
16   ret float %r
17 }
18
19 define float @fadd_negzero(float %x) {
20 ; ANY-LABEL: fadd_negzero:
21 ; ANY:       # %bb.0:
22 ; ANY-NEXT:    retq
23   %r = fadd float %x, -0.0
24   ret float %r
25 }
26
27 define float @fadd_produce_zero(float %x) {
28 ; ANY-LABEL: fadd_produce_zero:
29 ; ANY:       # %bb.0:
30 ; ANY-NEXT:    xorps %xmm0, %xmm0
31 ; ANY-NEXT:    retq
32   %neg = fsub nsz float 0.0, %x
33   %r = fadd nnan float %neg, %x
34   ret float %r
35 }
36
37 define float @fadd_reassociate(float %x) {
38 ; ANY-LABEL: fadd_reassociate:
39 ; ANY:       # %bb.0:
40 ; ANY-NEXT:    addss {{.*}}(%rip), %xmm0
41 ; ANY-NEXT:    retq
42   %sum = fadd float %x, 8.0
43   %r = fadd reassoc nsz float %sum, 12.0
44   ret float %r
45 }
46
47 define float @fadd_negzero_nsz(float %x) {
48 ; ANY-LABEL: fadd_negzero_nsz:
49 ; ANY:       # %bb.0:
50 ; ANY-NEXT:    retq
51   %r = fadd nsz float %x, -0.0
52   ret float %r
53 }
54
55 define float @fadd_zero_nsz(float %x) {
56 ; ANY-LABEL: fadd_zero_nsz:
57 ; ANY:       # %bb.0:
58 ; ANY-NEXT:    retq
59   %r = fadd nsz float %x, 0.0
60   ret float %r
61 }
62
63 define float @fsub_zero(float %x) {
64 ; ANY-LABEL: fsub_zero:
65 ; ANY:       # %bb.0:
66 ; ANY-NEXT:    retq
67   %r = fsub float %x, 0.0
68   ret float %r
69 }
70
71 define float @fsub_self(float %x) {
72 ; ANY-LABEL: fsub_self:
73 ; ANY:       # %bb.0:
74 ; ANY-NEXT:    xorps %xmm0, %xmm0
75 ; ANY-NEXT:    retq
76   %r = fsub nnan float %x, %x 
77   ret float %r
78 }
79
80 define float @fsub_neg_x_y(float %x, float %y) {
81 ; ANY-LABEL: fsub_neg_x_y:
82 ; ANY:       # %bb.0:
83 ; ANY-NEXT:    subss %xmm0, %xmm1
84 ; ANY-NEXT:    movaps %xmm1, %xmm0
85 ; ANY-NEXT:    retq
86   %neg = fsub nsz float 0.0, %x
87   %r = fadd nsz float %neg, %y
88   ret float %r
89 }
90
91 define float @fsub_neg_y(float %x, float %y) {
92 ; UNSAFE-LABEL: fsub_neg_y:
93 ; UNSAFE:       # %bb.0:
94 ; UNSAFE-NEXT:    mulss {{.*}}(%rip), %xmm0
95 ; UNSAFE-NEXT:    subss %xmm1, %xmm0
96 ; UNSAFE-NEXT:    addss %xmm1, %xmm0
97 ; UNSAFE-NEXT:    retq
98   %mul = fmul float %x, 5.000000e+00
99   %add = fadd float %mul, %y 
100   %r = fsub nsz reassoc float %y, %add 
101   ret float %r
102 }
103
104 define float @fsub_negzero(float %x) {
105 ; STRICT-LABEL: fsub_negzero:
106 ; STRICT:       # %bb.0:
107 ; STRICT-NEXT:    xorps %xmm1, %xmm1
108 ; STRICT-NEXT:    addss %xmm1, %xmm0
109 ; STRICT-NEXT:    retq
110 ;
111 ; UNSAFE-LABEL: fsub_negzero:
112 ; UNSAFE:       # %bb.0:
113 ; UNSAFE-NEXT:    retq
114   %r = fsub float %x, -0.0
115   ret float %r
116 }
117
118 define float @fsub_zero_nsz_1(float %x) {
119 ; ANY-LABEL: fsub_zero_nsz_1:
120 ; ANY:       # %bb.0:
121 ; ANY-NEXT:    retq
122   %r = fsub nsz float %x, 0.0
123   ret float %r
124 }
125
126 define float @fsub_zero_nsz_2(float %x) {
127 ; ANY-LABEL: fsub_zero_nsz_2:
128 ; ANY:       # %bb.0:
129 ; ANY-NEXT:    xorps {{.*}}(%rip), %xmm0
130 ; ANY-NEXT:    retq
131   %r = fsub nsz float 0.0, %x
132   ret float %r
133 }
134
135 define float @fsub_negzero_nsz(float %x) {
136 ; ANY-LABEL: fsub_negzero_nsz:
137 ; ANY:       # %bb.0:
138 ; ANY-NEXT:    retq
139   %r = fsub nsz float %x, -0.0
140   ret float %r
141 }
142
143 define float @fmul_zero(float %x) {
144 ; ANY-LABEL: fmul_zero:
145 ; ANY:       # %bb.0:
146 ; ANY-NEXT:    xorps %xmm0, %xmm0
147 ; ANY-NEXT:    retq
148   %r = fmul nnan nsz float %x, 0.0
149   ret float %r
150 }
151
152 define float @fmul_one(float %x) {
153 ; ANY-LABEL: fmul_one:
154 ; ANY:       # %bb.0:
155 ; ANY-NEXT:    retq
156   %r = fmul float %x, 1.0
157   ret float %r
158 }
159
160 define float @fmul_x_const_const(float %x) {
161 ; ANY-LABEL: fmul_x_const_const:
162 ; ANY:       # %bb.0:
163 ; ANY-NEXT:    mulss {{.*}}(%rip), %xmm0
164 ; ANY-NEXT:    retq
165   %mul = fmul reassoc float %x, 9.0
166   %r = fmul reassoc float %mul, 4.0
167   ret float %r
168 }