Commit ff9d1adc by Richard Henderson Committed by Richard Henderson

tree-ssa-ccp.c (optimize_stack_restore): Relax the conditions under which we…

tree-ssa-ccp.c (optimize_stack_restore): Relax the conditions under which we remove __builtin_stack_restore.

* tree-ssa-ccp.c (optimize_stack_restore): Relax the conditions under
        which we remove __builtin_stack_restore.

From-SVN: r152227
parent cdf1bf8b
2009-09-27 Richard Henderson <rth@redhat.com>
* tree-ssa-ccp.c (optimize_stack_restore): Relax the conditions under
which we remove __builtin_stack_restore.
2009-09-27 Bernd Schmidt <bernd.schmidt@analog.com> 2009-09-27 Bernd Schmidt <bernd.schmidt@analog.com>
* loop-iv.c (iv_analyze_op): Use function_invariant_p, not CONSTANT_P, * loop-iv.c (iv_analyze_op): Use function_invariant_p, not CONSTANT_P,
2009-09-27 Richard Henderson <rth@redhat.com>
* gcc.c-torture/compile/pr41469.c: Add -fexceptions.
* testsuite/gcc.dg/tree-ssa/pr41469-1.c: New.
2009-09-26 Andreas Schwab <schwab@linux-m68k.org> 2009-09-26 Andreas Schwab <schwab@linux-m68k.org>
PR c/41476 PR c/41476
......
/* { dg-options "-fexceptions" } */
void void
af (void *a) af (void *a)
{ {
......
/* { dg-do compile } */
/* { dg-options "-O2 -fexceptions -fdump-tree-optimized" } */
void af (void *a);
void
bf (void)
{
int i = 1;
char v[i];
af (v);
}
/* { dg-final { scan-tree-dump-not "__builtin_stack_save" "optimized"} } */
/* { dg-final { scan-tree-dump-not "__builtin_stack_restore" "optimized"} } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
...@@ -3089,9 +3089,8 @@ fold_stmt_inplace (gimple stmt) ...@@ -3089,9 +3089,8 @@ fold_stmt_inplace (gimple stmt)
static tree static tree
optimize_stack_restore (gimple_stmt_iterator i) optimize_stack_restore (gimple_stmt_iterator i)
{ {
tree callee, rhs; tree callee;
gimple stmt, stack_save; gimple stmt;
gimple_stmt_iterator stack_save_gsi;
basic_block bb = gsi_bb (i); basic_block bb = gsi_bb (i);
gimple call = gsi_stmt (i); gimple call = gsi_stmt (i);
...@@ -3115,32 +3114,49 @@ optimize_stack_restore (gimple_stmt_iterator i) ...@@ -3115,32 +3114,49 @@ optimize_stack_restore (gimple_stmt_iterator i)
return NULL_TREE; return NULL_TREE;
if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE) if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
break; goto second_stack_restore;
} }
if (gsi_end_p (i) if (!gsi_end_p (i))
&& (! single_succ_p (bb)
|| single_succ_edge (bb)->dest != EXIT_BLOCK_PTR))
return NULL_TREE; return NULL_TREE;
stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0)); /* Allow one successor of the exit block, or zero successors. */
if (gimple_code (stack_save) != GIMPLE_CALL switch (EDGE_COUNT (bb->succs))
|| gimple_call_lhs (stack_save) != gimple_call_arg (call, 0) {
|| stmt_could_throw_p (stack_save) case 0:
|| !has_single_use (gimple_call_arg (call, 0))) break;
return NULL_TREE; case 1:
if (single_succ_edge (bb)->dest != EXIT_BLOCK_PTR)
return NULL_TREE;
break;
default:
return NULL_TREE;
}
second_stack_restore:
callee = gimple_call_fndecl (stack_save); /* If there's exactly one use, then zap the call to __builtin_stack_save.
if (!callee If there are multiple uses, then the last one should remove the call.
|| DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL In any case, whether the call to __builtin_stack_save can be removed
|| DECL_FUNCTION_CODE (callee) != BUILT_IN_STACK_SAVE or not is irrelevant to removing the call to __builtin_stack_restore. */
|| gimple_call_num_args (stack_save) != 0) if (has_single_use (gimple_call_arg (call, 0)))
return NULL_TREE; {
gimple stack_save = SSA_NAME_DEF_STMT (gimple_call_arg (call, 0));
if (is_gimple_call (stack_save))
{
callee = gimple_call_fndecl (stack_save);
if (callee
&& DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL
&& DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_SAVE)
{
gimple_stmt_iterator stack_save_gsi;
tree rhs;
stack_save_gsi = gsi_for_stmt (stack_save); stack_save_gsi = gsi_for_stmt (stack_save);
rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0); rhs = build_int_cst (TREE_TYPE (gimple_call_arg (call, 0)), 0);
if (!update_call_from_tree (&stack_save_gsi, rhs)) update_call_from_tree (&stack_save_gsi, rhs);
return NULL_TREE; }
}
}
/* No effect, so the statement will be deleted. */ /* No effect, so the statement will be deleted. */
return integer_zero_node; return integer_zero_node;
......
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