From 63e1159cce00ff64b4b60108f4e278050ca36f0f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 21 Dec 2017 20:28:10 +0100 Subject: [PATCH] re PR rtl-optimization/80747 (gcc.dg/tree-ssa/tailrecursion-4.c fails with ICE when compiled with options "-fprofile-use -freorder-blocks-and-partition") 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 | 9 +++++++++ gcc/bb-reorder.c | 6 ++++-- gcc/cfgrtl.c | 3 +++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr80747.c | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/pr83512.c | 16 ++++++++++++++++ 6 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr80747.c create mode 100644 gcc/testsuite/gcc.dg/pr83512.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b886cc..61ae2b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2017-12-21 Jakub Jelinek + 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. diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c index 794283c..72927b8 100644 --- a/gcc/bb-reorder.c +++ b/gcc/bb-reorder.c @@ -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); } } diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index e2da760..ac17d46 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 088e8b0..3575257 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2017-12-21 Jakub Jelinek + 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 index 0000000..ea9dd3c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr80747.c @@ -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 index 0000000..d86e57b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83512.c @@ -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; + } +} -- 2.7.4