Backported from mainline

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.

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


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@262049 138bc75d-0d04-0410-961f-82ee72b054a4
This commit is contained in:
jakub 2018-06-25 17:05:01 +00:00
parent 3a806dc308
commit 070cfc4091
6 changed files with 55 additions and 2 deletions

View File

@ -3,6 +3,15 @@
Backported from mainline
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.

View File

@ -2402,7 +2402,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++)
@ -2443,7 +2446,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);
}
}

View File

@ -1541,6 +1541,9 @@ force_nonfallthru_and_redirect (edge e, basic_block target, rtx jump_label)
basic_block bb = create_basic_block (BB_HEAD (e->dest), NULL,
ENTRY_BLOCK_PTR_FOR_FN (cfun));
/* 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;

View File

@ -3,6 +3,11 @@
Backported from mainline
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.

View File

@ -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;
}

View File

@ -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;
}
}