https://github.com/chapuni updated https://github.com/llvm/llvm-project/pull/110972
>From 178b57cbbcb2b21b7d13f90ffd75903417913438 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi <geek4ci...@gmail.com> Date: Wed, 2 Oct 2024 23:11:36 +0900 Subject: [PATCH 1/5] [Coverage] Move SingleByteCoverage out of CountedRegion `SingleByteCoverage` is not per-region attribute at least. At the moment, this change moves it into `FunctionRecord`. --- .../ProfileData/Coverage/CoverageMapping.h | 27 +++++++------- .../ProfileData/Coverage/CoverageMapping.cpp | 36 ++++++++++++------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index fa07b3a9e8b14f..77c447efe1a7c9 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -359,19 +359,15 @@ struct CountedRegion : public CounterMappingRegion { uint64_t ExecutionCount; uint64_t FalseExecutionCount; bool Folded; - bool HasSingleByteCoverage; - CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount, - bool HasSingleByteCoverage) + CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount) : CounterMappingRegion(R), ExecutionCount(ExecutionCount), - FalseExecutionCount(0), Folded(false), - HasSingleByteCoverage(HasSingleByteCoverage) {} + FalseExecutionCount(0), Folded(false) {} CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount, - uint64_t FalseExecutionCount, bool HasSingleByteCoverage) + uint64_t FalseExecutionCount) : CounterMappingRegion(R), ExecutionCount(ExecutionCount), - FalseExecutionCount(FalseExecutionCount), Folded(false), - HasSingleByteCoverage(HasSingleByteCoverage) {} + FalseExecutionCount(FalseExecutionCount), Folded(false) {} }; /// MCDC Record grouping all information together. @@ -702,9 +698,12 @@ struct FunctionRecord { std::vector<MCDCRecord> MCDCRecords; /// The number of times this function was executed. uint64_t ExecutionCount = 0; + bool SingleByteCoverage; - FunctionRecord(StringRef Name, ArrayRef<StringRef> Filenames) - : Name(Name), Filenames(Filenames.begin(), Filenames.end()) {} + FunctionRecord(StringRef Name, ArrayRef<StringRef> Filenames, + bool SingleByteCoverage) + : Name(Name), Filenames(Filenames.begin(), Filenames.end()), + SingleByteCoverage(SingleByteCoverage) {} FunctionRecord(FunctionRecord &&FR) = default; FunctionRecord &operator=(FunctionRecord &&) = default; @@ -714,11 +713,10 @@ struct FunctionRecord { } void pushRegion(CounterMappingRegion Region, uint64_t Count, - uint64_t FalseCount, bool HasSingleByteCoverage) { + uint64_t FalseCount) { if (Region.Kind == CounterMappingRegion::BranchRegion || Region.Kind == CounterMappingRegion::MCDCBranchRegion) { - CountedBranchRegions.emplace_back(Region, Count, FalseCount, - HasSingleByteCoverage); + CountedBranchRegions.emplace_back(Region, Count, FalseCount); // If both counters are hard-coded to zero, then this region represents a // constant-folded branch. if (Region.Count.isZero() && Region.FalseCount.isZero()) @@ -727,8 +725,7 @@ struct FunctionRecord { } if (CountedRegions.empty()) ExecutionCount = Count; - CountedRegions.emplace_back(Region, Count, FalseCount, - HasSingleByteCoverage); + CountedRegions.emplace_back(Region, Count, FalseCount); } }; diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 18643c6b44485e..a02136d5b0386d 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -808,6 +808,7 @@ Error CoverageMapping::loadFunctionRecord( else OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]); + bool SingleByteCoverage = ProfileReader.hasSingleByteCoverage(); CounterMappingContext Ctx(Record.Expressions); std::vector<uint64_t> Counts; @@ -855,7 +856,7 @@ Error CoverageMapping::loadFunctionRecord( return Error::success(); MCDCDecisionRecorder MCDCDecisions; - FunctionRecord Function(OrigFuncName, Record.Filenames); + FunctionRecord Function(OrigFuncName, Record.Filenames, SingleByteCoverage); for (const auto &Region : Record.MappingRegions) { // MCDCDecisionRegion should be handled first since it overlaps with // others inside. @@ -873,8 +874,7 @@ Error CoverageMapping::loadFunctionRecord( consumeError(std::move(E)); return Error::success(); } - Function.pushRegion(Region, *ExecutionCount, *AltExecutionCount, - ProfileReader.hasSingleByteCoverage()); + Function.pushRegion(Region, *ExecutionCount, *AltExecutionCount); // Record ExpansionRegion. if (Region.Kind == CounterMappingRegion::ExpansionRegion) { @@ -1270,7 +1270,8 @@ class SegmentBuilder { /// Combine counts of regions which cover the same area. static ArrayRef<CountedRegion> - combineRegions(MutableArrayRef<CountedRegion> Regions) { + combineRegions(MutableArrayRef<CountedRegion> Regions, + bool SingleByteCoverage) { if (Regions.empty()) return Regions; auto Active = Regions.begin(); @@ -1297,9 +1298,7 @@ class SegmentBuilder { // We add counts of the regions of the same kind as the active region // to handle the both situations. if (I->Kind == Active->Kind) { - assert(I->HasSingleByteCoverage == Active->HasSingleByteCoverage && - "Regions are generated in different coverage modes"); - if (I->HasSingleByteCoverage) + if (SingleByteCoverage) Active->ExecutionCount = Active->ExecutionCount || I->ExecutionCount; else Active->ExecutionCount += I->ExecutionCount; @@ -1311,12 +1310,14 @@ class SegmentBuilder { public: /// Build a sorted list of CoverageSegments from a list of Regions. static std::vector<CoverageSegment> - buildSegments(MutableArrayRef<CountedRegion> Regions) { + buildSegments(MutableArrayRef<CountedRegion> Regions, + bool SingleByteCoverage) { std::vector<CoverageSegment> Segments; SegmentBuilder Builder(Segments); sortNestedRegions(Regions); - ArrayRef<CountedRegion> CombinedRegions = combineRegions(Regions); + ArrayRef<CountedRegion> CombinedRegions = + combineRegions(Regions, SingleByteCoverage); LLVM_DEBUG({ dbgs() << "Combined regions:\n"; @@ -1403,10 +1404,14 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const { // the filename, we may get back some records that are not in the file. ArrayRef<unsigned> RecordIndices = getImpreciseRecordIndicesForFilename(Filename); + std::optional<bool> SingleByteCoverage; for (unsigned RecordIndex : RecordIndices) { const FunctionRecord &Function = Functions[RecordIndex]; auto MainFileID = findMainViewFileID(Filename, Function); auto FileIDs = gatherFileIDs(Filename, Function); + assert(!SingleByteCoverage || + *SingleByteCoverage == Function.SingleByteCoverage); + SingleByteCoverage = Function.SingleByteCoverage; for (const auto &CR : Function.CountedRegions) if (FileIDs.test(CR.FileID)) { Regions.push_back(CR); @@ -1424,7 +1429,8 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const { } LLVM_DEBUG(dbgs() << "Emitting segments for file: " << Filename << "\n"); - FileCoverage.Segments = SegmentBuilder::buildSegments(Regions); + FileCoverage.Segments = + SegmentBuilder::buildSegments(Regions, *SingleByteCoverage); return FileCoverage; } @@ -1480,7 +1486,8 @@ CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) const { LLVM_DEBUG(dbgs() << "Emitting segments for function: " << Function.Name << "\n"); - FunctionCoverage.Segments = SegmentBuilder::buildSegments(Regions); + FunctionCoverage.Segments = + SegmentBuilder::buildSegments(Regions, Function.SingleByteCoverage); return FunctionCoverage; } @@ -1490,8 +1497,12 @@ CoverageData CoverageMapping::getCoverageForExpansion( CoverageData ExpansionCoverage( Expansion.Function.Filenames[Expansion.FileID]); std::vector<CountedRegion> Regions; + std::optional<bool> SingleByteCoverage; for (const auto &CR : Expansion.Function.CountedRegions) if (CR.FileID == Expansion.FileID) { + assert(!SingleByteCoverage || + *SingleByteCoverage == Expansion.Function.SingleByteCoverage); + SingleByteCoverage = Expansion.Function.SingleByteCoverage; Regions.push_back(CR); if (isExpansion(CR, Expansion.FileID)) ExpansionCoverage.Expansions.emplace_back(CR, Expansion.Function); @@ -1503,7 +1514,8 @@ CoverageData CoverageMapping::getCoverageForExpansion( LLVM_DEBUG(dbgs() << "Emitting segments for expansion of file " << Expansion.FileID << "\n"); - ExpansionCoverage.Segments = SegmentBuilder::buildSegments(Regions); + ExpansionCoverage.Segments = + SegmentBuilder::buildSegments(Regions, *SingleByteCoverage); return ExpansionCoverage; } >From aacb50ddf87d96b4a0644c7ef5d0a86dc94f069b Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi <geek4ci...@gmail.com> Date: Wed, 2 Oct 2024 23:25:52 +0900 Subject: [PATCH 2/5] [Coverage] Make SingleByteCoverage work consistent to merging - Round `Counts` as 1/0 - Confirm both `ExecutionCount` and `AltExecutionCount` are in range. --- compiler-rt/test/profile/instrprof-block-coverage.c | 2 +- compiler-rt/test/profile/instrprof-entry-coverage.c | 2 +- llvm/include/llvm/ProfileData/InstrProf.h | 5 ++++- llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 3 +++ llvm/lib/ProfileData/InstrProf.cpp | 2 +- llvm/lib/ProfileData/InstrProfReader.cpp | 1 + 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/compiler-rt/test/profile/instrprof-block-coverage.c b/compiler-rt/test/profile/instrprof-block-coverage.c index 829d5af8dc3f9e..8d924e1cac64d8 100644 --- a/compiler-rt/test/profile/instrprof-block-coverage.c +++ b/compiler-rt/test/profile/instrprof-block-coverage.c @@ -49,4 +49,4 @@ int main(int argc, char *argv[]) { // CHECK-ERROR-NOT: warning: {{.*}}: Found inconsistent block coverage -// COUNTS: Maximum function count: 4 +// COUNTS: Maximum function count: 1 diff --git a/compiler-rt/test/profile/instrprof-entry-coverage.c b/compiler-rt/test/profile/instrprof-entry-coverage.c index 1c6816ba01964b..b93a4e0c43ccd6 100644 --- a/compiler-rt/test/profile/instrprof-entry-coverage.c +++ b/compiler-rt/test/profile/instrprof-entry-coverage.c @@ -36,4 +36,4 @@ int main(int argc, char *argv[]) { // CHECK-DAG: foo // CHECK-DAG: bar -// COUNTS: Maximum function count: 2 +// COUNTS: Maximum function count: 1 diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index b0b2258735e2ae..df9e76966bf42b 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -830,6 +830,7 @@ struct InstrProfValueSiteRecord { /// Profiling information for a single function. struct InstrProfRecord { std::vector<uint64_t> Counts; + bool SingleByteCoverage = false; std::vector<uint8_t> BitmapBytes; InstrProfRecord() = default; @@ -839,13 +840,15 @@ struct InstrProfRecord { : Counts(std::move(Counts)), BitmapBytes(std::move(BitmapBytes)) {} InstrProfRecord(InstrProfRecord &&) = default; InstrProfRecord(const InstrProfRecord &RHS) - : Counts(RHS.Counts), BitmapBytes(RHS.BitmapBytes), + : Counts(RHS.Counts), SingleByteCoverage(RHS.SingleByteCoverage), + BitmapBytes(RHS.BitmapBytes), ValueData(RHS.ValueData ? std::make_unique<ValueProfData>(*RHS.ValueData) : nullptr) {} InstrProfRecord &operator=(InstrProfRecord &&) = default; InstrProfRecord &operator=(const InstrProfRecord &RHS) { Counts = RHS.Counts; + SingleByteCoverage = RHS.SingleByteCoverage; BitmapBytes = RHS.BitmapBytes; if (!RHS.ValueData) { ValueData = nullptr; diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index a02136d5b0386d..bc765c59381718 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -874,6 +874,9 @@ Error CoverageMapping::loadFunctionRecord( consumeError(std::move(E)); return Error::success(); } + assert(!SingleByteCoverage || + (0 <= *ExecutionCount && *ExecutionCount <= 1 && + 0 <= *AltExecutionCount && *AltExecutionCount <= 1)); Function.pushRegion(Region, *ExecutionCount, *AltExecutionCount); // Record ExpansionRegion. diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index b9937c9429b77d..0f6677b4d35718 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -952,7 +952,7 @@ void InstrProfRecord::merge(InstrProfRecord &Other, uint64_t Weight, Value = getInstrMaxCountValue(); Overflowed = true; } - Counts[I] = Value; + Counts[I] = (SingleByteCoverage && Value != 0 ? 1 : Value); if (Overflowed) Warn(instrprof_error::counter_overflow); } diff --git a/llvm/lib/ProfileData/InstrProfReader.cpp b/llvm/lib/ProfileData/InstrProfReader.cpp index b90617c74f6d13..a07d7f573275ba 100644 --- a/llvm/lib/ProfileData/InstrProfReader.cpp +++ b/llvm/lib/ProfileData/InstrProfReader.cpp @@ -743,6 +743,7 @@ Error RawInstrProfReader<IntPtrT>::readRawCounts( Record.Counts.clear(); Record.Counts.reserve(NumCounters); + Record.SingleByteCoverage = hasSingleByteCoverage(); for (uint32_t I = 0; I < NumCounters; I++) { const char *Ptr = CountersStart + CounterBaseOffset + I * getCounterTypeSize(); >From b9bbc7cac3076594cd326ffa7f2d4fc4a92fabb9 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi <geek4ci...@gmail.com> Date: Sat, 5 Oct 2024 10:43:26 +0900 Subject: [PATCH 3/5] Rework. (Also reverts "[Coverage] Move SingleByteCoverage out of CountedRegion") --- .../test/profile/instrprof-block-coverage.c | 2 +- .../test/profile/instrprof-entry-coverage.c | 2 +- .../ProfileData/Coverage/CoverageMapping.h | 27 +++++++------ llvm/include/llvm/ProfileData/InstrProf.h | 5 +-- .../ProfileData/Coverage/CoverageMapping.cpp | 40 +++++++------------ llvm/lib/ProfileData/InstrProf.cpp | 2 +- llvm/lib/ProfileData/InstrProfReader.cpp | 1 - 7 files changed, 33 insertions(+), 46 deletions(-) diff --git a/compiler-rt/test/profile/instrprof-block-coverage.c b/compiler-rt/test/profile/instrprof-block-coverage.c index 8d924e1cac64d8..829d5af8dc3f9e 100644 --- a/compiler-rt/test/profile/instrprof-block-coverage.c +++ b/compiler-rt/test/profile/instrprof-block-coverage.c @@ -49,4 +49,4 @@ int main(int argc, char *argv[]) { // CHECK-ERROR-NOT: warning: {{.*}}: Found inconsistent block coverage -// COUNTS: Maximum function count: 1 +// COUNTS: Maximum function count: 4 diff --git a/compiler-rt/test/profile/instrprof-entry-coverage.c b/compiler-rt/test/profile/instrprof-entry-coverage.c index b93a4e0c43ccd6..1c6816ba01964b 100644 --- a/compiler-rt/test/profile/instrprof-entry-coverage.c +++ b/compiler-rt/test/profile/instrprof-entry-coverage.c @@ -36,4 +36,4 @@ int main(int argc, char *argv[]) { // CHECK-DAG: foo // CHECK-DAG: bar -// COUNTS: Maximum function count: 1 +// COUNTS: Maximum function count: 2 diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index 77c447efe1a7c9..fa07b3a9e8b14f 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -359,15 +359,19 @@ struct CountedRegion : public CounterMappingRegion { uint64_t ExecutionCount; uint64_t FalseExecutionCount; bool Folded; + bool HasSingleByteCoverage; - CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount) + CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount, + bool HasSingleByteCoverage) : CounterMappingRegion(R), ExecutionCount(ExecutionCount), - FalseExecutionCount(0), Folded(false) {} + FalseExecutionCount(0), Folded(false), + HasSingleByteCoverage(HasSingleByteCoverage) {} CountedRegion(const CounterMappingRegion &R, uint64_t ExecutionCount, - uint64_t FalseExecutionCount) + uint64_t FalseExecutionCount, bool HasSingleByteCoverage) : CounterMappingRegion(R), ExecutionCount(ExecutionCount), - FalseExecutionCount(FalseExecutionCount), Folded(false) {} + FalseExecutionCount(FalseExecutionCount), Folded(false), + HasSingleByteCoverage(HasSingleByteCoverage) {} }; /// MCDC Record grouping all information together. @@ -698,12 +702,9 @@ struct FunctionRecord { std::vector<MCDCRecord> MCDCRecords; /// The number of times this function was executed. uint64_t ExecutionCount = 0; - bool SingleByteCoverage; - FunctionRecord(StringRef Name, ArrayRef<StringRef> Filenames, - bool SingleByteCoverage) - : Name(Name), Filenames(Filenames.begin(), Filenames.end()), - SingleByteCoverage(SingleByteCoverage) {} + FunctionRecord(StringRef Name, ArrayRef<StringRef> Filenames) + : Name(Name), Filenames(Filenames.begin(), Filenames.end()) {} FunctionRecord(FunctionRecord &&FR) = default; FunctionRecord &operator=(FunctionRecord &&) = default; @@ -713,10 +714,11 @@ struct FunctionRecord { } void pushRegion(CounterMappingRegion Region, uint64_t Count, - uint64_t FalseCount) { + uint64_t FalseCount, bool HasSingleByteCoverage) { if (Region.Kind == CounterMappingRegion::BranchRegion || Region.Kind == CounterMappingRegion::MCDCBranchRegion) { - CountedBranchRegions.emplace_back(Region, Count, FalseCount); + CountedBranchRegions.emplace_back(Region, Count, FalseCount, + HasSingleByteCoverage); // If both counters are hard-coded to zero, then this region represents a // constant-folded branch. if (Region.Count.isZero() && Region.FalseCount.isZero()) @@ -725,7 +727,8 @@ struct FunctionRecord { } if (CountedRegions.empty()) ExecutionCount = Count; - CountedRegions.emplace_back(Region, Count, FalseCount); + CountedRegions.emplace_back(Region, Count, FalseCount, + HasSingleByteCoverage); } }; diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index df9e76966bf42b..b0b2258735e2ae 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -830,7 +830,6 @@ struct InstrProfValueSiteRecord { /// Profiling information for a single function. struct InstrProfRecord { std::vector<uint64_t> Counts; - bool SingleByteCoverage = false; std::vector<uint8_t> BitmapBytes; InstrProfRecord() = default; @@ -840,15 +839,13 @@ struct InstrProfRecord { : Counts(std::move(Counts)), BitmapBytes(std::move(BitmapBytes)) {} InstrProfRecord(InstrProfRecord &&) = default; InstrProfRecord(const InstrProfRecord &RHS) - : Counts(RHS.Counts), SingleByteCoverage(RHS.SingleByteCoverage), - BitmapBytes(RHS.BitmapBytes), + : Counts(RHS.Counts), BitmapBytes(RHS.BitmapBytes), ValueData(RHS.ValueData ? std::make_unique<ValueProfData>(*RHS.ValueData) : nullptr) {} InstrProfRecord &operator=(InstrProfRecord &&) = default; InstrProfRecord &operator=(const InstrProfRecord &RHS) { Counts = RHS.Counts; - SingleByteCoverage = RHS.SingleByteCoverage; BitmapBytes = RHS.BitmapBytes; if (!RHS.ValueData) { ValueData = nullptr; diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index bc765c59381718..9a03dede84b6df 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -856,7 +856,7 @@ Error CoverageMapping::loadFunctionRecord( return Error::success(); MCDCDecisionRecorder MCDCDecisions; - FunctionRecord Function(OrigFuncName, Record.Filenames, SingleByteCoverage); + FunctionRecord Function(OrigFuncName, Record.Filenames); for (const auto &Region : Record.MappingRegions) { // MCDCDecisionRegion should be handled first since it overlaps with // others inside. @@ -874,10 +874,10 @@ Error CoverageMapping::loadFunctionRecord( consumeError(std::move(E)); return Error::success(); } - assert(!SingleByteCoverage || - (0 <= *ExecutionCount && *ExecutionCount <= 1 && - 0 <= *AltExecutionCount && *AltExecutionCount <= 1)); - Function.pushRegion(Region, *ExecutionCount, *AltExecutionCount); + Function.pushRegion( + Region, (SingleByteCoverage && *ExecutionCount ? 1 : *ExecutionCount), + (SingleByteCoverage && *AltExecutionCount ? 1 : *AltExecutionCount), + SingleByteCoverage); // Record ExpansionRegion. if (Region.Kind == CounterMappingRegion::ExpansionRegion) { @@ -1273,8 +1273,7 @@ class SegmentBuilder { /// Combine counts of regions which cover the same area. static ArrayRef<CountedRegion> - combineRegions(MutableArrayRef<CountedRegion> Regions, - bool SingleByteCoverage) { + combineRegions(MutableArrayRef<CountedRegion> Regions) { if (Regions.empty()) return Regions; auto Active = Regions.begin(); @@ -1301,7 +1300,9 @@ class SegmentBuilder { // We add counts of the regions of the same kind as the active region // to handle the both situations. if (I->Kind == Active->Kind) { - if (SingleByteCoverage) + assert(I->HasSingleByteCoverage == Active->HasSingleByteCoverage && + "Regions are generated in different coverage modes"); + if (I->HasSingleByteCoverage) Active->ExecutionCount = Active->ExecutionCount || I->ExecutionCount; else Active->ExecutionCount += I->ExecutionCount; @@ -1313,14 +1314,12 @@ class SegmentBuilder { public: /// Build a sorted list of CoverageSegments from a list of Regions. static std::vector<CoverageSegment> - buildSegments(MutableArrayRef<CountedRegion> Regions, - bool SingleByteCoverage) { + buildSegments(MutableArrayRef<CountedRegion> Regions) { std::vector<CoverageSegment> Segments; SegmentBuilder Builder(Segments); sortNestedRegions(Regions); - ArrayRef<CountedRegion> CombinedRegions = - combineRegions(Regions, SingleByteCoverage); + ArrayRef<CountedRegion> CombinedRegions = combineRegions(Regions); LLVM_DEBUG({ dbgs() << "Combined regions:\n"; @@ -1407,14 +1406,10 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const { // the filename, we may get back some records that are not in the file. ArrayRef<unsigned> RecordIndices = getImpreciseRecordIndicesForFilename(Filename); - std::optional<bool> SingleByteCoverage; for (unsigned RecordIndex : RecordIndices) { const FunctionRecord &Function = Functions[RecordIndex]; auto MainFileID = findMainViewFileID(Filename, Function); auto FileIDs = gatherFileIDs(Filename, Function); - assert(!SingleByteCoverage || - *SingleByteCoverage == Function.SingleByteCoverage); - SingleByteCoverage = Function.SingleByteCoverage; for (const auto &CR : Function.CountedRegions) if (FileIDs.test(CR.FileID)) { Regions.push_back(CR); @@ -1432,8 +1427,7 @@ CoverageData CoverageMapping::getCoverageForFile(StringRef Filename) const { } LLVM_DEBUG(dbgs() << "Emitting segments for file: " << Filename << "\n"); - FileCoverage.Segments = - SegmentBuilder::buildSegments(Regions, *SingleByteCoverage); + FileCoverage.Segments = SegmentBuilder::buildSegments(Regions); return FileCoverage; } @@ -1489,8 +1483,7 @@ CoverageMapping::getCoverageForFunction(const FunctionRecord &Function) const { LLVM_DEBUG(dbgs() << "Emitting segments for function: " << Function.Name << "\n"); - FunctionCoverage.Segments = - SegmentBuilder::buildSegments(Regions, Function.SingleByteCoverage); + FunctionCoverage.Segments = SegmentBuilder::buildSegments(Regions); return FunctionCoverage; } @@ -1500,12 +1493,8 @@ CoverageData CoverageMapping::getCoverageForExpansion( CoverageData ExpansionCoverage( Expansion.Function.Filenames[Expansion.FileID]); std::vector<CountedRegion> Regions; - std::optional<bool> SingleByteCoverage; for (const auto &CR : Expansion.Function.CountedRegions) if (CR.FileID == Expansion.FileID) { - assert(!SingleByteCoverage || - *SingleByteCoverage == Expansion.Function.SingleByteCoverage); - SingleByteCoverage = Expansion.Function.SingleByteCoverage; Regions.push_back(CR); if (isExpansion(CR, Expansion.FileID)) ExpansionCoverage.Expansions.emplace_back(CR, Expansion.Function); @@ -1517,8 +1506,7 @@ CoverageData CoverageMapping::getCoverageForExpansion( LLVM_DEBUG(dbgs() << "Emitting segments for expansion of file " << Expansion.FileID << "\n"); - ExpansionCoverage.Segments = - SegmentBuilder::buildSegments(Regions, *SingleByteCoverage); + ExpansionCoverage.Segments = SegmentBuilder::buildSegments(Regions); return ExpansionCoverage; } diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 0f6677b4d35718..b9937c9429b77d 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -952,7 +952,7 @@ void InstrProfRecord::merge(InstrProfRecord &Other, uint64_t Weight, Value = getInstrMaxCountValue(); Overflowed = true; } - Counts[I] = (SingleByteCoverage && Value != 0 ? 1 : Value); + Counts[I] = Value; if (Overflowed) Warn(instrprof_error::counter_overflow); } diff --git a/llvm/lib/ProfileData/InstrProfReader.cpp b/llvm/lib/ProfileData/InstrProfReader.cpp index a07d7f573275ba..b90617c74f6d13 100644 --- a/llvm/lib/ProfileData/InstrProfReader.cpp +++ b/llvm/lib/ProfileData/InstrProfReader.cpp @@ -743,7 +743,6 @@ Error RawInstrProfReader<IntPtrT>::readRawCounts( Record.Counts.clear(); Record.Counts.reserve(NumCounters); - Record.SingleByteCoverage = hasSingleByteCoverage(); for (uint32_t I = 0; I < NumCounters; I++) { const char *Ptr = CountersStart + CounterBaseOffset + I * getCounterTypeSize(); >From 5fc3408628a72560490c5271de171a636f5be50a Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi <geek4ci...@gmail.com> Date: Wed, 20 Nov 2024 23:46:58 +0900 Subject: [PATCH 4/5] Fix a test to fix linecount=1 --- llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts.cpp b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts.cpp index b14409f173849d..b63247341a28e4 100644 --- a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts.cpp +++ b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts.cpp @@ -12,8 +12,8 @@ int main() { // TEXT: [[@LINE]]| [[C161:161|1]] x = 1; // TEXT: [[@LINE]]| [[C161]]| x = 1 } // TEXT: [[@LINE]]| [[C161]]| } - for (int i = 0; i < 100; ++i) { // TEXT: [[@LINE]]| [[C16K2:16\.2k|161]]| for ( - x = 1; // TEXT: [[@LINE]]| [[C16K1:16\.1k|161]]| x = 1 + for (int i = 0; i < 100; ++i) { // TEXT: [[@LINE]]| [[C16K2:16\.2k|1]]| for ( + x = 1; // TEXT: [[@LINE]]| [[C16K1:16\.1k|1]]| x = 1 } // TEXT: [[@LINE]]| [[C16K1]]| } x = x < 10 ? x + 1 : x - 1; // TEXT: [[@LINE]]| [[C161]]| x = >From 24457a7236f5dc76e49c78817b5a0de6ce4f7f93 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi <geek4ci...@gmail.com> Date: Sun, 22 Dec 2024 00:42:02 +0900 Subject: [PATCH 5/5] Update tests --- llvm/test/tools/llvm-cov/Inputs/branch-logical-mixed.cpp | 2 +- llvm/test/tools/llvm-cov/branch-macros.test | 2 +- llvm/test/tools/llvm-cov/showLineExecutionCounts.test | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-logical-mixed.cpp b/llvm/test/tools/llvm-cov/Inputs/branch-logical-mixed.cpp index 246b0389aa6008..cce61784f9c48c 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-logical-mixed.cpp +++ b/llvm/test/tools/llvm-cov/Inputs/branch-logical-mixed.cpp @@ -4,7 +4,7 @@ #include <stdio.h> #include <stdlib.h> -// CHECK: |{{ +}}[[C4:4|1]]|void func( +// CHECK: | [[#min(C,4)]]|void func( void func(int a, int b) { bool b0 = a <= b; bool b1 = a == b; diff --git a/llvm/test/tools/llvm-cov/branch-macros.test b/llvm/test/tools/llvm-cov/branch-macros.test index 0a94e636082271..e4bd14ec14f16c 100644 --- a/llvm/test/tools/llvm-cov/branch-macros.test +++ b/llvm/test/tools/llvm-cov/branch-macros.test @@ -4,7 +4,7 @@ // RUN: yaml2obj %S/Inputs/branch-macros-single.yaml -o %t.o // RUN: llvm-profdata merge %S/Inputs/branch-macros-single.proftext -o %t.profdata -// RUN: llvm-cov show --show-expansions --show-branches=count %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %S/Inputs/branch-macros.cpp -D#C=999 +// RUN: llvm-cov show --show-expansions --show-branches=count %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %S/Inputs/branch-macros.cpp -D#C=1 // REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover // REPORT-NEXT: --- diff --git a/llvm/test/tools/llvm-cov/showLineExecutionCounts.test b/llvm/test/tools/llvm-cov/showLineExecutionCounts.test index 63a49341e6c171..4f505f9648eb88 100644 --- a/llvm/test/tools/llvm-cov/showLineExecutionCounts.test +++ b/llvm/test/tools/llvm-cov/showLineExecutionCounts.test @@ -46,5 +46,5 @@ // RUN: yaml2obj %S/Inputs/showLineExecutionCounts-single.yaml -o %t.o // RUN: llvm-profdata merge %S/Inputs/showLineExecutionCounts-single.proftext -o %t.profdata -// RUN: llvm-cov show %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck -check-prefixes=TEXT,WHOLE-FILE -D#C=161 -DC16K2=161 -DC16K1=161 %S/Inputs/showLineExecutionCounts.cpp -// RUN: llvm-cov show %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs -name=main | FileCheck -check-prefixes=TEXT,FILTER -D#C=161 -DC16K2=161 -DC16K1=161 %S/Inputs/showLineExecutionCounts.cpp +// RUN: llvm-cov show %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck -check-prefixes=TEXT,WHOLE-FILE -D#C=1 -DC16K2=1 -DC16K1=1 %S/Inputs/showLineExecutionCounts.cpp +// RUN: llvm-cov show %t.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs -name=main | FileCheck -check-prefixes=TEXT,FILTER -D#C=1 -DC16K2=1 -DC16K1=1 %S/Inputs/showLineExecutionCounts.cpp _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits