From 618e63946923a460b2684738e636c77b1706322a Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 17 Oct 2024 01:22:54 +0900 Subject: [PATCH 1/7] Introduce CounterExpressionBuilder::replace(C, Map) This return a counter for each term in the expression replaced by ReplaceMap. At the moment, this doesn't update the Map, so Map is marked as `const`. --- .../ProfileData/Coverage/CoverageMapping.h | 6 ++++ .../ProfileData/Coverage/CoverageMapping.cpp | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index fa07b3a9e8b14..d6528bd407ef3 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -213,6 +214,11 @@ class CounterExpressionBuilder { /// Return a counter that represents the expression that subtracts RHS from /// LHS. Counter subtract(Counter LHS, Counter RHS, bool Simplify = true); + + using ReplaceMap = std::map; + + /// Return a counter for each term in the expression replaced by ReplaceMap. + Counter replace(Counter C, const ReplaceMap &Map); }; using LineColPair = std::pair; diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index c713371da81e4..b50f025d261e1 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -135,6 +135,38 @@ Counter CounterExpressionBuilder::subtract(Counter LHS, Counter RHS, return Simplify ? simplify(Cnt) : Cnt; } +Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { + auto I = Map.find(C); + + // Replace C with the Map even if C is Expression. + if (I != Map.end()) + return I->second; + + // Traverse only Expression. + if (!C.isExpression()) + return C; + + auto CE = Expressions[C.getExpressionID()]; + auto NewLHS = replace(CE.LHS, Map); + auto NewRHS = replace(CE.RHS, Map); + + // Reconstruct Expression with induced subexpressions. + switch (CE.Kind) { + case CounterExpression::Add: + C = add(NewLHS, NewRHS); + break; + case CounterExpression::Subtract: + C = subtract(NewLHS, NewRHS); + break; + } + + // Reconfirm if the reconstructed expression would hit the Map. + if ((I = Map.find(C)) != Map.end()) + return I->second; + + return C; +} + void CounterMappingContext::dump(const Counter &C, raw_ostream &OS) const { switch (C.getKind()) { case Counter::Zero: From 209ea4cfdb4f93d3c8fc60dc9af29af39fd24758 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sun, 20 Oct 2024 11:58:16 +0900 Subject: [PATCH 2/7] Update comments --- llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index b50f025d261e1..6f44797be20e3 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -138,14 +138,14 @@ Counter CounterExpressionBuilder::subtract(Counter LHS, Counter RHS, Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { auto I = Map.find(C); - // Replace C with the Map even if C is Expression. + // Replace C with the value found in Map even if C is Expression. if (I != Map.end()) return I->second; - // Traverse only Expression. if (!C.isExpression()) return C; + // Traverse both sides of Expression. auto CE = Expressions[C.getExpressionID()]; auto NewLHS = replace(CE.LHS, Map); auto NewRHS = replace(CE.RHS, Map); From f0afd04dd86573f1e7d868cc6e1c677d1779aa5f Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sun, 20 Oct 2024 12:00:23 +0900 Subject: [PATCH 3/7] Use initializer statements --- llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 6f44797be20e3..7ff2e5ba69e19 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -136,10 +136,8 @@ Counter CounterExpressionBuilder::subtract(Counter LHS, Counter RHS, } Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { - auto I = Map.find(C); - // Replace C with the value found in Map even if C is Expression. - if (I != Map.end()) + if (auto I = Map.find(C); I != Map.end()) return I->second; if (!C.isExpression()) @@ -161,7 +159,7 @@ Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { } // Reconfirm if the reconstructed expression would hit the Map. - if ((I = Map.find(C)) != Map.end()) + if (auto I = Map.find(C); I != Map.end()) return I->second; return C; From ed700c2cb5b7ceac1bcf5ac0414a11d3148b9990 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sat, 21 Dec 2024 17:49:06 +0900 Subject: [PATCH 4/7] s/replace/subst/ --- llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h | 6 +++--- llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index a55ca997d47fd..dad5f1276f27c 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -215,10 +215,10 @@ class CounterExpressionBuilder { /// LHS. Counter subtract(Counter LHS, Counter RHS, bool Simplify = true); - using ReplaceMap = std::map; + using SubstMap = std::map; - /// Return a counter for each term in the expression replaced by ReplaceMap. - Counter replace(Counter C, const ReplaceMap &Map); + /// Return a counter for each term in the expression replaced by SubstMap. + Counter subst(Counter C, const SubstMap &Map); }; using LineColPair = std::pair; diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 6d6f03c360639..3f89414bdbbb9 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -135,7 +135,7 @@ Counter CounterExpressionBuilder::subtract(Counter LHS, Counter RHS, return Simplify ? simplify(Cnt) : Cnt; } -Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { +Counter CounterExpressionBuilder::subst(Counter C, const SubstMap &Map) { // Replace C with the value found in Map even if C is Expression. if (auto I = Map.find(C); I != Map.end()) return I->second; @@ -143,10 +143,9 @@ Counter CounterExpressionBuilder::replace(Counter C, const ReplaceMap &Map) { if (!C.isExpression()) return C; - // Traverse both sides of Expression. auto CE = Expressions[C.getExpressionID()]; - auto NewLHS = replace(CE.LHS, Map); - auto NewRHS = replace(CE.RHS, Map); + auto NewLHS = subst(CE.LHS, Map); + auto NewRHS = subst(CE.RHS, Map); // Reconstruct Expression with induced subexpressions. switch (CE.Kind) { From 28c568ad84edbfb4eb4bc7841c8c6b39e9722094 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Mon, 6 Jan 2025 23:37:50 +0900 Subject: [PATCH 5/7] Add a test --- .../ProfileData/CoverageMappingTest.cpp | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp index ef147674591c5..46f881ecddb5f 100644 --- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp +++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp @@ -291,6 +291,45 @@ struct CoverageMappingTest : ::testing::TestWithParam> { } }; +TEST(CoverageMappingTest, expression_subst) { + CounterExpressionBuilder Builder; + CounterExpressionBuilder::SubstMap MapToExpand; + + auto C = [](unsigned ID) { return Counter::getCounter(ID); }; + auto A = [&](Counter LHS, Counter RHS) { return Builder.add(LHS, RHS); }; + // returns {E, N} in clangCodeGen + auto getBranchCounterPair = [&](Counter E, Counter P, Counter N) { + auto Skipped = Builder.subtract(P, E); + MapToExpand[N] = Builder.subst(Skipped, MapToExpand); + }; + + auto E18 = C(5); + auto P18 = C(2); + auto S18 = C(18); + // #18 => (#2 - #5) + getBranchCounterPair(E18, P18, S18); + + auto E22 = S18; + auto P22 = C(0); + auto S22 = C(22); + // #22 => #0 - (#2 - #5) + getBranchCounterPair(E22, P22, S22); + + auto E28 = A(A(C(9), C(11)), C(14)); + auto P28 = S22; + auto S28 = C(28); + // #28 => (((((#0 + #5) - #2) - #9) - #11) - #14) + getBranchCounterPair(E28, P28, S28); + + auto LHS = A(E28, A(S28, S18)); + auto RHS = C(0); + + // W/o subst, LHS cannot be reduced. + ASSERT_FALSE(Builder.subtract(LHS, RHS).isZero()); + // W/ subst, C(18) and C(28) in LHS will be reduced. + ASSERT_TRUE(Builder.subst(Builder.subtract(LHS, RHS), MapToExpand).isZero()); +} + TEST_P(CoverageMappingTest, basic_write_read) { startFunction("func", 0x1234); addCMR(Counter::getCounter(0), "foo", 1, 1, 1, 1); From d92a9d9c74814fc48c1ff5523d5215115021ac40 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Mon, 6 Jan 2025 23:38:11 +0900 Subject: [PATCH 6/7] Prune redundant logic --- llvm/lib/ProfileData/Coverage/CoverageMapping.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp index 3f89414bdbbb9..87d305fc53636 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -157,10 +157,6 @@ Counter CounterExpressionBuilder::subst(Counter C, const SubstMap &Map) { break; } - // Reconfirm if the reconstructed expression would hit the Map. - if (auto I = Map.find(C); I != Map.end()) - return I->second; - return C; } From b548e71a3cf55167d5b49e010cc76c8c82f29280 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Thu, 9 Jan 2025 15:19:00 +0900 Subject: [PATCH 7/7] Add comments --- llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h index dad5f1276f27c..edae71491191e 100644 --- a/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h +++ b/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h @@ -215,9 +215,12 @@ class CounterExpressionBuilder { /// LHS. Counter subtract(Counter LHS, Counter RHS, bool Simplify = true); + /// K to V map. K will be Counter in most cases. V may be Counter or + /// Expression. using SubstMap = std::map; - /// Return a counter for each term in the expression replaced by SubstMap. + /// \return A counter equivalent to \C, with each term in its + /// expression replaced with term from \p Map. Counter subst(Counter C, const SubstMap &Map); };