Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(440)

Side by Side Diff: runtime/vm/intermediate_language_test.cc

Issue 328503003: Extend Range analysis to 64-bit range and mint operations (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 #include "vm/unit_test.h" 6 #include "vm/unit_test.h"
7 7
8 namespace dart { 8 namespace dart {
9 9
10 TEST_CASE(InstructionTests) { 10 TEST_CASE(InstructionTests) {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 115
116 Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(), 116 Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(),
117 RangeBoundary::FromConstant(0)); 117 RangeBoundary::FromConstant(0));
118 EXPECT(unsatisfiable_right->IsUnsatisfiable()); 118 EXPECT(unsatisfiable_right->IsUnsatisfiable());
119 119
120 Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0), 120 Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0),
121 RangeBoundary::NegativeInfinity()); 121 RangeBoundary::NegativeInfinity());
122 EXPECT(unsatisfiable_left->IsUnsatisfiable()); 122 EXPECT(unsatisfiable_left->IsUnsatisfiable());
123 } 123 }
124 124
125
126 TEST_CASE(RangeUtils) {
127 // NULL case for IsSmiMinOrUnderflow().
128 EXPECT(Range::IsSmiMinimumOrUnderflow(NULL));
129
130 // Unknown case for IsSmiMinOrUnderflow().
131 EXPECT(Range::IsSmiMinimumOrUnderflow(Range::Unknown()));
132
133 // [-inf, 0] case for IsSmiMinOrUnderflow().
134 EXPECT(Range::IsSmiMinimumOrUnderflow(
135 new Range(RangeBoundary::NegativeInfinity(),
136 RangeBoundary::FromConstant(0))));
137
138 // [0, inf] case for IsSmiMinOrUnderflow().
139 EXPECT(!Range::IsSmiMinimumOrUnderflow(
140 new Range(RangeBoundary::FromConstant(0),
141 RangeBoundary::PositiveInfinity())));
142
143 // [kSmiMin - 1, 0] case for IsSmiMinOrUnderflow().
144 EXPECT(Range::IsSmiMinimumOrUnderflow(
145 new Range(RangeBoundary::FromConstant(kSmiMin - 1),
146 RangeBoundary::FromConstant(0))));
147
148 // [kSmiMin, 0] case for IsSmiMinOrUnderflow().
149 EXPECT(Range::IsSmiMinimumOrUnderflow(
150 new Range(RangeBoundary::FromConstant(kSmiMin),
151 RangeBoundary::FromConstant(0))));
152
153 // [kSmiMin + 1, 0] case for IsSmiMinOrUnderflow().
154 EXPECT(!Range::IsSmiMinimumOrUnderflow(
155 new Range(RangeBoundary::FromConstant(kSmiMin + 1),
156 RangeBoundary::FromConstant(0))));
157
158 // NULL case for IsSmiMaximumOrOverflow().
159 EXPECT(Range::IsSmiMaximumOrOverflow(NULL));
160
161 // Unknown case for IsSmiMaximumOrOverflow().
162 EXPECT(Range::IsSmiMaximumOrOverflow(Range::Unknown()));
163
164 // [-inf, 0] case for IsSmiMaxOrOverflow().
165 EXPECT(!Range::IsSmiMaximumOrOverflow(
166 new Range(RangeBoundary::NegativeInfinity(),
167 RangeBoundary::FromConstant(0))));
168
169 // [0, inf] case for IsSmiMaxOrOverflow().
170 EXPECT(Range::IsSmiMaximumOrOverflow(
171 new Range(RangeBoundary::FromConstant(0),
172 RangeBoundary::PositiveInfinity())));
173
174 // [0, kSmiMax - 1] case for IsSmiMaxOrOverflow().
175 EXPECT(!Range::IsSmiMaximumOrOverflow(
176 new Range(RangeBoundary::FromConstant(0),
177 RangeBoundary::FromConstant(kSmiMax - 1))));
178
179 // [0, kSmiMax] case for IsSmiMaxOrOverflow().
180 EXPECT(Range::IsSmiMaximumOrOverflow(
181 new Range(RangeBoundary::FromConstant(0),
182 RangeBoundary::FromConstant(kSmiMax))));
183
184 // [0, kSmiMax + 1] case for IsSmiMaxOrOverflow().
185 EXPECT(Range::IsSmiMaximumOrOverflow(
186 new Range(RangeBoundary::FromConstant(0),
187 RangeBoundary::FromConstant(kSmiMax + 1))));
188
189 // [-inf, +inf].
190 const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(),
191 RangeBoundary::PositiveInfinity()));
192 // [-inf, -1].
193 const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(),
194 RangeBoundary::FromConstant(-1)));
195 // [-inf, 0].
196 const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(),
197 RangeBoundary::FromConstant(0)));
198 // [-inf, 1].
199 const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(),
200 RangeBoundary::FromConstant(1)));
201 // [-1, +inf]
202 const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1),
203 RangeBoundary::PositiveInfinity()));
204 // [0, +inf]
205 const Range& range_e = *(new Range(RangeBoundary::FromConstant(0),
206 RangeBoundary::PositiveInfinity()));
207 // [1, +inf].
208 const Range& range_f = *(new Range(RangeBoundary::FromConstant(1),
209 RangeBoundary::PositiveInfinity()));
210 // [1, 2].
211 const Range& range_g = *(new Range(RangeBoundary::FromConstant(1),
212 RangeBoundary::FromConstant(2)));
213 // [-1, -2].
214 const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1),
215 RangeBoundary::FromConstant(-2)));
216 // [-1, 1].
217 const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1),
218 RangeBoundary::FromConstant(1)));
219
220 // OnlyPositiveOrZero.
221 EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b));
222 EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c));
223 EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d));
224 EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e));
225 EXPECT(Range::OnlyPositiveOrZero(range_e, range_f));
226 EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d));
227 EXPECT(Range::OnlyPositiveOrZero(range_e, range_e));
228 EXPECT(Range::OnlyPositiveOrZero(range_f, range_g));
229 EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h));
230 EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i));
231
232 // OnlyNegativeOrZero.
233 EXPECT(Range::OnlyNegativeOrZero(range_a, range_b));
234 EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c));
235 EXPECT(Range::OnlyNegativeOrZero(range_b, range_b));
236 EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c));
237 EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d));
238 EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e));
239 EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f));
240 EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g));
241 EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h));
242 EXPECT(Range::OnlyNegativeOrZero(range_h, range_h));
243 EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i));
244
245 // [-inf, +inf].
246 EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0));
247 EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0));
248
249 EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax);
250 EXPECT(Range::ConstantAbsMax(&range_h) == 2);
251 EXPECT(Range::ConstantAbsMax(&range_i) == 1);
252
253 // RangeBOundary.Equals.
254 EXPECT(RangeBoundary::FromConstant(1).Equals(
255 RangeBoundary::FromConstant(1)));
256 EXPECT(!RangeBoundary::FromConstant(2).Equals(
257 RangeBoundary::FromConstant(1)));
258 EXPECT(RangeBoundary::PositiveInfinity().Equals(
259 RangeBoundary::PositiveInfinity()));
260 EXPECT(!RangeBoundary::PositiveInfinity().Equals(
261 RangeBoundary::NegativeInfinity()));
262 EXPECT(RangeBoundary::NegativeInfinity().Equals(
263 RangeBoundary::NegativeInfinity()));
264 EXPECT(!RangeBoundary::NegativeInfinity().Equals(
265 RangeBoundary::PositiveInfinity()));
266 EXPECT(!RangeBoundary::FromConstant(1).Equals(
267 RangeBoundary::NegativeInfinity()));
268 EXPECT(!RangeBoundary::FromConstant(1).Equals(
269 RangeBoundary::NegativeInfinity()));
270 EXPECT(!RangeBoundary::FromConstant(2).Equals(
271 RangeBoundary::PositiveInfinity()));
272 }
273
274
275 TEST_CASE(RangeBinaryOp) {
276 // Test that [0, +inf] + [-inf, 0] = [-inf, +inf].
277 Range* range_a = new Range(RangeBoundary::FromConstant(0),
278 RangeBoundary::PositiveInfinity());
279 EXPECT(range_a->min().Value() == 0);
280 EXPECT(range_a->max().IsPositiveInfinity());
281 Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
282 RangeBoundary::FromConstant(0));
283 EXPECT(range_b->min().IsNegativeInfinity());
284 EXPECT(range_b->max().Value() == 0);
285 Range* result = Range::BinaryOp(Token::kADD,
286 range_a->min(),
287 range_a->max(),
288 range_a,
289 range_b,
290 NULL);
291 ASSERT(result != NULL);
292 EXPECT(result->min().IsNegativeInfinity());
293 EXPECT(result->max().IsPositiveInfinity());
294
295 // Test that [5, 10] + [0, 5] = [5, 15].
296 Range* range_c = new Range(RangeBoundary::FromConstant(5),
297 RangeBoundary::FromConstant(10));
298 Range* range_d = new Range(RangeBoundary::FromConstant(0),
299 RangeBoundary::FromConstant(5));
300 result = Range::BinaryOp(Token::kADD,
301 range_c->min(),
302 range_c->max(),
303 range_c,
304 range_d,
305 NULL);
306 ASSERT(result != NULL);
307 EXPECT(result->min().Value() == 5);
308 EXPECT(result->max().Value() == 15);
309
310
311 // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
312 Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
313 RangeBoundary::FromConstant(0xfff));
314 Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
315 RangeBoundary::FromConstant(0xf));
316 result = Range::BinaryOp(Token::kBIT_AND,
317 range_e->min(),
318 range_e->max(),
319 range_e,
320 range_f,
321 Range::Unknown());
322 ASSERT(result != NULL);
323 EXPECT(result->min().Value() == 0x0);
324 EXPECT(result->max().Value() == 0xf);
325 }
326
327
125 } // namespace dart 328 } // namespace dart
OLDNEW
« runtime/vm/intermediate_language.cc ('K') | « runtime/vm/intermediate_language.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698