re PR tree-optimization/51692 (ICE on several valgrind tests)

2012-01-03  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/51692
	* tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not remove
	the LHS of allocation stmts.

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

From-SVN: r182838
This commit is contained in:
Richard Guenther 2012-01-03 11:54:53 +00:00 committed by Richard Biener
parent 75291c57b9
commit f1749ec1b1
4 changed files with 53 additions and 22 deletions

View File

@ -1,3 +1,9 @@
2012-01-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51692
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Do not remove
the LHS of allocation stmts.
2012-01-03 Olivier Hainque <hainque@adacore.com>
* system.h: Prior to #define, #undef fopen and freopen unconditionally.

View File

@ -1,3 +1,8 @@
2012-01-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51692
* gcc.dg/torture/pr51692.c: New testcase.
2012-01-03 Richard Guenther <rguenther@suse.de>
PR debug/51650

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
int
main ()
{
volatile double d = 0.0;
double *p = __builtin_calloc (1, sizeof (double));
d += 1.0;
*p += 2.0;
__builtin_free (p);
return 0;
}

View File

@ -1329,31 +1329,38 @@ eliminate_unnecessary_stmts (void)
}
else if (is_gimple_call (stmt))
{
call = gimple_call_fndecl (stmt);
if (call)
tree name = gimple_call_lhs (stmt);
notice_special_calls (stmt);
/* When LHS of var = call (); is dead, simplify it into
call (); saving one operand. */
if (name
&& TREE_CODE (name) == SSA_NAME
&& !TEST_BIT (processed, SSA_NAME_VERSION (name))
/* Avoid doing so for allocation calls which we
did not mark as necessary, it will confuse the
special logic we apply to malloc/free pair removal. */
&& (!(call = gimple_call_fndecl (stmt))
|| DECL_BUILT_IN_CLASS (call) != BUILT_IN_NORMAL
|| (DECL_FUNCTION_CODE (call) != BUILT_IN_MALLOC
&& DECL_FUNCTION_CODE (call) != BUILT_IN_CALLOC
&& DECL_FUNCTION_CODE (call) != BUILT_IN_ALLOCA
&& (DECL_FUNCTION_CODE (call)
!= BUILT_IN_ALLOCA_WITH_ALIGN))))
{
tree name;
/* When LHS of var = call (); is dead, simplify it into
call (); saving one operand. */
name = gimple_call_lhs (stmt);
if (name && TREE_CODE (name) == SSA_NAME
&& !TEST_BIT (processed, SSA_NAME_VERSION (name)))
something_changed = true;
if (dump_file && (dump_flags & TDF_DETAILS))
{
something_changed = true;
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "Deleting LHS of call: ");
print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
fprintf (dump_file, "\n");
}
gimple_call_set_lhs (stmt, NULL_TREE);
maybe_clean_or_replace_eh_stmt (stmt, stmt);
update_stmt (stmt);
release_ssa_name (name);
fprintf (dump_file, "Deleting LHS of call: ");
print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
fprintf (dump_file, "\n");
}
notice_special_calls (stmt);
gimple_call_set_lhs (stmt, NULL_TREE);
maybe_clean_or_replace_eh_stmt (stmt, stmt);
update_stmt (stmt);
release_ssa_name (name);
}
}
}