diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-12-21 20:28:10 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-12-21 20:28:10 +0100 |
commit | 63e1159cce00ff64b4b60108f4e278050ca36f0f (patch) | |
tree | 50e7acc64c90af764212da7bce7be2d500da1cee /gcc | |
parent | 9b8e85a5e3be803e0b476a8bbcb8aee0e9c48837 (diff) | |
download | gcc-63e1159cce00ff64b4b60108f4e278050ca36f0f.zip gcc-63e1159cce00ff64b4b60108f4e278050ca36f0f.tar.gz gcc-63e1159cce00ff64b4b60108f4e278050ca36f0f.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/bb-reorder.c | 6 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr80747.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr83512.c | 16 |
6 files changed, 55 insertions, 2 deletions
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 <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. 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 <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 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; + } +} |