re PR rtl-optimization/80747 (gcc.dg/tree-ssa/tailrecursion-4.c fails with ICE when...
authorJakub Jelinek <jakub@redhat.com>
Thu, 21 Dec 2017 19:28:10 +0000 (20:28 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 21 Dec 2017 19:28:10 +0000 (20:28 +0100)
PR rtl-optimization/80747
PR rtl-optimization/83512
* cfgrtl.c (force_nonfallthru_and_redirect): When splitting
succ edge from ENTRY, copy partition from e->dest to the newly
created bb.
* bb-reorder.c (reorder_basic_blocks_simple): If last_tail is
ENTRY, use BB_PARTITION of its successor block as current_partition.
Don't copy partition when splitting succ edge from ENTRY.

* gcc.dg/pr80747.c: New test.
* gcc.dg/pr83512.c: New test.

From-SVN: r255954

gcc/ChangeLog
gcc/bb-reorder.c
gcc/cfgrtl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr80747.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr83512.c [new file with mode: 0644]

index 4b886cc2f4956a30b0945dfa05a0b7b1711f6a63..61ae2b6eaa276adf31a54995477a92f1f503d1ed 100644 (file)
@@ -1,5 +1,14 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/80747
+       PR rtl-optimization/83512
+       * cfgrtl.c (force_nonfallthru_and_redirect): When splitting
+       succ edge from ENTRY, copy partition from e->dest to the newly
+       created bb.
+       * bb-reorder.c (reorder_basic_blocks_simple): If last_tail is
+       ENTRY, use BB_PARTITION of its successor block as current_partition.
+       Don't copy partition when splitting succ edge from ENTRY.
+
        PR tree-optimization/83523
        * tree-ssa-math-opts.c (is_widening_mult_p): Return false if
        for INTEGER_TYPE TYPE_OVERFLOW_TRAPS.
index 794283cd7cf014fa1891d8e89b1d38035962b624..72927b8c26742922317603b0dc476aa2fa1db8b4 100644 (file)
@@ -2405,7 +2405,10 @@ reorder_basic_blocks_simple (void)
 
   basic_block last_tail = (basic_block) ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux;
 
-  int current_partition = BB_PARTITION (last_tail);
+  int current_partition
+    = BB_PARTITION (last_tail == ENTRY_BLOCK_PTR_FOR_FN (cfun)
+                   ? EDGE_SUCC (ENTRY_BLOCK_PTR_FOR_FN (cfun), 0)->dest
+                   : last_tail);
   bool need_another_pass = true;
 
   for (int pass = 0; pass < 2 && need_another_pass; pass++)
@@ -2446,7 +2449,6 @@ reorder_basic_blocks_simple (void)
     {
       force_nonfallthru (e);
       e->src->aux = ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux;
-      BB_COPY_PARTITION (e->src, e->dest);
     }
 }
 
index e2da7608a91bd936fb00f5a3c23232b2fbe5b59b..ac17d46a24da435fed6f8cd882350c953adbd2e1 100644 (file)
@@ -1534,6 +1534,9 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
                                               ENTRY_BLOCK_PTR_FOR_FN (cfun));
          bb->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
 
+         /* Make sure new block ends up in correct hot/cold section.  */
+         BB_COPY_PARTITION (bb, e->dest);
+
          /* Change the existing edge's source to be the new block, and add
             a new edge from the entry block to the new block.  */
          e->src = bb;
index 088e8b0784f6710eecbf98938dabd92d1c4c486b..35752574666d6846cdeec66ca4017ed91dc202e7 100644 (file)
@@ -1,5 +1,10 @@
 2017-12-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/80747
+       PR rtl-optimization/83512
+       * gcc.dg/pr80747.c: New test.
+       * gcc.dg/pr83512.c: New test.
+
        PR tree-optimization/83523
        * g++.dg/tree-ssa/pr83523.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr80747.c b/gcc/testsuite/gcc.dg/pr80747.c
new file mode 100644 (file)
index 0000000..ea9dd3c
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR rtl-optimization/80747 */
+/* { dg-do compile } */
+/* { dg-options "-fprofile-use -freorder-blocks-and-partition -O1 -foptimize-sibling-calls" } */
+
+int
+foo (int a)
+{
+  int r;
+  if (a & 1)
+    r = foo (a - 1);
+  else if (a)
+    r = foo (a - 2);
+  else
+    return 0;
+  if (r)
+    r = r;
+  return r;
+}
diff --git a/gcc/testsuite/gcc.dg/pr83512.c b/gcc/testsuite/gcc.dg/pr83512.c
new file mode 100644 (file)
index 0000000..d86e57b
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR rtl-optimization/83512 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -freorder-blocks-algorithm=simple" } */
+
+int a;
+
+void
+foo (int *x)
+{
+  for (;;)
+    {
+      for (*x = 0; *x < 1; *x++)
+       ;
+      ++a;
+    }
+}