diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 1bad7a722da07..35d3776241b7e 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -5146,8 +5146,9 @@ std::optional HandleConditionalOperatorLValueSimpleCase( if (!CGF.ContainsLabel(Dead)) { // If the true case is live, we need to track its region. - if (CondExprBool) - CGF.incrementProfileCounter(E); + CGF.incrementProfileCounter(CondExprBool ? CGF.UseExecPath + : CGF.UseSkipPath, + E, /*UseBoth=*/true); CGF.markStmtMaybeUsed(Dead); // If a throw expression we emit it and return an undefined lvalue // because it can't be used. @@ -5186,7 +5187,7 @@ ConditionalInfo EmitConditionalBlocks(CodeGenFunction &CGF, // Any temporaries created here are conditional. CGF.EmitBlock(Info.lhsBlock); - CGF.incrementProfileCounter(E); + CGF.incrementProfileCounter(CGF.UseExecPath, E); eval.begin(CGF); Info.LHS = BranchGenFunc(CGF, E->getTrueExpr()); eval.end(CGF); @@ -5197,6 +5198,7 @@ ConditionalInfo EmitConditionalBlocks(CodeGenFunction &CGF, // Any temporaries created here are conditional. CGF.EmitBlock(Info.rhsBlock); + CGF.incrementProfileCounter(CGF.UseSkipPath, E); eval.begin(CGF); Info.RHS = BranchGenFunc(CGF, E->getFalseExpr()); eval.end(CGF); diff --git a/clang/lib/CodeGen/CGExprAgg.cpp b/clang/lib/CodeGen/CGExprAgg.cpp index 2ad6587089f10..16a257c2d0263 100644 --- a/clang/lib/CodeGen/CGExprAgg.cpp +++ b/clang/lib/CodeGen/CGExprAgg.cpp @@ -36,10 +36,6 @@ using namespace CodeGen; // Aggregate Expression Emitter //===----------------------------------------------------------------------===// -namespace llvm { -extern cl::opt EnableSingleByteCoverage; -} // namespace llvm - namespace { class AggExprEmitter : public StmtVisitor { CodeGenFunction &CGF; @@ -1293,10 +1289,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { eval.begin(CGF); CGF.EmitBlock(LHSBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E->getTrueExpr()); - else - CGF.incrementProfileCounter(E); + CGF.incrementProfileCounter(CGF.UseExecPath, E); Visit(E->getTrueExpr()); eval.end(CGF); @@ -1311,8 +1304,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { eval.begin(CGF); CGF.EmitBlock(RHSBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E->getFalseExpr()); + CGF.incrementProfileCounter(CGF.UseSkipPath, E); Visit(E->getFalseExpr()); eval.end(CGF); @@ -1321,8 +1313,6 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { E->getType()); CGF.EmitBlock(ContBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E); } void AggExprEmitter::VisitChooseExpr(const ChooseExpr *CE) { diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index ac31dff11b585..5ea6a6834167a 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -26,10 +26,6 @@ using namespace CodeGen; // Complex Expression Emitter //===----------------------------------------------------------------------===// -namespace llvm { -extern cl::opt EnableSingleByteCoverage; -} // namespace llvm - typedef CodeGenFunction::ComplexPairTy ComplexPairTy; /// Return the complex type that we are meant to emit. @@ -1379,11 +1375,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { eval.begin(CGF); CGF.EmitBlock(LHSBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E->getTrueExpr()); - else - CGF.incrementProfileCounter(E); - + CGF.incrementProfileCounter(CGF.UseExecPath, E); ComplexPairTy LHS = Visit(E->getTrueExpr()); LHSBlock = Builder.GetInsertBlock(); CGF.EmitBranch(ContBlock); @@ -1391,13 +1383,10 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { eval.begin(CGF); CGF.EmitBlock(RHSBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E->getFalseExpr()); + CGF.incrementProfileCounter(CGF.UseSkipPath, E); ComplexPairTy RHS = Visit(E->getFalseExpr()); RHSBlock = Builder.GetInsertBlock(); CGF.EmitBlock(ContBlock); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E); eval.end(CGF); // Create a PHI node for the real part. diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 0f27bd00422dc..95a8e2c8b2660 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -5278,13 +5278,9 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { // If the dead side doesn't have labels we need, just emit the Live part. if (!CGF.ContainsLabel(dead)) { - if (CondExprBool) { - if (llvm::EnableSingleByteCoverage) { - CGF.incrementProfileCounter(lhsExpr); - CGF.incrementProfileCounter(rhsExpr); - } - CGF.incrementProfileCounter(E); - } + CGF.incrementProfileCounter(CondExprBool ? CGF.UseExecPath + : CGF.UseSkipPath, + E, /*UseBoth=*/true); Value *Result = Visit(live); CGF.markStmtMaybeUsed(dead); @@ -5359,17 +5355,13 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { // If this is a really simple expression (like x ? 4 : 5), emit this as a // select instead of as control flow. We can only do this if it is cheap and // safe to evaluate the LHS and RHS unconditionally. - if (isCheapEnoughToEvaluateUnconditionally(lhsExpr, CGF) && + if (!llvm::EnableSingleByteCoverage && + isCheapEnoughToEvaluateUnconditionally(lhsExpr, CGF) && isCheapEnoughToEvaluateUnconditionally(rhsExpr, CGF)) { llvm::Value *CondV = CGF.EvaluateExprAsBool(condExpr); llvm::Value *StepV = Builder.CreateZExtOrBitCast(CondV, CGF.Int64Ty); - if (llvm::EnableSingleByteCoverage) { - CGF.incrementProfileCounter(lhsExpr); - CGF.incrementProfileCounter(rhsExpr); - CGF.incrementProfileCounter(E); - } else - CGF.incrementProfileCounter(E, StepV); + CGF.incrementProfileCounter(E, StepV); llvm::Value *LHS = Visit(lhsExpr); llvm::Value *RHS = Visit(rhsExpr); @@ -5401,11 +5393,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { if (CGF.MCDCLogOpStack.empty()) CGF.maybeUpdateMCDCTestVectorBitmap(condExpr); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(lhsExpr); - else - CGF.incrementProfileCounter(E); - + CGF.incrementProfileCounter(CGF.UseExecPath, E); eval.begin(CGF); Value *LHS = Visit(lhsExpr); eval.end(CGF); @@ -5421,9 +5409,7 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { if (CGF.MCDCLogOpStack.empty()) CGF.maybeUpdateMCDCTestVectorBitmap(condExpr); - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(rhsExpr); - + CGF.incrementProfileCounter(CGF.UseSkipPath, E); eval.begin(CGF); Value *RHS = Visit(rhsExpr); eval.end(CGF); @@ -5442,11 +5428,6 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { PN->addIncoming(LHS, LHSBlock); PN->addIncoming(RHS, RHSBlock); - // When single byte coverage mode is enabled, add a counter to continuation - // block. - if (llvm::EnableSingleByteCoverage) - CGF.incrementProfileCounter(E); - return PN; } diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 27ec68bd2a872..10afe622909ca 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -2011,7 +2011,7 @@ void CodeGenFunction::EmitBranchOnBoolExpr( cond.begin(*this); EmitBlock(LHSBlock); - incrementProfileCounter(CondOp); + incrementProfileCounter(UseExecPath, CondOp); { ApplyDebugLocation DL(*this, Cond); EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock, @@ -2021,6 +2021,7 @@ void CodeGenFunction::EmitBranchOnBoolExpr( cond.begin(*this); EmitBlock(RHSBlock); + incrementProfileCounter(UseSkipPath, CondOp); EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock, TrueCount - LHSScaledTrueCount, LH, CondOp); cond.end(*this); diff --git a/clang/lib/CodeGen/CodeGenPGO.cpp b/clang/lib/CodeGen/CodeGenPGO.cpp index ffb1df9ec2cc6..ec767ff495dd3 100644 --- a/clang/lib/CodeGen/CodeGenPGO.cpp +++ b/clang/lib/CodeGen/CodeGenPGO.cpp @@ -342,14 +342,6 @@ struct MapRegionCounters : public RecursiveASTVisitor { return Base::VisitBinaryOperator(S); } - bool VisitConditionalOperator(ConditionalOperator *S) { - if (llvm::EnableSingleByteCoverage && S->getTrueExpr()) - CounterMap[S->getTrueExpr()] = NextCounter++; - if (llvm::EnableSingleByteCoverage && S->getFalseExpr()) - CounterMap[S->getFalseExpr()] = NextCounter++; - return Base::VisitConditionalOperator(S); - } - /// Include \p S in the function hash. bool VisitStmt(Stmt *S) { auto Type = updateCounterMappings(S); @@ -1237,10 +1229,11 @@ void CodeGenPGO::emitCounterSetOrIncrement(CGBuilderTy &Builder, const Stmt *S, NormalizedFuncNameVarPtr, Builder.getInt64(FunctionHash), Builder.getInt32(NumRegionCounters), Builder.getInt32(Counter), StepV}; - if (llvm::EnableSingleByteCoverage) + if (llvm::EnableSingleByteCoverage) { + assert(!StepV && "StepV is impossible in SingleByte"); Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::instrprof_cover), ArrayRef(Args, 4)); - else if (!StepV) + } else if (!StepV) Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::instrprof_increment), ArrayRef(Args, 4)); else diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index ce39b7220fc85..bf6d41a228bf6 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -966,11 +966,8 @@ struct CounterCoverageMappingBuilder // The old behavior of SingleByte is unaware of Branches. // Will be pruned after the migration of SingleByte. - if (llvm::EnableSingleByteCoverage) { - assert(SkipCntForOld && - "SingleByte must provide SkipCntForOld as a fake Skipped count."); + if (llvm::EnableSingleByteCoverage && SkipCntForOld) return {ExecCnt, *SkipCntForOld}; - } BranchCounterPair Counters = {ExecCnt, Builder.subtract(ParentCnt, ExecCnt)}; @@ -2168,11 +2165,7 @@ struct CounterCoverageMappingBuilder extendRegion(E); Counter ParentCount = getRegion().getCounter(); - auto [TrueCount, FalseCount] = - (llvm::EnableSingleByteCoverage - ? BranchCounterPair{getRegionCounter(E->getTrueExpr()), - getRegionCounter(E->getFalseExpr())} - : getBranchCounterPair(E, ParentCount)); + auto [TrueCount, FalseCount] = getBranchCounterPair(E, ParentCount); Counter OutCount; if (const auto *BCO = dyn_cast(E)) { @@ -2191,11 +2184,8 @@ struct CounterCoverageMappingBuilder } extendRegion(E->getFalseExpr()); - Counter FalseOutCount = propagateCounts(FalseCount, E->getFalseExpr()); - if (llvm::EnableSingleByteCoverage) - OutCount = getRegionCounter(E); - else - OutCount = addCounters(OutCount, FalseOutCount); + OutCount = + addCounters(OutCount, propagateCounts(FalseCount, E->getFalseExpr())); if (!IsCounterEqual(OutCount, ParentCount)) { pushRegion(OutCount); @@ -2203,8 +2193,7 @@ struct CounterCoverageMappingBuilder } // Create Branch Region around condition. - if (!llvm::EnableSingleByteCoverage) - createBranchRegion(E->getCond(), TrueCount, FalseCount); + createBranchRegion(E->getCond(), TrueCount, FalseCount); } void createOrCancelDecision(const BinaryOperator *E, unsigned Since) { diff --git a/clang/test/CoverageMapping/single-byte-counters.cpp b/clang/test/CoverageMapping/single-byte-counters.cpp index f09e13038d900..056d5134b0b87 100644 --- a/clang/test/CoverageMapping/single-byte-counters.cpp +++ b/clang/test/CoverageMapping/single-byte-counters.cpp @@ -158,9 +158,9 @@ int testDo() { // CHECK-NEXT: File 0, [[@LINE]]:14 -> [[@LINE+9]]:2 = [ // CHECK-NEXT: testConditional int testConditional(int x) { // CHECK-NEXT: File 0, [[@LINE]]:28 -> [[@LINE+7]]:2 = [[C90:#0]] int result = (x > 0) ? 1 : -1; // CHECK-NEXT: File 0, [[@LINE]]:15 -> [[@LINE]]:22 = [[C90]] - - // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:24 -> [[@LINE-2]]:25 = [[C9T:#2]] + // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:15 -> [[@LINE-1]]:22 = [[C9T:#1]], [[C9F:#2]] + // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:24 -> [[@LINE-2]]:25 = [[C9T]] // CHECK-NEXT: File 0, [[@LINE-3]]:25 -> [[@LINE-3]]:26 = [[C9T]] - // CHECK-NEXT: File 0, [[@LINE-4]]:29 -> [[@LINE-4]]:31 = [[C9F:#3]] - return result; // CHECK-NEXT: File 0, [[@LINE]]:2 -> [[@LINE]]:15 = [[C9E:#1]] + // CHECK-NEXT: File 0, [[@LINE-4]]:29 -> [[@LINE-4]]:31 = [[C9F]] + return result; // #0 } diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.proftext b/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.proftext index ea8c6f9bc634e..d7e78369c4504 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.proftext +++ b/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.proftext @@ -107,10 +107,10 @@ conditional_operator 5 # Counter Values: 1 -1 0 1 1 +0 conditionals # Func Hash: diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.yaml b/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.yaml index 9d23dcb67ad2a..60de270939725 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.yaml +++ b/llvm/test/tools/llvm-cov/Inputs/branch-c-general-single.yaml @@ -51,7 +51,7 @@ Sections: Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] AddressAlign: 0x8 - Content: 20E5C369BDF15C7940000000D0D60000000000004C551E9517F40F4F0101000B01D1011D0702100201000101010B001109001300948080800809001400150D001800191001010001050103020205000B000C01001000111001010001 + Content: 20E5C369BDF15C7949000000D0D60000000000004C551E9517F40F4F0101000C01D1011D0702100201000101010B001120050D000B001105001300948080800805001400150D00180019100101000101010B000C200911000B000C11001000111001010001 - Name: '__llvm_covfun (9)' Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] @@ -154,7 +154,7 @@ Symbols: Type: STT_OBJECT Section: '__llvm_covfun (8)' Binding: STB_WEAK - Size: 0x5C + Size: 0x65 Other: [ STV_HIDDEN ] - Name: __covrec_42EB9670C4E7E87Du Type: STT_OBJECT diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c index 9660e857092bc..5c5a112f00421 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c +++ b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c @@ -209,9 +209,9 @@ void boolop_loops() { // CHECK: @LINE|{{.*}}boolop_loops() void conditional_operator() { // CHECK: @LINE|{{.*}}conditional_operator() int i = 100; - int j = i < 50 ? i : 1; // BRCOV: Branch ([[@LINE]]:11): [True: 0, False: 1] + int j = i < 50 ? i : 1; // CHECK: Branch ([[@LINE]]:11): [True: 0, False: 1] - int k = i ?: 0; // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: 0] + int k = i ?: 0; // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 0] } diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.proftext b/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.proftext index afb4b1038d3f8..29dc4ef3bf5c2 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.proftext +++ b/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.proftext @@ -30,18 +30,17 @@ _Z5func2ii # Func Hash: 14151920320560143107 # Num Counters: -10 +9 # Counter Values: 3 3 2 1 0 -3 0 -3 1 0 +3 main # Func Hash: diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.yaml b/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.yaml index 5c5f62b11863b..7545e311af7ab 100644 --- a/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.yaml +++ b/llvm/test/tools/llvm-cov/Inputs/branch-macros-single.yaml @@ -16,7 +16,7 @@ Sections: Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] AddressAlign: 0x8 - Content: B01D983FC67363959E000000039B9E2C8DB865C493E696313ECE8F5D0D01010101010101010101010101000401241A07020C010E0014140018001D1001010365011C0B1000160405080F002624001000152C0018001D3400200025013C0A1000160305070F001F44001000154C0019001E0119060F0017011D050F00170154091000150205050F001705000F00170121060F00170401070F001F01000F001F5C00100015640019001E0201050F001701000F0017010D060F0017 + Content: B01D983FC67363959E000000039B9E2C8DB865C493E696313ECE8F5D0D01010101010101010101010101000401241A07020C010E0014140018001D1001010365011C0B1000160405080F002624001000152C0018001D3400200025013C0A1000160305070F001F44001000154C0019001E0115060F00170121050F00170154091000150205050F001705000F00170119060F00170401070F001F01000F001F5C00100015640019001E0201050F001701000F0017010D060F0017 - Name: '__llvm_covfun (2)' Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] diff --git a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.proftext b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.proftext index 1b7b949de4962..d8af6ef7fc615 100644 --- a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.proftext +++ b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.proftext @@ -4,7 +4,7 @@ main # Func Hash: 15239891155360101223 # Num Counters: -14 +12 # Counter Values: 161 0 @@ -15,9 +15,7 @@ main 161 161 161 -161 0 -161 0 161 diff --git a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.yaml b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.yaml index 84b184023f082..a836189245273 100644 --- a/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.yaml +++ b/llvm/test/tools/llvm-cov/Inputs/showLineExecutionCounts-single.yaml @@ -11,7 +11,7 @@ Sections: Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] AddressAlign: 0x8 - Content: FAD58DE7366495DB9A0000006733DBEA42F87ED3C60E0B951FF3509D0101001A01060C130210020100010101070008050009008A8080800805000A0204090204008A8080800809000A020410030100010D01030A02110013001A15001C001F19002000A180808008190021020410030100011D010306021D0007000D25000F0090808080082500100015290018001D2101030502210007000D31000F018980808008310109000E350109000E10010100012D0103000B + Content: FAD58DE7366495DB9E0000006733DBEA42F87ED3C60E0B951FF3509D0101001A01060C130210020100010101070008050009008A8080800805000A0204090204008A8080800809000A020410030100010D01030A02110013001A15001C001F19002000A180808008190021020410030100011D0103050B1D0007000D2021290007000D21000F0090808080082100100015290018001D1D0107000D20252D0007000D25000F018980808008250109000E2D0109000E1001010001 - Name: __llvm_covmap Type: SHT_PROGBITS Flags: [ SHF_GNU_RETAIN ] @@ -40,6 +40,6 @@ Symbols: Type: STT_OBJECT Section: __llvm_covfun Binding: STB_WEAK - Size: 0xB6 + Size: 0xBA Other: [ STV_HIDDEN ] ...