re PR middle-end/59330 (Crash in is_gimple_reg_type)

2013-11-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/59330
	* tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify
	and fix delayed marking of free calls not necessary.

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

From-SVN: r205486
This commit is contained in:
Richard Biener 2013-11-28 14:52:44 +00:00 committed by Richard Biener
parent 0c6b087cc1
commit c54e20229d
4 changed files with 38 additions and 18 deletions

View file

@ -1,3 +1,9 @@
2013-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/59330
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Simplify
and fix delayed marking of free calls not necessary.
2013-11-28 Andrew MacLeod <amacleod@redhat.com>
* tree-ssa-propagate.c (valid_gimple_call_p): Pass TREE_TYPE to

View file

@ -1,3 +1,8 @@
2013-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/59330
* gcc.dg/torture/pr59330.c: New testcase.
2013-11-28 Richard Biener <rguenther@suse.de>
PR lto/59323

View file

@ -0,0 +1,17 @@
/* { dg-do run } */
void free(void *ptr)
{
}
void *foo(void)
{
return 0;
}
int main(void)
{
void *p = foo();
free(p);
return 0;
}

View file

@ -1191,26 +1191,18 @@ eliminate_unnecessary_stmts (void)
stats.total++;
/* We can mark a call to free as not necessary if the
defining statement of its argument is an allocation
function and that is not necessary itself. */
if (gimple_call_builtin_p (stmt, BUILT_IN_FREE))
defining statement of its argument is not necessary
(and thus is getting removed). */
if (gimple_plf (stmt, STMT_NECESSARY)
&& gimple_call_builtin_p (stmt, BUILT_IN_FREE))
{
tree ptr = gimple_call_arg (stmt, 0);
tree callee2;
gimple def_stmt;
if (TREE_CODE (ptr) != SSA_NAME)
continue;
def_stmt = SSA_NAME_DEF_STMT (ptr);
if (!is_gimple_call (def_stmt)
|| gimple_plf (def_stmt, STMT_NECESSARY))
continue;
callee2 = gimple_call_fndecl (def_stmt);
if (callee2 == NULL_TREE
|| DECL_BUILT_IN_CLASS (callee2) != BUILT_IN_NORMAL
|| (DECL_FUNCTION_CODE (callee2) != BUILT_IN_MALLOC
&& DECL_FUNCTION_CODE (callee2) != BUILT_IN_CALLOC))
continue;
gimple_set_plf (stmt, STMT_NECESSARY, false);
if (TREE_CODE (ptr) == SSA_NAME)
{
gimple def_stmt = SSA_NAME_DEF_STMT (ptr);
if (!gimple_plf (def_stmt, STMT_NECESSARY))
gimple_set_plf (stmt, STMT_NECESSARY, false);
}
}
/* If GSI is not necessary then remove it. */