]> granicus.if.org Git - llvm/commitdiff
[Coverage] Scan ahead for the most-recent completed count (PR35495)
authorVedant Kumar <vsk@apple.com>
Thu, 7 Dec 2017 00:01:15 +0000 (00:01 +0000)
committerVedant Kumar <vsk@apple.com>
Thu, 7 Dec 2017 00:01:15 +0000 (00:01 +0000)
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

lib/ProfileData/Coverage/CoverageMapping.cpp
unittests/ProfileData/CoverageMappingTest.cpp

index 0d52e48084fae3f386ce8c6a93b1933af08e5ecd..ccc8cc56eb0a02ee90f78690fc355c3f3b8ec4fe 100644 (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);
     }
index 26a8e511b4f98a6912a2a12bda6f88b3e3737d4b..4d0f852da9821be471a9bca733a397ba7208679a 100644 (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) {