[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
This commit is contained in:
Vedant Kumar 2017-12-07 00:01:15 +00:00
parent edc3af3e9a
commit dea3d88348
2 changed files with 13 additions and 12 deletions

View File

@ -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);
}

View File

@ -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<CoverageSegment> 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) {