diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2024-02-13 22:43:46 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-13 22:43:46 +0900 |
commit | a17a3e9d9a6b4baefd96e19ee5e8ce04cead8ab5 (patch) | |
tree | 2fead6e2ffdf9ed9e02e89dcdaec10f9506debee /llvm/lib/ProfileData | |
parent | a70077ed8cdf7c7c2879c18c1c67917cd88e64ef (diff) | |
download | llvm-a17a3e9d9a6b4baefd96e19ee5e8ce04cead8ab5.zip llvm-a17a3e9d9a6b4baefd96e19ee5e8ce04cead8ab5.tar.gz llvm-a17a3e9d9a6b4baefd96e19ee5e8ce04cead8ab5.tar.bz2 |
[MC/DC] Refactor: Make `MCDCParams` as `std::variant` (#81227)
Introduce `mcdc::DecisionParameters` and `mcdc::BranchParameters` and make
sure them not initialized as zero.
FIXME: Could we make `CoverageMappingRegion` as a smart tagged union?
Diffstat (limited to 'llvm/lib/ProfileData')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 53 | ||||
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp | 24 |
3 files changed, 57 insertions, 36 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 0c65ab8..80b80f7 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -234,6 +234,7 @@ class MCDCRecordProcessor { /// Decision Region to which the ExecutedTestVectorBitmap applies. const CounterMappingRegion &Region; + const mcdc::DecisionParameters &DecisionParams; /// Array of branch regions corresponding each conditions in the boolean /// expression. @@ -244,8 +245,8 @@ class MCDCRecordProcessor { unsigned BitmapIdx; - /// Mapping of a condition ID to its corresponding branch region. - llvm::DenseMap<unsigned, const CounterMappingRegion *> Map; + /// Mapping of a condition ID to its corresponding branch params. + llvm::DenseMap<unsigned, const mcdc::BranchParameters *> BranchParamsMap; /// Vector used to track whether a condition is constant folded. MCDCRecord::BoolVector Folded; @@ -261,9 +262,10 @@ public: MCDCRecordProcessor(const BitVector &Bitmap, const CounterMappingRegion &Region, ArrayRef<const CounterMappingRegion *> Branches) - : Bitmap(Bitmap), Region(Region), Branches(Branches), - NumConditions(Region.MCDCParams.NumConditions), - BitmapIdx(Region.MCDCParams.BitmapIdx * CHAR_BIT), + : Bitmap(Bitmap), Region(Region), + DecisionParams(Region.getDecisionParams()), Branches(Branches), + NumConditions(DecisionParams.NumConditions), + BitmapIdx(DecisionParams.BitmapIdx * CHAR_BIT), Folded(NumConditions, false), IndependencePairs(NumConditions) {} private: @@ -285,18 +287,18 @@ private: // the truth table. void buildTestVector(MCDCRecord::TestVector &TV, unsigned ID, unsigned Index) { - const CounterMappingRegion *Branch = Map[ID]; + auto [UnusedID, TrueID, FalseID] = *BranchParamsMap[ID]; TV[ID - 1] = MCDCRecord::MCDC_False; - if (Branch->MCDCParams.FalseID > 0) - buildTestVector(TV, Branch->MCDCParams.FalseID, Index); + if (FalseID > 0) + buildTestVector(TV, FalseID, Index); else recordTestVector(TV, Index, MCDCRecord::MCDC_False); Index |= 1 << (ID - 1); TV[ID - 1] = MCDCRecord::MCDC_True; - if (Branch->MCDCParams.TrueID > 0) - buildTestVector(TV, Branch->MCDCParams.TrueID, Index); + if (TrueID > 0) + buildTestVector(TV, TrueID, Index); else recordTestVector(TV, Index, MCDCRecord::MCDC_True); @@ -371,8 +373,9 @@ public: // - Record whether the condition is constant folded so that we exclude it // from being measured. for (const auto *B : Branches) { - Map[B->MCDCParams.ID] = B; - PosToID[I] = B->MCDCParams.ID - 1; + const auto &BranchParams = B->getBranchParams(); + BranchParamsMap[BranchParams.ID] = &BranchParams; + PosToID[I] = BranchParams.ID - 1; CondLoc[I] = B->startLoc(); Folded[I++] = (B->Count.isZero() && B->FalseCount.isZero()); } @@ -492,10 +495,12 @@ static unsigned getMaxBitmapSize(const CounterMappingContext &Ctx, // Note that `<=` is used insted of `<`, because `BitmapIdx == 0` is valid // and `MaxBitmapIdx is `unsigned`. `BitmapIdx` is unique in the record. for (const auto &Region : reverse(Record.MappingRegions)) { - if (Region.Kind == CounterMappingRegion::MCDCDecisionRegion && - MaxBitmapIdx <= Region.MCDCParams.BitmapIdx) { - MaxBitmapIdx = Region.MCDCParams.BitmapIdx; - NumConditions = Region.MCDCParams.NumConditions; + if (Region.Kind != CounterMappingRegion::MCDCDecisionRegion) + continue; + const auto &DecisionParams = Region.getDecisionParams(); + if (MaxBitmapIdx <= DecisionParams.BitmapIdx) { + MaxBitmapIdx = DecisionParams.BitmapIdx; + NumConditions = DecisionParams.NumConditions; } } unsigned SizeInBits = llvm::alignTo(uint64_t(1) << NumConditions, CHAR_BIT); @@ -515,6 +520,7 @@ private: const CounterMappingRegion *DecisionRegion; /// They are reflected from DecisionRegion for convenience. + mcdc::DecisionParameters DecisionParams; LineColPair DecisionStartLoc; LineColPair DecisionEndLoc; @@ -533,7 +539,9 @@ private: DenseSet<unsigned> ExpandedFileIDs; DecisionRecord(const CounterMappingRegion &Decision) - : DecisionRegion(&Decision), DecisionStartLoc(Decision.startLoc()), + : DecisionRegion(&Decision), + DecisionParams(Decision.getDecisionParams()), + DecisionStartLoc(Decision.startLoc()), DecisionEndLoc(Decision.endLoc()) { assert(Decision.Kind == CounterMappingRegion::MCDCDecisionRegion); } @@ -561,17 +569,17 @@ private: Result addBranch(const CounterMappingRegion &Branch) { assert(Branch.Kind == CounterMappingRegion::MCDCBranchRegion); - auto ConditionID = Branch.MCDCParams.ID; + auto ConditionID = Branch.getBranchParams().ID; assert(ConditionID > 0 && "ConditionID should begin with 1"); if (ConditionIDs.contains(ConditionID) || - ConditionID > DecisionRegion->MCDCParams.NumConditions) + ConditionID > DecisionParams.NumConditions) return NotProcessed; if (!this->dominates(Branch)) return NotProcessed; - assert(MCDCBranches.size() < DecisionRegion->MCDCParams.NumConditions); + assert(MCDCBranches.size() < DecisionParams.NumConditions); // Put `ID=1` in front of `MCDCBranches` for convenience // even if `MCDCBranches` is not topological. @@ -584,9 +592,8 @@ private: ConditionIDs.insert(ConditionID); // `Completed` when `MCDCBranches` is full - return (MCDCBranches.size() == DecisionRegion->MCDCParams.NumConditions - ? Completed - : Processed); + return (MCDCBranches.size() == DecisionParams.NumConditions ? Completed + : Processed); } /// Record Expansion if it is relevant to this Decision. diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 061f0f1..d528d9a 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -244,7 +244,8 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( unsigned LineStart = 0; for (size_t I = 0; I < NumRegions; ++I) { Counter C, C2; - uint64_t BIDX = 0, NC = 0, ID = 0, TID = 0, FID = 0; + uint64_t BIDX, NC, ID, TID, FID; + mcdc::Parameters Params; CounterMappingRegion::RegionKind Kind = CounterMappingRegion::CodeRegion; // Read the combined counter + region kind. @@ -312,6 +313,9 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( return make_error<CoverageMapError>( coveragemap_error::malformed, "MCDCConditionID shouldn't be zero"); + Params = mcdc::BranchParameters{static_cast<unsigned>(ID), + static_cast<unsigned>(TID), + static_cast<unsigned>(FID)}; break; case CounterMappingRegion::MCDCDecisionRegion: Kind = CounterMappingRegion::MCDCDecisionRegion; @@ -319,6 +323,8 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( return Err; if (auto Err = readIntMax(NC, std::numeric_limits<unsigned>::max())) return Err; + Params = mcdc::DecisionParameters{static_cast<unsigned>(BIDX), + static_cast<unsigned>(NC)}; break; default: return make_error<CoverageMapError>(coveragemap_error::malformed, @@ -374,12 +380,8 @@ Error RawCoverageMappingReader::readMappingRegionsSubArray( }); auto CMR = CounterMappingRegion( - C, C2, - mcdc::Parameters{static_cast<unsigned>(BIDX), static_cast<unsigned>(NC), - static_cast<unsigned>(ID), static_cast<unsigned>(TID), - static_cast<unsigned>(FID)}, - InferredFileID, ExpandedFileID, LineStart, ColumnStart, - LineStart + NumLines, ColumnEnd, Kind); + C, C2, InferredFileID, ExpandedFileID, LineStart, ColumnStart, + LineStart + NumLines, ColumnEnd, Kind, Params); if (CMR.startLoc() > CMR.endLoc()) return make_error<CoverageMapError>( coveragemap_error::malformed, diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp index 248a6a7..3267afd 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingWriter.cpp @@ -213,6 +213,7 @@ void CoverageMappingWriter::write(raw_ostream &OS) { } Counter Count = Minimizer.adjust(I->Count); Counter FalseCount = Minimizer.adjust(I->FalseCount); + bool ParamsShouldBeNull = true; switch (I->Kind) { case CounterMappingRegion::CodeRegion: case CounterMappingRegion::GapRegion: @@ -251,17 +252,25 @@ void CoverageMappingWriter::write(raw_ostream &OS) { OS); writeCounter(MinExpressions, Count, OS); writeCounter(MinExpressions, FalseCount, OS); - assert(I->MCDCParams.ID > 0); - encodeULEB128(unsigned(I->MCDCParams.ID), OS); - encodeULEB128(unsigned(I->MCDCParams.TrueID), OS); - encodeULEB128(unsigned(I->MCDCParams.FalseID), OS); + { + const auto &BranchParams = I->getBranchParams(); + ParamsShouldBeNull = false; + assert(BranchParams.ID > 0); + encodeULEB128(static_cast<unsigned>(BranchParams.ID), OS); + encodeULEB128(static_cast<unsigned>(BranchParams.TrueID), OS); + encodeULEB128(static_cast<unsigned>(BranchParams.FalseID), OS); + } break; case CounterMappingRegion::MCDCDecisionRegion: encodeULEB128(unsigned(I->Kind) << Counter::EncodingCounterTagAndExpansionRegionTagBits, OS); - encodeULEB128(unsigned(I->MCDCParams.BitmapIdx), OS); - encodeULEB128(unsigned(I->MCDCParams.NumConditions), OS); + { + const auto &DecisionParams = I->getDecisionParams(); + ParamsShouldBeNull = false; + encodeULEB128(static_cast<unsigned>(DecisionParams.BitmapIdx), OS); + encodeULEB128(static_cast<unsigned>(DecisionParams.NumConditions), OS); + } break; } assert(I->LineStart >= PrevLineStart); @@ -271,6 +280,9 @@ void CoverageMappingWriter::write(raw_ostream &OS) { encodeULEB128(I->LineEnd - I->LineStart, OS); encodeULEB128(I->ColumnEnd, OS); PrevLineStart = I->LineStart; + assert((!ParamsShouldBeNull || std::get_if<0>(&I->MCDCParams)) && + "MCDCParams should be empty"); + (void)ParamsShouldBeNull; } // Ensure that all file ids have at least one mapping region. assert(CurrentFileID == (VirtualFileMapping.size() - 1)); |