referenced_var_iterator rvi;
tree var;
- if (current_function_stdarg)
+ if (cfun->stdarg)
return false;
/* No local variable nor structure field should be call-clobbered. We
/* alloca (until we have stack slot life analysis) inhibits
sibling call optimizations, but not tail recursion. */
- if (current_function_calls_alloca)
+ if (cfun->calls_alloca)
return false;
/* If we are using sjlj exceptions, we may need to add a call to
/* Any function that calls setjmp might have longjmp called from
any called function. ??? We really should represent this
properly in the CFG so that this needn't be special cased. */
- if (current_function_calls_setjmp)
+ if (cfun->calls_setjmp)
return false;
/* ??? It is OK if the argument of a function is taken in some cases,
/* Accumulator optimizations will reverse the order of operations.
We can only do that for floating-point types if we're assuming
that addition and multiplication are associative. */
- if (!flag_unsafe_math_optimizations)
+ if (!flag_associative_math)
if (FLOAT_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
return false;
/* If the statement has virtual or volatile operands, fail. */
ann = stmt_ann (stmt);
if (!ZERO_SSA_OPERANDS (stmt, (SSA_OP_VUSE | SSA_OP_VIRTUAL_DEFS))
- || ann->has_volatile_ops)
+ || ann->has_volatile_ops
+ || (!gimple_aliases_computed_p (cfun) && ann->references_memory))
return;
}
return tree_optimize_tail_calls_1 (true);
}
-struct tree_opt_pass pass_tail_recursion =
+struct gimple_opt_pass pass_tail_recursion =
{
+ {
+ GIMPLE_PASS,
"tailr", /* name */
gate_tail_calls, /* gate */
execute_tail_recursion, /* execute */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
- 0 /* letter */
+ TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
+ }
};
-struct tree_opt_pass pass_tail_calls =
+struct gimple_opt_pass pass_tail_calls =
{
+ {
+ GIMPLE_PASS,
"tailc", /* name */
gate_tail_calls, /* gate */
execute_tail_calls, /* execute */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
- TODO_dump_func | TODO_verify_ssa, /* todo_flags_finish */
- 0 /* letter */
+ TODO_dump_func | TODO_verify_ssa /* todo_flags_finish */
+ }
};