[llvm] r319990 - [Coverage] Scan ahead for the most-recent completed count (PR35495)

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 6 16:01:16 PST 2017


Author: vedantk
Date: Wed Dec  6 16:01:15 2017
New Revision: 319990

URL: http://llvm.org/viewvc/llvm-project?rev=319990&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/ProfileData/Coverage/CoverageMapping.cpp
    llvm/trunk/unittests/ProfileData/CoverageMappingTest.cpp

Modified: llvm/trunk/lib/ProfileData/Coverage/CoverageMapping.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/Coverage/CoverageMapping.cpp?rev=319990&r1=319989&r2=319990&view=diff
==============================================================================
--- llvm/trunk/lib/ProfileData/Coverage/CoverageMapping.cpp (original)
+++ llvm/trunk/lib/ProfileData/Coverage/CoverageMapping.cpp Wed Dec  6 16:01:15 2017
@@ -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);
     }

Modified: llvm/trunk/unittests/ProfileData/CoverageMappingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ProfileData/CoverageMappingTest.cpp?rev=319990&r1=319989&r2=319990&view=diff
==============================================================================
--- llvm/trunk/unittests/ProfileData/CoverageMappingTest.cpp (original)
+++ llvm/trunk/unittests/ProfileData/CoverageMappingTest.cpp Wed Dec  6 16:01:15 2017
@@ -470,8 +470,9 @@ TEST_P(CoverageMappingTest, multiple_com
   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_com
   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) {




More information about the llvm-commits mailing list