From aedc328dead0700fdbce3c58f5cde2c4dadfb70d Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Fri, 23 Jan 2015 18:01:51 +0000 Subject: Fix a bug in the liveness analysis. A range after a loop might also be after a lifetime hole. In this situation we must preserve the hole, and not merge it with the loop start. Change-Id: I82eddef059592102a25362cdaa4273200574c2ae --- compiler/optimizing/live_interval_test.cc | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'compiler/optimizing/live_interval_test.cc') diff --git a/compiler/optimizing/live_interval_test.cc b/compiler/optimizing/live_interval_test.cc index 3e4b83b0b1..ac8759c805 100644 --- a/compiler/optimizing/live_interval_test.cc +++ b/compiler/optimizing/live_interval_test.cc @@ -278,4 +278,55 @@ TEST(LiveInterval, SplitAt) { } } +TEST(LiveInterval, AddLoopRange) { + ArenaPool pool; + ArenaAllocator allocator(&pool); + + { + // Test when only used in a loop. + static constexpr size_t ranges[][2] = {{0, 4}}; + LiveInterval* interval = BuildInterval(ranges, arraysize(ranges), &allocator); + interval->AddLoopRange(0, 8); + LiveRange* range = interval->GetFirstRange(); + ASSERT_TRUE(range->GetNext() == nullptr); + ASSERT_EQ(range->GetStart(), 0u); + ASSERT_EQ(range->GetEnd(), 8u); + } + + { + // Test when only used in a loop. + static constexpr size_t ranges[][2] = {{2, 4}}; + LiveInterval* interval = BuildInterval(ranges, arraysize(ranges), &allocator); + interval->AddLoopRange(0, 8); + LiveRange* range = interval->GetFirstRange(); + ASSERT_TRUE(range->GetNext() == nullptr); + ASSERT_EQ(range->GetStart(), 0u); + ASSERT_EQ(range->GetEnd(), 8u); + } + + { + // Test when used just after the loop. + static constexpr size_t ranges[][2] = {{2, 4}, {8, 10}}; + LiveInterval* interval = BuildInterval(ranges, arraysize(ranges), &allocator); + interval->AddLoopRange(0, 8); + LiveRange* range = interval->GetFirstRange(); + ASSERT_TRUE(range->GetNext() == nullptr); + ASSERT_EQ(range->GetStart(), 0u); + ASSERT_EQ(range->GetEnd(), 10u); + } + + { + // Test when use after the loop is after a lifetime hole. + static constexpr size_t ranges[][2] = {{2, 4}, {10, 12}}; + LiveInterval* interval = BuildInterval(ranges, arraysize(ranges), &allocator); + interval->AddLoopRange(0, 8); + LiveRange* range = interval->GetFirstRange(); + ASSERT_EQ(range->GetStart(), 0u); + ASSERT_EQ(range->GetEnd(), 8u); + range = range->GetNext(); + ASSERT_EQ(range->GetStart(), 10u); + ASSERT_EQ(range->GetEnd(), 12u); + } +} + } // namespace art -- cgit v1.2.3-59-g8ed1b