Commit 7b5ab0cd by Richard Biener Committed by Richard Biener

re PR middle-end/68870 (ICE on valid code at -O1, -O2 and -O3 on x86_64-linux-gnu)

2015-12-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/68870
	* tree-cfgcleanup.c (cleanup_control_expr_graph): Add first_p
	parameter, if set only perform trivial constant folding.
	Queue other blocks with conditions for later processing.
	(cleanup_control_flow_bb): Add first_p parameter and pass it through.
	(cleanup_tree_cfg_1): Pass true for the first iteration
	cleanup_control_expr_graph.

	* gcc.dg/torture/pr68870.c: New testcase.

From-SVN: r231695
parent 44c068ae
2015-12-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/68870
* tree-cfgcleanup.c (cleanup_control_expr_graph): Add first_p
parameter, if set only perform trivial constant folding.
Queue other blocks with conditions for later processing.
(cleanup_control_flow_bb): Add first_p parameter and pass it through.
(cleanup_tree_cfg_1): Pass true for the first iteration
cleanup_control_expr_graph.
2015-12-16 Nathan Sidwell <nathan@acm.org> 2015-12-16 Nathan Sidwell <nathan@acm.org>
* config/nvptx/nvptx-protos.h (nvptx_hard_regno_mode_ok): Delete. * config/nvptx/nvptx-protos.h (nvptx_hard_regno_mode_ok): Delete.
2015-12-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/68870
* gcc.dg/torture/pr68870.c: New testcase.
2015-12-16 Tom de Vries <tom@codesourcery.com> 2015-12-16 Tom de Vries <tom@codesourcery.com>
* g++.dg/ipa/devirt-37.C: Update for new fre2 pass. * g++.dg/ipa/devirt-37.C: Update for new fre2 pass.
......
/* { dg-do compile } */
int printf (const char *, ...);
int a, f, g;
char b, d;
short c;
static short e;
char
fn1 ()
{
for (; b; b++)
{
int h = 5;
for (a = 0; a < 1; a++)
{
for (d = 0; d < 1; d++)
for (c = 0; c < 1; c++)
for (; e >= 0;)
return 5;
if (f)
h = 0;
}
if (h)
printf ("%d", 0);
}
return g;
}
...@@ -78,7 +78,8 @@ remove_fallthru_edge (vec<edge, va_gc> *ev) ...@@ -78,7 +78,8 @@ remove_fallthru_edge (vec<edge, va_gc> *ev)
at block BB. */ at block BB. */
static bool static bool
cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi) cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi,
bool first_p)
{ {
edge taken_edge; edge taken_edge;
bool retval = false; bool retval = false;
...@@ -95,15 +96,26 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi) ...@@ -95,15 +96,26 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
switch (gimple_code (stmt)) switch (gimple_code (stmt))
{ {
case GIMPLE_COND: case GIMPLE_COND:
{ /* During a first iteration on the CFG only remove trivially
code_helper rcode; dead edges but mark other conditions for re-evaluation. */
tree ops[3] = {}; if (first_p)
if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges, {
no_follow_ssa_edges) val = const_binop (gimple_cond_code (stmt), boolean_type_node,
&& rcode == INTEGER_CST) gimple_cond_lhs (stmt),
val = ops[0]; gimple_cond_rhs (stmt));
break; if (! val)
} bitmap_set_bit (cfgcleanup_altered_bbs, bb->index);
}
else
{
code_helper rcode;
tree ops[3] = {};
if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges,
no_follow_ssa_edges)
&& rcode == INTEGER_CST)
val = ops[0];
}
break;
case GIMPLE_SWITCH: case GIMPLE_SWITCH:
val = gimple_switch_index (as_a <gswitch *> (stmt)); val = gimple_switch_index (as_a <gswitch *> (stmt));
...@@ -176,7 +188,7 @@ cleanup_call_ctrl_altering_flag (gimple *bb_end) ...@@ -176,7 +188,7 @@ cleanup_call_ctrl_altering_flag (gimple *bb_end)
true if anything changes. */ true if anything changes. */
static bool static bool
cleanup_control_flow_bb (basic_block bb) cleanup_control_flow_bb (basic_block bb, bool first_p)
{ {
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
bool retval = false; bool retval = false;
...@@ -199,7 +211,7 @@ cleanup_control_flow_bb (basic_block bb) ...@@ -199,7 +211,7 @@ cleanup_control_flow_bb (basic_block bb)
|| gimple_code (stmt) == GIMPLE_SWITCH) || gimple_code (stmt) == GIMPLE_SWITCH)
{ {
gcc_checking_assert (gsi_stmt (gsi_last_bb (bb)) == stmt); gcc_checking_assert (gsi_stmt (gsi_last_bb (bb)) == stmt);
retval |= cleanup_control_expr_graph (bb, gsi); retval |= cleanup_control_expr_graph (bb, gsi, first_p);
} }
else if (gimple_code (stmt) == GIMPLE_GOTO else if (gimple_code (stmt) == GIMPLE_GOTO
&& TREE_CODE (gimple_goto_dest (stmt)) == ADDR_EXPR && TREE_CODE (gimple_goto_dest (stmt)) == ADDR_EXPR
...@@ -680,7 +692,7 @@ cleanup_tree_cfg_1 (void) ...@@ -680,7 +692,7 @@ cleanup_tree_cfg_1 (void)
{ {
bb = BASIC_BLOCK_FOR_FN (cfun, i); bb = BASIC_BLOCK_FOR_FN (cfun, i);
if (bb) if (bb)
retval |= cleanup_control_flow_bb (bb); retval |= cleanup_control_flow_bb (bb, true);
} }
/* After doing the above SSA form should be valid (or an update SSA /* After doing the above SSA form should be valid (or an update SSA
...@@ -708,7 +720,7 @@ cleanup_tree_cfg_1 (void) ...@@ -708,7 +720,7 @@ cleanup_tree_cfg_1 (void)
if (!bb) if (!bb)
continue; continue;
retval |= cleanup_control_flow_bb (bb); retval |= cleanup_control_flow_bb (bb, false);
retval |= cleanup_tree_cfg_bb (bb); retval |= cleanup_tree_cfg_bb (bb);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment