diff options
author | Richard Henderson <rth@redhat.com> | 2005-10-02 02:05:45 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2005-10-02 02:05:45 -0700 |
commit | 746077ffa54f6b711bd93aba1653519c12d5fbcf (patch) | |
tree | 86f300dd419cffeeb646b4417b1ddf2fd0d638f5 /gcc/tree-stdarg.c | |
parent | e3fe057d20acfadc61b4d7d92a65a53d0963e4c9 (diff) | |
download | gcc-746077ffa54f6b711bd93aba1653519c12d5fbcf.tar.gz |
* tree-stdarg.c (execute_optimize_stdarg): Process PHI nodes too.
From-SVN: r104865
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r-- | gcc/tree-stdarg.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index c68e7b58c2c..287e3bbc771 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -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)) |