aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-stdarg.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2015-02-09 18:01:36 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-02-09 18:01:36 +0100
commit21c0137a8af4ea11e48c8509799ebcbb1eb374bf (patch)
treeceda52eaeb57baf1c0dbf7e40eb9bd2804179661 /gcc/tree-stdarg.c
parent468963de96f93d1df2fbdb945c7bf23678d9f40d (diff)
downloadgcc-21c0137a8af4ea11e48c8509799ebcbb1eb374bf.zip
gcc-21c0137a8af4ea11e48c8509799ebcbb1eb374bf.tar.gz
gcc-21c0137a8af4ea11e48c8509799ebcbb1eb374bf.tar.bz2
re PR target/64979 (stdarg optimization not able to find escape sites in phi nodes)
PR target/64979 * tree-stdarg.c (pass_stdarg::execute): Scan phi node args for va_list escapes. * gcc.dg/tree-ssa/stdarg-7.c: New test. * gcc.c-torture/execute/pr64979.c: New test. From-SVN: r220543
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r--gcc/tree-stdarg.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index 883c692..2cf0ca3 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -856,22 +856,23 @@ pass_stdarg::execute (function *fun)
/* 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 lhs, rhs;
- use_operand_p uop;
- ssa_op_iter soi;
+ any real data movement. Also, check PHI nodes for taking address of
+ the va_list vars. */
+ tree lhs, rhs;
+ use_operand_p uop;
+ ssa_op_iter soi;
- for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
- gsi_next (&i))
- {
- gphi *phi = i.phi ();
- lhs = PHI_RESULT (phi);
+ for (gphi_iterator i = gsi_start_phis (bb); !gsi_end_p (i);
+ gsi_next (&i))
+ {
+ gphi *phi = i.phi ();
+ lhs = PHI_RESULT (phi);
- if (virtual_operand_p (lhs))
- continue;
+ if (virtual_operand_p (lhs))
+ continue;
+ if (va_list_simple_ptr)
+ {
FOR_EACH_PHI_ARG (uop, phi, soi, SSA_OP_USE)
{
rhs = USE_FROM_PTR (uop);
@@ -894,6 +895,22 @@ pass_stdarg::execute (function *fun)
}
}
}
+
+ for (unsigned j = 0; !va_list_escapes
+ && j < gimple_phi_num_args (phi); ++j)
+ if ((!va_list_simple_ptr
+ || TREE_CODE (gimple_phi_arg_def (phi, j)) != SSA_NAME)
+ && walk_tree (gimple_phi_arg_def_ptr (phi, j),
+ find_va_list_reference, &wi, NULL))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fputs ("va_list escapes in ", dump_file);
+ print_gimple_stmt (dump_file, phi, 0, dump_flags);
+ fputc ('\n', dump_file);
+ }
+ va_list_escapes = true;
+ }
}
for (gimple_stmt_iterator i = gsi_start_bb (bb);
@@ -916,8 +933,8 @@ pass_stdarg::execute (function *fun)
if (is_gimple_assign (stmt))
{
- tree lhs = gimple_assign_lhs (stmt);
- tree rhs = gimple_assign_rhs1 (stmt);
+ lhs = gimple_assign_lhs (stmt);
+ rhs = gimple_assign_rhs1 (stmt);
if (va_list_simple_ptr)
{