Author: vedantk Date: Thu Feb 15 23:59:43 2018 New Revision: 325319 URL: http://llvm.org/viewvc/llvm-project?rev=325319&view=rev Log: [Coverage] Handle break/continue outside of loop bodies
Teach the coverage mapping logic to handle break or continue statements within for loop increments. Fixes llvm.org/PR36406. Modified: cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp cfe/trunk/test/CoverageMapping/break.c Modified: cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp?rev=325319&r1=325318&r2=325319&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp (original) +++ cfe/trunk/lib/CodeGen/CoverageMappingGen.cpp Thu Feb 15 23:59:43 2018 @@ -982,20 +982,28 @@ struct CounterCoverageMappingBuilder Counter ParentCount = getRegion().getCounter(); Counter BodyCount = getRegionCounter(S); + // The loop increment may contain a break or continue. + if (S->getInc()) + BreakContinueStack.emplace_back(); + // Handle the body first so that we can get the backedge count. - BreakContinueStack.push_back(BreakContinue()); + BreakContinueStack.emplace_back(); extendRegion(S->getBody()); Counter BackedgeCount = propagateCounts(BodyCount, S->getBody()); - BreakContinue BC = BreakContinueStack.pop_back_val(); + BreakContinue BodyBC = BreakContinueStack.pop_back_val(); // The increment is essentially part of the body but it needs to include // the count for all the continue statements. - if (const Stmt *Inc = S->getInc()) - propagateCounts(addCounters(BackedgeCount, BC.ContinueCount), Inc); + BreakContinue IncrementBC; + if (const Stmt *Inc = S->getInc()) { + propagateCounts(addCounters(BackedgeCount, BodyBC.ContinueCount), Inc); + IncrementBC = BreakContinueStack.pop_back_val(); + } // Go back to handle the condition. - Counter CondCount = - addCounters(ParentCount, BackedgeCount, BC.ContinueCount); + Counter CondCount = addCounters( + addCounters(ParentCount, BackedgeCount, BodyBC.ContinueCount), + IncrementBC.ContinueCount); if (const Expr *Cond = S->getCond()) { propagateCounts(CondCount, Cond); adjustForOutOfOrderTraversal(getEnd(S)); @@ -1007,8 +1015,8 @@ struct CounterCoverageMappingBuilder if (Gap) fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), BodyCount); - Counter OutCount = - addCounters(BC.BreakCount, subtractCounters(CondCount, BodyCount)); + Counter OutCount = addCounters(BodyBC.BreakCount, IncrementBC.BreakCount, + subtractCounters(CondCount, BodyCount)); if (OutCount != ParentCount) pushRegion(OutCount); } Modified: cfe/trunk/test/CoverageMapping/break.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CoverageMapping/break.c?rev=325319&r1=325318&r2=325319&view=diff ============================================================================== --- cfe/trunk/test/CoverageMapping/break.c (original) +++ cfe/trunk/test/CoverageMapping/break.c Thu Feb 15 23:59:43 2018 @@ -31,3 +31,14 @@ int main() { // CHECK: File 0, [ ++cnt; } } + +// CHECK-LABEL: break_continue_in_increment: +// CHECK: [[@LINE+6]]:11 -> [[@LINE+6]]:45 = #1 +// CHECK: [[@LINE+5]]:18 -> [[@LINE+5]]:19 = #1 +// CHECK: [[@LINE+4]]:21 -> [[@LINE+4]]:26 = #2 +// CHECK: [[@LINE+3]]:33 -> [[@LINE+3]]:41 = (#1 - #2) +// CHECK: [[@LINE+3]]:5 -> [[@LINE+3]]:6 = #1 +void break_continue_in_increment(int x) { + for (;; ({ if (x) break; else continue; })) + ; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits