[PR68603] Associate conditional C++ loop's back-jump with start, not body
authorAndreas Arnez <arnez@linux.vnet.ibm.com>
Wed, 2 Dec 2015 07:26:30 +0000 (07:26 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Wed, 2 Dec 2015 07:26:30 +0000 (07:26 +0000)
SVN commit r230979 always associates a loop's back-jump with the start
of the loop body.  This caused a regression for gcov with conditional
loops, because then the loop body appears to be covered twice per
iteration.

2015-12-02  Andreas Arnez  <arnez@linux.vnet.ibm.com>

PR gcov-profile/68603
* cp-gimplify.c (genericize_cp_loop): For the back-jump's location
use the start of the loop body only if the loop is unconditional.

From-SVN: r231146

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c

index 9cc0a53144e640acf15564b2e1ff28f51ad41977..385ba635c4b5962a089c124b2d197daf47ed7e55 100644 (file)
@@ -1,3 +1,14 @@
+2015-12-02  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       PR gcov-profile/68603
+       * cp-gimplify.c (genericize_cp_loop): For the back-jump's location
+       use the start of the loop body only if the loop is unconditional.
+
+2015-11-26  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       * cp-gimplify.c (genericize_cp_loop): Change LOOP_EXPR's location
+       to start of loop body instead of start of loop.
+
 2015-12-01  Julian Brown  <julian@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
            James Norris  <James_Norris@mentor.com>
index a9a34cd81cc52a308bb5fbc54816fec1e3a54a75..3c89f1b05d0e2b54e4d929e5a31c5cff87c4df8a 100644 (file)
@@ -264,7 +264,9 @@ genericize_cp_loop (tree *stmt_p, location_t start_locus, tree cond, tree body,
     }
   else
     {
-      location_t loc = EXPR_LOCATION (expr_first (body));
+      location_t loc = start_locus;
+      if (!cond || integer_nonzerop (cond))
+       loc = EXPR_LOCATION (expr_first (body));
       if (loc == UNKNOWN_LOCATION)
        loc = start_locus;
       loop = build1_loc (loc, LOOP_EXPR, void_type_node, stmt_list);