Fix profile update in tree-ssa-isolate-paths.c (PR tree-optimization/82059).
authorMartin Liska <mliska@suse.cz>
Fri, 1 Sep 2017 13:02:37 +0000 (15:02 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 1 Sep 2017 13:02:37 +0000 (13:02 +0000)
2017-09-01  Martin Liska  <mliska@suse.cz>

PR tree-optimization/82059
* gimple-ssa-isolate-paths.c (isolate_path): Add profile and
frequency only when an edge is redirected.
2017-09-01  Martin Liska  <mliska@suse.cz>

PR tree-optimization/82059
* gcc.dg/tree-ssa/pr82059.c: New test.

From-SVN: r251591

gcc/ChangeLog
gcc/gimple-ssa-isolate-paths.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr82059.c [new file with mode: 0644]

index 61ba8994f13daa6d6e0483aaed1bc8799760499b..125eb928211b386f3840e368d6a543b7e99f48ff 100644 (file)
@@ -1,3 +1,9 @@
+2017-09-01  Martin Liska  <mliska@suse.cz>
+
+       PR tree-optimization/82059
+       * gimple-ssa-isolate-paths.c (isolate_path): Add profile and
+       frequency only when an edge is redirected.
+
 2017-09-01  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc-c.c (__ARC_LPC_WIDTH__): Add builtin define.
index fbc41057463c18c40e446fa4f1b99d11326c3305..807e00324105d7814473cf0e7a74949ac0f90a84 100644 (file)
@@ -160,14 +160,17 @@ isolate_path (basic_block bb, basic_block duplicate,
        for (ei = ei_start (duplicate->succs); (e2 = ei_safe_edge (ei)); )
          remove_edge (e2);
     }
-  bb->frequency += EDGE_FREQUENCY (e);
-  bb->count += e->count;
 
   /* Complete the isolation step by redirecting E to reach DUPLICATE.  */
   e2 = redirect_edge_and_branch (e, duplicate);
   if (e2)
-    flush_pending_stmts (e2);
+    {
+      flush_pending_stmts (e2);
 
+      /* Update profile only when redirection is really processed.  */
+      bb->frequency += EDGE_FREQUENCY (e);
+      bb->count += e->count;
+    }
 
   /* There may be more than one statement in DUPLICATE which exhibits
      undefined behavior.  Ultimately we want the first such statement in
index 12161a62963e619629c7eae0204a66a3da3eb2e8..0cd2a62e5e5d98fa82d829570738d7f37b76b543 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-01  Martin Liska  <mliska@suse.cz>
+
+       PR tree-optimization/82059
+       * gcc.dg/tree-ssa/pr82059.c: New test.
+
 2017-09-01  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * gcc.target/arc/loop-1.c: Deleted.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c b/gcc/testsuite/gcc.dg/tree-ssa/pr82059.c
new file mode 100644 (file)
index 0000000..0285b03
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR tree-optimization/82059 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-isolate-paths" } */
+
+struct a
+{
+  char b;
+  struct a *c;
+} d (), f;
+void *e;
+long g;
+void
+h ()
+{
+  struct a *i = 0;
+  if (g)
+    i = e;
+  if (!i)
+    d ();
+  i->c = &f;
+  i->b = *(char *) h;
+}