re PR tree-optimization/51070 (ICE verify_gimple failed)

2011-11-10  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/51070
	* tree-loop-distribution.c (generate_builtin): Do not replace
	the loop with a builtin if the partition contains statements which
	results are used outside of the loop.
	(pass_loop_distribution): Verify and collect.

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

From-SVN: r181255
This commit is contained in:
Richard Guenther 2011-11-10 13:46:27 +00:00 committed by Richard Biener
parent 98dd3b733f
commit c07a8cb3c9
4 changed files with 103 additions and 47 deletions

View file

@ -1,3 +1,11 @@
2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51070
* tree-loop-distribution.c (generate_builtin): Do not replace
the loop with a builtin if the partition contains statements which
results are used outside of the loop.
(pass_loop_distribution): Verify and collect.
2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51030

View file

@ -1,3 +1,8 @@
2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51070
* gcc.dg/torture/pr51070.c: New testcase.
2011-11-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51030

View file

@ -0,0 +1,34 @@
/* { dg-do compile } */
int
func_4 (int si1, int si2)
{
return si1;
}
int
func_14 (int left, int right)
{
return 1;
}
int
func_37 (int left, int right)
{
return left;
}
int g_92[1024];
int g_95[1024];
int g_224;
int g_352[1024];
int
func_9 ()
{
for (; g_224; g_224 += 1)
{
g_95[0] = func_4 (func_37 (g_92[g_224], 0), 0);
g_92[g_224] = 0, g_352[g_224] = func_14 (0, 0);
}
return 0;
}

View file

@ -63,6 +63,48 @@ static bitmap remaining_stmts;
predecessor a node that writes to memory. */
static bitmap upstream_mem_writes;
/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
the LOOP. */
static bool
ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
{
imm_use_iterator imm_iter;
use_operand_p use_p;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
if (loop != loop_containing_stmt (USE_STMT (use_p)))
return true;
return false;
}
/* Returns true when STMT defines a scalar variable used after the
loop. */
static bool
stmt_has_scalar_dependences_outside_loop (gimple stmt)
{
tree name;
switch (gimple_code (stmt))
{
case GIMPLE_ASSIGN:
name = gimple_assign_lhs (stmt);
break;
case GIMPLE_PHI:
name = gimple_phi_result (stmt);
break;
default:
return false;
}
return TREE_CODE (name) == SSA_NAME
&& ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
}
/* Update the PHI nodes of NEW_LOOP. NEW_LOOP is a duplicate of
ORIG_LOOP. */
@ -330,10 +372,18 @@ generate_builtin (struct loop *loop, bitmap partition, bool copy_p)
{
gimple stmt = gsi_stmt (bsi);
if (gimple_code (stmt) != GIMPLE_LABEL
&& !is_gimple_debug (stmt)
&& bitmap_bit_p (partition, x++)
&& is_gimple_assign (stmt)
if (gimple_code (stmt) == GIMPLE_LABEL
|| is_gimple_debug (stmt))
continue;
if (!bitmap_bit_p (partition, x++))
continue;
/* If the stmt has uses outside of the loop fail. */
if (stmt_has_scalar_dependences_outside_loop (stmt))
goto end;
if (is_gimple_assign (stmt)
&& !is_gimple_reg (gimple_assign_lhs (stmt)))
{
/* Don't generate the builtins when there are more than
@ -824,48 +874,6 @@ fuse_partitions_with_similar_memory_accesses (struct graph *rdg,
}
}
/* Returns true when DEF is an SSA_NAME defined in LOOP and used after
the LOOP. */
static bool
ssa_name_has_uses_outside_loop_p (tree def, loop_p loop)
{
imm_use_iterator imm_iter;
use_operand_p use_p;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, def)
if (loop != loop_containing_stmt (USE_STMT (use_p)))
return true;
return false;
}
/* Returns true when STMT defines a scalar variable used after the
loop. */
static bool
stmt_has_scalar_dependences_outside_loop (gimple stmt)
{
tree name;
switch (gimple_code (stmt))
{
case GIMPLE_ASSIGN:
name = gimple_assign_lhs (stmt);
break;
case GIMPLE_PHI:
name = gimple_phi_result (stmt);
break;
default:
return false;
}
return TREE_CODE (name) == SSA_NAME
&& ssa_name_has_uses_outside_loop_p (name, loop_containing_stmt (stmt));
}
/* Returns true when STMT will be code generated in a partition of RDG
different than PART and that will not be code generated as a
builtin. */
@ -1311,6 +1319,7 @@ struct gimple_opt_pass pass_loop_distribution =
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
0 /* todo_flags_finish */
TODO_ggc_collect
| TODO_verify_ssa /* todo_flags_finish */
}
};