| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 #include "test/unittests/compiler/live-range-builder.h" | 6 #include "test/unittests/compiler/live-range-builder.h" |
| 7 #include "test/unittests/test-utils.h" | 7 #include "test/unittests/test-utils.h" |
| 8 | 8 |
| 9 | 9 |
| 10 // TODO(mtrofin): would we want to centralize this definition? | 10 // TODO(mtrofin): would we want to centralize this definition? |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 class LiveRangeUnitTest : public TestWithZone { | 25 class LiveRangeUnitTest : public TestWithZone { |
| 26 public: | 26 public: |
| 27 // Split helper, to avoid int->LifetimePosition conversion nuisance. | 27 // Split helper, to avoid int->LifetimePosition conversion nuisance. |
| 28 LiveRange* Split(LiveRange* range, int pos) { | 28 LiveRange* Split(LiveRange* range, int pos) { |
| 29 return range->SplitAt(LifetimePosition::FromInt(pos), zone()); | 29 return range->SplitAt(LifetimePosition::FromInt(pos), zone()); |
| 30 } | 30 } |
| 31 | 31 |
| 32 | 32 |
| 33 TopLevelLiveRange* Splinter(TopLevelLiveRange* top, int start, int end, | 33 TopLevelLiveRange* Splinter(TopLevelLiveRange* top, int start, int end, |
| 34 int new_id = 0) { | 34 int new_id = 0) { |
| 35 TopLevelLiveRange* ret = | 35 if (top->splinter() == nullptr) { |
| 36 new (zone()) TopLevelLiveRange(new_id, MachineType::kRepTagged); | 36 TopLevelLiveRange* ret = |
| 37 new (zone()) TopLevelLiveRange(new_id, MachineType::kRepTagged); |
| 38 top->SetSplinter(ret); |
| 39 } |
| 37 top->Splinter(LifetimePosition::FromInt(start), | 40 top->Splinter(LifetimePosition::FromInt(start), |
| 38 LifetimePosition::FromInt(end), ret, zone()); | 41 LifetimePosition::FromInt(end), zone()); |
| 39 return ret; | 42 return top->splinter(); |
| 40 } | 43 } |
| 41 | 44 |
| 42 // Ranges first and second match structurally. | 45 // Ranges first and second match structurally. |
| 43 bool RangesMatch(LiveRange* first, LiveRange* second) { | 46 bool RangesMatch(LiveRange* first, LiveRange* second) { |
| 44 if (first->Start() != second->Start() || first->End() != second->End()) { | 47 if (first->Start() != second->Start() || first->End() != second->End()) { |
| 45 return false; | 48 return false; |
| 46 } | 49 } |
| 47 UseInterval* i1 = first->first_interval(); | 50 UseInterval* i1 = first->first_interval(); |
| 48 UseInterval* i2 = second->first_interval(); | 51 UseInterval* i2 = second->first_interval(); |
| 49 | 52 |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 EXPECT_EQ(range, splinter->splintered_from()); | 373 EXPECT_EQ(range, splinter->splintered_from()); |
| 371 | 374 |
| 372 TopLevelLiveRange* expected_source = | 375 TopLevelLiveRange* expected_source = |
| 373 TestRangeBuilder(zone()).Add(0, 3).Add(6, 8).Build(); | 376 TestRangeBuilder(zone()).Add(0, 3).Add(6, 8).Build(); |
| 374 TopLevelLiveRange* expected_splinter = TestRangeBuilder(zone()).Build(5, 6); | 377 TopLevelLiveRange* expected_splinter = TestRangeBuilder(zone()).Build(5, 6); |
| 375 EXPECT_TRUE(RangesMatch(expected_source, range)); | 378 EXPECT_TRUE(RangesMatch(expected_source, range)); |
| 376 EXPECT_TRUE(RangesMatch(expected_splinter, splinter)); | 379 EXPECT_TRUE(RangesMatch(expected_splinter, splinter)); |
| 377 } | 380 } |
| 378 | 381 |
| 379 | 382 |
| 383 TEST_F(LiveRangeUnitTest, SplinterMergeMultipleTimes) { |
| 384 TopLevelLiveRange* range = |
| 385 TestRangeBuilder(zone()).Add(0, 3).Add(5, 10).Add(12, 16).Build(); |
| 386 Splinter(range, 4, 6); |
| 387 Splinter(range, 8, 14); |
| 388 TopLevelLiveRange* splinter = range->splinter(); |
| 389 EXPECT_EQ(nullptr, range->next()); |
| 390 EXPECT_EQ(nullptr, splinter->next()); |
| 391 EXPECT_EQ(range, splinter->splintered_from()); |
| 392 |
| 393 TopLevelLiveRange* expected_source = |
| 394 TestRangeBuilder(zone()).Add(0, 3).Add(6, 8).Add(14, 16).Build(); |
| 395 TopLevelLiveRange* expected_splinter = |
| 396 TestRangeBuilder(zone()).Add(5, 6).Add(8, 10).Add(12, 14).Build(); |
| 397 EXPECT_TRUE(RangesMatch(expected_source, range)); |
| 398 EXPECT_TRUE(RangesMatch(expected_splinter, splinter)); |
| 399 } |
| 400 |
| 401 |
| 380 TEST_F(LiveRangeUnitTest, MergeMultipleIntervalsRight) { | 402 TEST_F(LiveRangeUnitTest, MergeMultipleIntervalsRight) { |
| 381 TopLevelLiveRange* original = | 403 TopLevelLiveRange* original = |
| 382 TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build(); | 404 TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build(); |
| 383 TopLevelLiveRange* splinter = Splinter(original, 4, 6); | 405 TopLevelLiveRange* splinter = Splinter(original, 4, 6); |
| 384 original->Merge(splinter, zone()); | 406 original->Merge(splinter, zone()); |
| 385 | 407 |
| 386 TopLevelLiveRange* result = | 408 TopLevelLiveRange* result = |
| 387 TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build(); | 409 TestRangeBuilder(zone()).Add(0, 3).Add(5, 8).Build(); |
| 388 LiveRange* child_1 = Split(result, 5); | 410 LiveRange* child_1 = Split(result, 5); |
| 389 Split(child_1, 6); | 411 Split(child_1, 6); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 409 } | 431 } |
| 410 | 432 |
| 411 | 433 |
| 412 TEST_F(LiveRangeUnitTest, IDGeneration) { | 434 TEST_F(LiveRangeUnitTest, IDGeneration) { |
| 413 TopLevelLiveRange* vreg = TestRangeBuilder(zone()).Id(2).Build(0, 100); | 435 TopLevelLiveRange* vreg = TestRangeBuilder(zone()).Id(2).Build(0, 100); |
| 414 EXPECT_EQ(2, vreg->vreg()); | 436 EXPECT_EQ(2, vreg->vreg()); |
| 415 EXPECT_EQ(0, vreg->relative_id()); | 437 EXPECT_EQ(0, vreg->relative_id()); |
| 416 | 438 |
| 417 TopLevelLiveRange* splinter = | 439 TopLevelLiveRange* splinter = |
| 418 new (zone()) TopLevelLiveRange(101, MachineType::kRepTagged); | 440 new (zone()) TopLevelLiveRange(101, MachineType::kRepTagged); |
| 441 vreg->SetSplinter(splinter); |
| 419 vreg->Splinter(LifetimePosition::FromInt(4), LifetimePosition::FromInt(12), | 442 vreg->Splinter(LifetimePosition::FromInt(4), LifetimePosition::FromInt(12), |
| 420 splinter, zone()); | 443 zone()); |
| 421 | 444 |
| 422 EXPECT_EQ(101, splinter->vreg()); | 445 EXPECT_EQ(101, splinter->vreg()); |
| 423 EXPECT_EQ(1, splinter->relative_id()); | 446 EXPECT_EQ(1, splinter->relative_id()); |
| 424 | 447 |
| 425 LiveRange* child = vreg->SplitAt(LifetimePosition::FromInt(50), zone()); | 448 LiveRange* child = vreg->SplitAt(LifetimePosition::FromInt(50), zone()); |
| 426 | 449 |
| 427 EXPECT_EQ(2, child->relative_id()); | 450 EXPECT_EQ(2, child->relative_id()); |
| 428 | 451 |
| 429 LiveRange* splinter_child = | 452 LiveRange* splinter_child = |
| 430 splinter->SplitAt(LifetimePosition::FromInt(8), zone()); | 453 splinter->SplitAt(LifetimePosition::FromInt(8), zone()); |
| 431 | 454 |
| 432 EXPECT_EQ(1, splinter->relative_id()); | 455 EXPECT_EQ(1, splinter->relative_id()); |
| 433 EXPECT_EQ(3, splinter_child->relative_id()); | 456 EXPECT_EQ(3, splinter_child->relative_id()); |
| 434 | 457 |
| 435 vreg->Merge(splinter, zone()); | 458 vreg->Merge(splinter, zone()); |
| 436 EXPECT_EQ(1, splinter->relative_id()); | 459 EXPECT_EQ(1, splinter->relative_id()); |
| 437 } | 460 } |
| 438 | 461 |
| 439 } // namespace compiler | 462 } // namespace compiler |
| 440 } // namespace internal | 463 } // namespace internal |
| 441 } // namespace v8 | 464 } // namespace v8 |
| OLD | NEW |