Fix bb-reorder problem with degenerate cond_jump (PR68182)

The code mistakenly thinks any cond_jump has two successors.  This is
not true if both destinations are the same, as can happen with weird
patterns as in the PR.


	PR rtl-optimization/68182
	* gcc/bb-reorder.c (reorder_basic_blocks_simple): Treat a conditional
	branch with only one successor just like unconditional branches.

From-SVN: r229983
This commit is contained in:
Segher Boessenkool 2015-11-09 04:57:19 +01:00
parent 4f70cb39c0
commit d4c8d5ede1
2 changed files with 10 additions and 4 deletions

View file

@ -1,4 +1,10 @@
2015-11-08 Jeff Law <jeff@redhat.com>
2015-11-09 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/68182
* gcc/bb-reorder.c (reorder_basic_blocks_simple): Treat a conditional
branch with only one successor just like unconditional branches.
2015-11-08 Jeff Law <jeff@redhat.com>
* tree-ssa-threadupdate.c (register_jump_thraed): Assert that a
non-FSM path has no edges marked with EDGE_DFS_BACK.

View file

@ -2304,7 +2304,9 @@ reorder_basic_blocks_simple (void)
if (JUMP_P (end) && extract_asm_operands (end))
continue;
if (any_condjump_p (end))
if (single_succ_p (bb))
edges[n++] = EDGE_SUCC (bb, 0);
else if (any_condjump_p (end))
{
edge e0 = EDGE_SUCC (bb, 0);
edge e1 = EDGE_SUCC (bb, 1);
@ -2315,8 +2317,6 @@ reorder_basic_blocks_simple (void)
edges[n++] = e0;
edges[n++] = e1;
}
else if (single_succ_p (bb))
edges[n++] = EDGE_SUCC (bb, 0);
}
/* Sort the edges, the most desirable first. When optimizing for size