OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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/flow_graph_range_analysis.h" | 5 #include "vm/flow_graph_range_analysis.h" |
6 #include "vm/unit_test.h" | 6 #include "vm/unit_test.h" |
7 | 7 |
8 namespace dart { | 8 namespace dart { |
9 | 9 |
10 | |
11 TEST_CASE(RangeTests) { | 10 TEST_CASE(RangeTests) { |
12 Range* zero = new Range( | 11 Range* zero = new Range( |
13 RangeBoundary::FromConstant(0), | 12 RangeBoundary::FromConstant(0), |
14 RangeBoundary::FromConstant(0)); | 13 RangeBoundary::FromConstant(0)); |
15 Range* positive = new Range( | 14 Range* positive = new Range( |
16 RangeBoundary::FromConstant(0), | 15 RangeBoundary::FromConstant(0), |
17 RangeBoundary::FromConstant(100)); | 16 RangeBoundary::FromConstant(100)); |
18 Range* negative = new Range( | 17 Range* negative = new Range( |
19 RangeBoundary::FromConstant(-1), | 18 RangeBoundary::FromConstant(-1), |
20 RangeBoundary::FromConstant(-100)); | 19 RangeBoundary::FromConstant(-100)); |
(...skipping 15 matching lines...) Expand all Loading... |
36 Range* left_range = new Range( \ | 35 Range* left_range = new Range( \ |
37 RangeBoundary::FromConstant(l_min), \ | 36 RangeBoundary::FromConstant(l_min), \ |
38 RangeBoundary::FromConstant(l_max)); \ | 37 RangeBoundary::FromConstant(l_max)); \ |
39 Range* shift_range = new Range( \ | 38 Range* shift_range = new Range( \ |
40 RangeBoundary::FromConstant(r_min), \ | 39 RangeBoundary::FromConstant(r_min), \ |
41 RangeBoundary::FromConstant(r_max)); \ | 40 RangeBoundary::FromConstant(r_max)); \ |
42 Op(left_range, shift_range, &min, &max); \ | 41 Op(left_range, shift_range, &min, &max); \ |
43 min = Clamp(min); \ | 42 min = Clamp(min); \ |
44 max = Clamp(max); \ | 43 max = Clamp(max); \ |
45 EXPECT(min.Equals(res_min)); \ | 44 EXPECT(min.Equals(res_min)); \ |
46 if (!min.Equals(res_min)) OS::Print("%s\n", min.ToCString()); \ | 45 if (FLAG_support_il_printer && !min.Equals(res_min)) { \ |
| 46 OS::Print("%s\n", min.ToCString()); \ |
| 47 } \ |
47 EXPECT(max.Equals(res_max)); \ | 48 EXPECT(max.Equals(res_max)); \ |
48 if (!max.Equals(res_max)) OS::Print("%s\n", max.ToCString()); \ | 49 if (FLAG_support_il_printer && !max.Equals(res_max)) { \ |
| 50 OS::Print("%s\n", max.ToCString()); \ |
| 51 } \ |
49 } | 52 } |
50 | 53 |
51 #define NO_CLAMP(b) (b) | 54 #define NO_CLAMP(b) (b) |
52 #define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max) \ | 55 #define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max) \ |
53 TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, \ | 56 TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, \ |
54 NO_CLAMP, result_min, result_max) | 57 NO_CLAMP, result_min, result_max) |
55 | 58 |
56 #define CLAMP_TO_SMI(b) (b.Clamp(RangeBoundary::kRangeBoundarySmi)) | 59 #define CLAMP_TO_SMI(b) (b.Clamp(RangeBoundary::kRangeBoundarySmi)) |
57 #define TEST_RANGE_OP_SMI(Op, l_min, l_max, r_min, r_max, res_min, res_max) \ | 60 #define TEST_RANGE_OP_SMI(Op, l_min, l_max, r_min, r_max, res_min, res_max) \ |
58 TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, \ | 61 TEST_RANGE_OP_(Op, l_min, l_max, r_min, r_max, \ |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 RangeBoundary::FromConstant(l_max)); \ | 323 RangeBoundary::FromConstant(l_max)); \ |
321 Range* right_range = new Range( \ | 324 Range* right_range = new Range( \ |
322 RangeBoundary::FromConstant(r_min), \ | 325 RangeBoundary::FromConstant(r_min), \ |
323 RangeBoundary::FromConstant(r_max)); \ | 326 RangeBoundary::FromConstant(r_max)); \ |
324 EXPECT(left_range->min().ConstantValue() == l_min); \ | 327 EXPECT(left_range->min().ConstantValue() == l_min); \ |
325 EXPECT(left_range->max().ConstantValue() == l_max); \ | 328 EXPECT(left_range->max().ConstantValue() == l_max); \ |
326 EXPECT(right_range->min().ConstantValue() == r_min); \ | 329 EXPECT(right_range->min().ConstantValue() == r_min); \ |
327 EXPECT(right_range->max().ConstantValue() == r_max); \ | 330 EXPECT(right_range->max().ConstantValue() == r_max); \ |
328 Range::Add(left_range, right_range, &min, &max, NULL); \ | 331 Range::Add(left_range, right_range, &min, &max, NULL); \ |
329 EXPECT(min.Equals(result_min)); \ | 332 EXPECT(min.Equals(result_min)); \ |
330 if (!min.Equals(result_min)) { \ | 333 if (FLAG_support_il_printer && !min.Equals(result_min)) { \ |
331 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | 334 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ |
332 } \ | 335 } \ |
333 EXPECT(max.Equals(result_max)); \ | 336 EXPECT(max.Equals(result_max)); \ |
334 if (!max.Equals(result_max)) { \ | 337 if (FLAG_support_il_printer && !max.Equals(result_max)) { \ |
335 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | 338 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ |
336 } \ | 339 } \ |
337 } | 340 } |
338 | 341 |
339 // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35]. | 342 // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35]. |
340 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32), | 343 TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32), |
341 static_cast<int64_t>(kMaxInt32) + 15, | 344 static_cast<int64_t>(kMaxInt32) + 15, |
342 static_cast<int64_t>(10), | 345 static_cast<int64_t>(10), |
343 static_cast<int64_t>(20), | 346 static_cast<int64_t>(20), |
344 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10), | 347 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10), |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 RangeBoundary::FromConstant(l_max)); \ | 418 RangeBoundary::FromConstant(l_max)); \ |
416 Range* right_range = new Range( \ | 419 Range* right_range = new Range( \ |
417 RangeBoundary::FromConstant(r_min), \ | 420 RangeBoundary::FromConstant(r_min), \ |
418 RangeBoundary::FromConstant(r_max)); \ | 421 RangeBoundary::FromConstant(r_max)); \ |
419 EXPECT(left_range->min().ConstantValue() == l_min); \ | 422 EXPECT(left_range->min().ConstantValue() == l_min); \ |
420 EXPECT(left_range->max().ConstantValue() == l_max); \ | 423 EXPECT(left_range->max().ConstantValue() == l_max); \ |
421 EXPECT(right_range->min().ConstantValue() == r_min); \ | 424 EXPECT(right_range->min().ConstantValue() == r_min); \ |
422 EXPECT(right_range->max().ConstantValue() == r_max); \ | 425 EXPECT(right_range->max().ConstantValue() == r_max); \ |
423 Range::Sub(left_range, right_range, &min, &max, NULL); \ | 426 Range::Sub(left_range, right_range, &min, &max, NULL); \ |
424 EXPECT(min.Equals(result_min)); \ | 427 EXPECT(min.Equals(result_min)); \ |
425 if (!min.Equals(result_min)) { \ | 428 if (FLAG_support_il_printer && !min.Equals(result_min)) { \ |
426 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | 429 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ |
427 } \ | 430 } \ |
428 EXPECT(max.Equals(result_max)); \ | 431 EXPECT(max.Equals(result_max)); \ |
429 if (!max.Equals(result_max)) { \ | 432 if (FLAG_support_il_printer && !max.Equals(result_max)) { \ |
430 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | 433 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ |
431 } \ | 434 } \ |
432 } | 435 } |
433 | 436 |
434 // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5]. | 437 // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5]. |
435 TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32), | 438 TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32), |
436 static_cast<int64_t>(kMaxInt32) + 15, | 439 static_cast<int64_t>(kMaxInt32) + 15, |
437 static_cast<int64_t>(10), | 440 static_cast<int64_t>(10), |
438 static_cast<int64_t>(20), | 441 static_cast<int64_t>(20), |
439 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20), | 442 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
478 RangeBoundary::FromConstant(l_max)); \ | 481 RangeBoundary::FromConstant(l_max)); \ |
479 Range* right_range = new Range( \ | 482 Range* right_range = new Range( \ |
480 RangeBoundary::FromConstant(r_min), \ | 483 RangeBoundary::FromConstant(r_min), \ |
481 RangeBoundary::FromConstant(r_max)); \ | 484 RangeBoundary::FromConstant(r_max)); \ |
482 EXPECT(left_range->min().ConstantValue() == l_min); \ | 485 EXPECT(left_range->min().ConstantValue() == l_min); \ |
483 EXPECT(left_range->max().ConstantValue() == l_max); \ | 486 EXPECT(left_range->max().ConstantValue() == l_max); \ |
484 EXPECT(right_range->min().ConstantValue() == r_min); \ | 487 EXPECT(right_range->min().ConstantValue() == r_min); \ |
485 EXPECT(right_range->max().ConstantValue() == r_max); \ | 488 EXPECT(right_range->max().ConstantValue() == r_max); \ |
486 Range::And(left_range, right_range, &min, &max); \ | 489 Range::And(left_range, right_range, &min, &max); \ |
487 EXPECT(min.Equals(result_min)); \ | 490 EXPECT(min.Equals(result_min)); \ |
488 if (!min.Equals(result_min)) { \ | 491 if (FLAG_support_il_printer && !min.Equals(result_min)) { \ |
489 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ | 492 OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString()); \ |
490 } \ | 493 } \ |
491 EXPECT(max.Equals(result_max)); \ | 494 EXPECT(max.Equals(result_max)); \ |
492 if (!max.Equals(result_max)) { \ | 495 if (FLAG_support_il_printer && !max.Equals(result_max)) { \ |
493 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ | 496 OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString()); \ |
494 } \ | 497 } \ |
495 } | 498 } |
496 | 499 |
497 // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf]. | 500 // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf]. |
498 TEST_RANGE_AND(static_cast<int64_t>(0xff), | 501 TEST_RANGE_AND(static_cast<int64_t>(0xff), |
499 static_cast<int64_t>(0xfff), | 502 static_cast<int64_t>(0xfff), |
500 static_cast<int64_t>(0xf), | 503 static_cast<int64_t>(0xf), |
501 static_cast<int64_t>(0xf), | 504 static_cast<int64_t>(0xf), |
502 RangeBoundary(0), | 505 RangeBoundary(0), |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 p_infinity, | 699 p_infinity, |
697 size).IsMaximumOrAbove(size)); | 700 size).IsMaximumOrAbove(size)); |
698 | 701 |
699 EXPECT(RangeBoundary::JoinMax( | 702 EXPECT(RangeBoundary::JoinMax( |
700 p_infinity, | 703 p_infinity, |
701 RangeBoundary::FromConstant(1), | 704 RangeBoundary::FromConstant(1), |
702 size).IsMaximumOrAbove(size)); | 705 size).IsMaximumOrAbove(size)); |
703 } | 706 } |
704 | 707 |
705 } // namespace dart | 708 } // namespace dart |
OLD | NEW |