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.
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++)
{
force_nonfallthru (e);
e->src->aux = ENTRY_BLOCK_PTR_FOR_FN (cfun)->aux;
- BB_COPY_PARTITION (e->src, e->dest);
}
}
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;
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.
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+ }
+}