From: Vedant Kumar Date: Thu, 7 Dec 2017 00:01:15 +0000 (+0000) Subject: [Coverage] Scan ahead for the most-recent completed count (PR35495) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dea3d88348ba066bdd7b3e12d908f64addfa055d;p=llvm [Coverage] Scan ahead for the most-recent completed count (PR35495) This extends r319391. It teaches the segment builder to emit the right completed segment when more than one region ends at the same location. Fixes PR35495. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319990 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ProfileData/Coverage/CoverageMapping.cpp b/lib/ProfileData/Coverage/CoverageMapping.cpp index 0d52e48084f..ccc8cc56eb0 100644 --- a/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -388,11 +388,10 @@ class SegmentBuilder { if (CompletedSegmentLoc == CompletedRegion->endLoc()) continue; - // Use the count from the next completed region if it ends at the same - // location. - if (I + 1 < E && - CompletedRegion->endLoc() == ActiveRegions[I + 1]->endLoc()) - CompletedRegion = ActiveRegions[I + 1]; + // Use the count from the last completed region which ends at this loc. + for (unsigned J = I + 1; J < E; ++J) + if (CompletedRegion->endLoc() == ActiveRegions[J]->endLoc()) + CompletedRegion = ActiveRegions[J]; startSegment(*CompletedRegion, CompletedSegmentLoc, false); } diff --git a/unittests/ProfileData/CoverageMappingTest.cpp b/unittests/ProfileData/CoverageMappingTest.cpp index 26a8e511b4f..4d0f852da98 100644 --- a/unittests/ProfileData/CoverageMappingTest.cpp +++ b/unittests/ProfileData/CoverageMappingTest.cpp @@ -470,8 +470,9 @@ TEST_P(CoverageMappingTest, multiple_completed_segments_at_same_loc) { ProfileWriter.addRecord({"func1", 0x1234, {0, 1, 2}}, Err); startFunction("func1", 0x1234); - // PR35437 + // PR35495 addCMR(Counter::getCounter(1), "file1", 2, 1, 18, 2); + addCMR(Counter::getCounter(0), "file1", 8, 10, 14, 6); addCMR(Counter::getCounter(0), "file1", 8, 12, 14, 6); addCMR(Counter::getCounter(1), "file1", 9, 1, 14, 6); addCMR(Counter::getCounter(2), "file1", 11, 13, 11, 14); @@ -482,14 +483,15 @@ TEST_P(CoverageMappingTest, multiple_completed_segments_at_same_loc) { CoverageData Data = LoadedCoverage->getCoverageForFunction(FunctionRecord); std::vector Segments(Data.begin(), Data.end()); - ASSERT_EQ(6U, Segments.size()); + ASSERT_EQ(7U, Segments.size()); EXPECT_EQ(CoverageSegment(2, 1, 1, true), Segments[0]); - EXPECT_EQ(CoverageSegment(8, 12, 0, true), Segments[1]); - EXPECT_EQ(CoverageSegment(9, 1, 1, true), Segments[2]); - EXPECT_EQ(CoverageSegment(11, 13, 2, true), Segments[3]); + EXPECT_EQ(CoverageSegment(8, 10, 0, true), Segments[1]); + EXPECT_EQ(CoverageSegment(8, 12, 0, true), Segments[2]); + EXPECT_EQ(CoverageSegment(9, 1, 1, true), Segments[3]); + EXPECT_EQ(CoverageSegment(11, 13, 2, true), Segments[4]); // Use count=1 (from 9:1 -> 14:6), not count=0 (from 8:12 -> 14:6). - EXPECT_EQ(CoverageSegment(11, 14, 1, false), Segments[4]); - EXPECT_EQ(CoverageSegment(18, 2, false), Segments[5]); + EXPECT_EQ(CoverageSegment(11, 14, 1, false), Segments[5]); + EXPECT_EQ(CoverageSegment(18, 2, false), Segments[6]); } TEST_P(CoverageMappingTest, dont_emit_redundant_segments) {