* tree-stdarg.c (execute_optimize_stdarg): Process PHI nodes too.

From-SVN: r104865
This commit is contained in:
Richard Henderson 2005-10-02 02:05:45 -07:00 committed by Richard Henderson
parent e3fe057d20
commit 746077ffa5
2 changed files with 49 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2005-10-01 Richard Henderson <rth@redhat.com>
* tree-stdarg.c (execute_optimize_stdarg): Process PHI nodes too.
2005-10-01 Mark Mitchell <mark@codesourcery.com>
* config/arm/unknown-elf.h (LINK_GCC_C_SEQUENCE_SPEC): Define

View File

@ -624,6 +624,7 @@ execute_optimize_stdarg (void)
va_list_simple_ptr = POINTER_TYPE_P (va_list_type_node)
&& (TREE_TYPE (va_list_type_node) == void_type_node
|| TREE_TYPE (va_list_type_node) == char_type_node);
gcc_assert (is_gimple_reg_type (va_list_type_node) == va_list_simple_ptr);
FOR_EACH_BB (bb)
{
@ -742,6 +743,50 @@ execute_optimize_stdarg (void)
si.compute_sizes = -1;
si.bb = bb;
/* For va_list_simple_ptr, we have to check PHI nodes too. We treat
them as assignments for the purpose of escape analysis. This is
not needed for non-simple va_list because virtual phis don't perform
any real data movement. */
if (va_list_simple_ptr)
{
tree phi, lhs, rhs;
use_operand_p uop;
ssa_op_iter soi;
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
lhs = PHI_RESULT (phi);
if (!is_gimple_reg (lhs))
continue;
FOR_EACH_PHI_ARG (uop, phi, soi, SSA_OP_USE)
{
rhs = USE_FROM_PTR (uop);
if (va_list_ptr_read (&si, rhs, lhs))
continue;
else if (va_list_ptr_write (&si, lhs, rhs))
continue;
else
check_va_list_escapes (&si, lhs, rhs);
if (si.va_list_escapes
|| walk_tree (&phi, find_va_list_reference,
si.va_list_vars, NULL))
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
fputs ("va_list escapes in ", dump_file);
print_generic_expr (dump_file, phi, dump_flags);
fputc ('\n', dump_file);
}
va_list_escapes = true;
}
}
}
}
for (i = bsi_start (bb);
!bsi_end_p (i) && !va_list_escapes;
bsi_next (&i))