1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 ; (X < +/-0.0) ? X : -X --> -fabs(X)
5 ; (X <= +/-0.0) ? X : -X --> -fabs(X)
6 ; One negative test with no fmf
7 define double @select_noFMF_nfabs_lt(double %x) {
8 ; CHECK-LABEL: @select_noFMF_nfabs_lt(
9 ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
10 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
11 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
12 ; CHECK-NEXT: ret double [[SEL]]
14 %cmp = fcmp olt double %x, 0.000000e+00
15 %negX = fneg double %x
16 %sel = select i1 %cmp, double %x, double %negX
20 ; One test where the neg has fmfs.
21 define double @select_nsz_nfabs_lt_fmfProp(double %x) {
22 ; CHECK-LABEL: @select_nsz_nfabs_lt_fmfProp(
23 ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
24 ; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
25 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
26 ; CHECK-NEXT: ret double [[SEL]]
28 %cmp = fcmp olt double %x, 0.000000e+00
29 %negX = fneg fast double %x
30 %sel = select nsz i1 %cmp, double %x, double %negX
34 ; Tests with various predicate types.
35 define double @select_nsz_nfabs_olt(double %x) {
36 ; CHECK-LABEL: @select_nsz_nfabs_olt(
37 ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
38 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
39 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
40 ; CHECK-NEXT: ret double [[SEL]]
42 %cmp = fcmp olt double %x, 0.000000e+00
43 %negX = fneg double %x
44 %sel = select nsz i1 %cmp, double %x, double %negX
48 define double @select_nsz_nfabs_ult(double %x) {
49 ; CHECK-LABEL: @select_nsz_nfabs_ult(
50 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
51 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
52 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
53 ; CHECK-NEXT: ret double [[SEL]]
55 %cmp = fcmp ult double %x, 0.000000e+00
56 %negX = fneg double %x
57 %sel = select nsz i1 %cmp, double %x, double %negX
61 define double @select_nsz_nfabs_ole(double %x) {
62 ; CHECK-LABEL: @select_nsz_nfabs_ole(
63 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
64 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
65 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
66 ; CHECK-NEXT: ret double [[SEL]]
68 %cmp = fcmp ole double %x, 0.000000e+00
69 %negX = fneg double %x
70 %sel = select nsz i1 %cmp, double %x, double %negX
74 define double @select_nsz_nfabs_ule(double %x) {
75 ; CHECK-LABEL: @select_nsz_nfabs_ule(
76 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ule double [[X:%.*]], 0.000000e+00
77 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
78 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]]
79 ; CHECK-NEXT: ret double [[SEL]]
81 %cmp = fcmp ule double %x, 0.000000e+00
82 %negX = fneg double %x
83 %sel = select nsz i1 %cmp, double %x, double %negX
87 ; (X > +/-0.0) ? -X : X --> -fabs(X)
88 ; (X >= +/-0.0) ? -X : X --> -fabs(X)
89 ; One negative test with no fmf
90 define double @select_noFMF_nfabs_gt(double %x) {
91 ; CHECK-LABEL: @select_noFMF_nfabs_gt(
92 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
93 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
94 ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double [[NEGX]], double [[X]]
95 ; CHECK-NEXT: ret double [[SEL]]
97 %cmp = fcmp ogt double %x, 0.000000e+00
98 %negX = fneg double %x
99 %sel = select i1 %cmp, double %negX, double %x
103 ; One test where the neg has fmfs.
104 define double @select_nsz_nfabs_gt_fmfProp(double %x) {
105 ; CHECK-LABEL: @select_nsz_nfabs_gt_fmfProp(
106 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
107 ; CHECK-NEXT: [[NEGX:%.*]] = fneg fast double [[X]]
108 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
109 ; CHECK-NEXT: ret double [[SEL]]
111 %cmp = fcmp ogt double %x, 0.000000e+00
112 %negX = fneg fast double %x
113 %sel = select nsz i1 %cmp, double %negX, double %x
117 ; Tests with various predicate types.
118 define double @select_nsz_nfabs_ogt(double %x) {
119 ; CHECK-LABEL: @select_nsz_nfabs_ogt(
120 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt double [[X:%.*]], 0.000000e+00
121 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
122 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
123 ; CHECK-NEXT: ret double [[SEL]]
125 %cmp = fcmp ogt double %x, 0.000000e+00
126 %negX = fneg double %x
127 %sel = select nsz i1 %cmp, double %negX, double %x
131 define double @select_nsz_nfabs_ugt(double %x) {
132 ; CHECK-LABEL: @select_nsz_nfabs_ugt(
133 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt double [[X:%.*]], 0.000000e+00
134 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
135 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
136 ; CHECK-NEXT: ret double [[SEL]]
138 %cmp = fcmp ugt double %x, 0.000000e+00
139 %negX = fneg double %x
140 %sel = select nsz i1 %cmp, double %negX, double %x
144 define double @select_nsz_nfabs_oge(double %x) {
145 ; CHECK-LABEL: @select_nsz_nfabs_oge(
146 ; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[X:%.*]], 0.000000e+00
147 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
148 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
149 ; CHECK-NEXT: ret double [[SEL]]
151 %cmp = fcmp oge double %x, 0.000000e+00
152 %negX = fneg double %x
153 %sel = select nsz i1 %cmp, double %negX, double %x
157 define double @select_nsz_nfabs_uge(double %x) {
158 ; CHECK-LABEL: @select_nsz_nfabs_uge(
159 ; CHECK-NEXT: [[CMP:%.*]] = fcmp uge double [[X:%.*]], 0.000000e+00
160 ; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]]
161 ; CHECK-NEXT: [[SEL:%.*]] = select nsz i1 [[CMP]], double [[NEGX]], double [[X]]
162 ; CHECK-NEXT: ret double [[SEL]]
164 %cmp = fcmp uge double %x, 0.000000e+00
165 %negX = fneg double %x
166 %sel = select nsz i1 %cmp, double %negX, double %x
170 ; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X))
171 ; One negative test with <=.
172 define double @select_noFMF_fsubfabs_le(double %x) {
173 ; CHECK-LABEL: @select_noFMF_fsubfabs_le(
174 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
175 ; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
176 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
177 ; CHECK-NEXT: ret double [[RETVAL_0]]
179 %cmp = fcmp ole double %x, 0.000000e+00
180 %sub = fsub double 0.000000e+00, %x
181 %retval.0 = select i1 %cmp, double %x, double %sub
185 define double @select_noFMF_fsubfabs_olt(double %x) {
186 ; CHECK-LABEL: @select_noFMF_fsubfabs_olt(
187 ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
188 ; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
189 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
190 ; CHECK-NEXT: ret double [[RETVAL_0]]
192 %cmp = fcmp olt double %x, 0.000000e+00
193 %sub = fsub double 0.000000e+00, %x
194 %retval.0 = select i1 %cmp, double %x, double %sub
198 define double @select_noFMF_fsubfabs_ult(double %x) {
199 ; CHECK-LABEL: @select_noFMF_fsubfabs_ult(
200 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
201 ; CHECK-NEXT: [[SUB:%.*]] = fsub double 0.000000e+00, [[X]]
202 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[SUB]]
203 ; CHECK-NEXT: ret double [[RETVAL_0]]
205 %cmp = fcmp ult double %x, 0.000000e+00
206 %sub = fsub double 0.000000e+00, %x
207 %retval.0 = select i1 %cmp, double %x, double %sub
213 ; (X < +/-0.0) ? X : -X --> -fabs(X)
214 define double @select_nsz_fnegfabs_olt(double %x) {
215 ; CHECK-LABEL: @select_nsz_fnegfabs_olt(
216 ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
217 ; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]]
218 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
219 ; CHECK-NEXT: ret double [[RETVAL_0]]
221 %cmp = fcmp olt double %x, 0.000000e+00
222 %negX = fneg nsz double %x
223 %retval.0 = select i1 %cmp, double %x, double %negX
227 define double @select_nsz_fnegfabs_ult(double %x) {
228 ; CHECK-LABEL: @select_nsz_fnegfabs_ult(
229 ; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00
230 ; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]]
231 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]]
232 ; CHECK-NEXT: ret double [[RETVAL_0]]
234 %cmp = fcmp ult double %x, 0.000000e+00
235 %negX = fneg nsz double %x
236 %retval.0 = select i1 %cmp, double %x, double %negX