gimple-low.c (lower_function_body): Clear the location of the first inserted represen...
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 10 Nov 2014 08:53:16 +0000 (08:53 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 10 Nov 2014 08:53:16 +0000 (08:53 +0000)
* gimple-low.c (lower_function_body): Clear the location of the first
inserted representative return if it also fills in for the fallthru.

From-SVN: r217278

gcc/ChangeLog
gcc/gimple-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.misc-tests/gcov-16.c [new file with mode: 0644]

index d3f061eaff7c6c8f0894775f37faccfe476a969a..97fc20e6dd00e112be94c5cc7522761ae2d7c31e 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gimple-low.c (lower_function_body): Clear the location of the first
+       inserted representative return if it also fills in for the fallthru.
+
 2014-11-10  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        * tree-if-conv.c (add_to_predicate_list): Check unconditionally
index 310ade86c1f383ae70b744bd626b9a8c8045feb5..3507d3cb09d10daa94bdf6ef6a0787dc00f75c9c 100644 (file)
@@ -129,7 +129,8 @@ lower_function_body (void)
   /* If the function falls off the end, we need a null return statement.
      If we've already got one in the return_statements vector, we don't
      need to do anything special.  Otherwise build one by hand.  */
-  if (gimple_seq_may_fallthru (lowered_body)
+  bool may_fallthru = gimple_seq_may_fallthru (lowered_body);
+  if (may_fallthru
       && (data.return_statements.is_empty ()
          || (gimple_return_retval (data.return_statements.last().stmt)
              != NULL)))
@@ -138,6 +139,7 @@ lower_function_body (void)
       gimple_set_location (x, cfun->function_end_locus);
       gimple_set_block (x, DECL_INITIAL (current_function_decl));
       gsi_insert_after (&i, x, GSI_CONTINUE_LINKING);
+      may_fallthru = false;
     }
 
   /* If we lowered any return statements, emit the representative
@@ -148,6 +150,14 @@ lower_function_body (void)
       x = gimple_build_label (t.label);
       gsi_insert_after (&i, x, GSI_CONTINUE_LINKING);
       gsi_insert_after (&i, t.stmt, GSI_CONTINUE_LINKING);
+      if (may_fallthru)
+       {
+         /* Remove the line number from the representative return statement.
+            It now fills in for the fallthru too.  Failure to remove this
+            will result in incorrect results for coverage analysis.  */
+         gimple_set_location (t.stmt, UNKNOWN_LOCATION);
+         may_fallthru = false;
+       }
     }
 
   /* Once the old body has been lowered, replace it with the new
index cd049812ee9ffe79cd13d8ae8907e5530e75f48c..8c9df3d70c4ed387951d6f812c52427b103aca16 100644 (file)
@@ -1,3 +1,7 @@
+2014-11-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc.misc-tests/gcov-16.c: New test.
+
 2014-11-10  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        * gcc.dg/tree-ssa/ifc-cd.c: New test.
diff --git a/gcc/testsuite/gcc.misc-tests/gcov-16.c b/gcc/testsuite/gcc.misc-tests/gcov-16.c
new file mode 100644 (file)
index 0000000..738113c
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-options "-fprofile-arcs -ftest-coverage" } */
+/* { dg-do run { target native } } */
+
+void
+bar (void)
+{}
+
+void
+foo (int i)
+{
+  if (i > 1)  /* count(1) */
+    return;   /* count(#####) */
+
+  bar ();      /* count(1) */
+}
+
+int
+main (void)
+{
+  foo (0);
+  return 0;
+}
+
+/* { dg-final { run-gcov gcov-16.c } } */