OSDN Git Service
(root)
/
pf3gnuchains
/
gcc-fork.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
2008-04-30 Paul Thomas <pault@gcc.gnu.org>
[pf3gnuchains/gcc-fork.git]
/
gcc
/
tree-tailcall.c
diff --git
a/gcc/tree-tailcall.c
b/gcc/tree-tailcall.c
index
544b0e3
..
0458c8a
100644
(file)
--- a/
gcc/tree-tailcall.c
+++ b/
gcc/tree-tailcall.c
@@
-135,7
+135,7
@@
suitable_for_tail_opt_p (void)
referenced_var_iterator rvi;
tree var;
referenced_var_iterator rvi;
tree var;
- if (c
urrent_function_
stdarg)
+ if (c
fun->
stdarg)
return false;
/* No local variable nor structure field should be call-clobbered. We
return false;
/* No local variable nor structure field should be call-clobbered. We
@@
-164,7
+164,7
@@
suitable_for_tail_call_opt_p (void)
/* alloca (until we have stack slot life analysis) inhibits
sibling call optimizations, but not tail recursion. */
/* alloca (until we have stack slot life analysis) inhibits
sibling call optimizations, but not tail recursion. */
- if (c
urrent_function_
calls_alloca)
+ if (c
fun->
calls_alloca)
return false;
/* If we are using sjlj exceptions, we may need to add a call to
return false;
/* If we are using sjlj exceptions, we may need to add a call to
@@
-176,7
+176,7
@@
suitable_for_tail_call_opt_p (void)
/* 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. */
/* 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 (c
urrent_function_
calls_setjmp)
+ if (c
fun->
calls_setjmp)
return false;
/* ??? It is OK if the argument of a function is taken in some cases,
return false;
/* ??? It is OK if the argument of a function is taken in some cases,
@@
-297,7
+297,7
@@
process_assignment (tree ass, tree stmt, block_stmt_iterator call, tree *m,
/* 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. */
/* 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 (FLOAT_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl))))
return false;
@@
-414,7
+414,8
@@
find_tail_calls (basic_block bb, struct tailcall **ret)
/* 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))
/* 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;
}
@@
-1016,8
+1017,10
@@
execute_tail_calls (void)
return tree_optimize_tail_calls_1 (true);
}
return tree_optimize_tail_calls_1 (true);
}
-struct
tre
e_opt_pass pass_tail_recursion =
+struct
gimpl
e_opt_pass pass_tail_recursion =
{
{
+ {
+ GIMPLE_PASS,
"tailr", /* name */
gate_tail_calls, /* gate */
execute_tail_recursion, /* execute */
"tailr", /* name */
gate_tail_calls, /* gate */
execute_tail_recursion, /* execute */
@@
-1029,12
+1032,14
@@
struct tree_opt_pass pass_tail_recursion =
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
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
tre
e_opt_pass pass_tail_calls =
+struct
gimpl
e_opt_pass pass_tail_calls =
{
{
+ {
+ GIMPLE_PASS,
"tailc", /* name */
gate_tail_calls, /* gate */
execute_tail_calls, /* execute */
"tailc", /* name */
gate_tail_calls, /* gate */
execute_tail_calls, /* execute */
@@
-1046,6
+1051,6
@@
struct tree_opt_pass pass_tail_calls =
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
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 */
+ }
};
};