summaryrefslogtreecommitdiff
path: root/gcc/tree-stdarg.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-02-05 16:54:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2013-02-05 16:54:39 +0100
commit11f1e3ab239b3a45b085ca5eb1327f1254fb6205 (patch)
tree899e8e666ecaed66a88bbdcc9ab214a36edc66dd /gcc/tree-stdarg.c
parent14ac6aa24e155affd1829600a5294a8f3cc115cd (diff)
re PR tree-optimization/56205 (stdarg pass confused by jump threading)
PR tree-optimization/56205 * tree-stdarg.c (check_all_va_list_escapes): Return true if there are any PHI nodes that set non-va_list_escape_vars SSA_NAME and some va_list_escape_vars SSA_NAME appears in some PHI argument. * gcc.dg/tree-ssa/stdarg-6.c: New test. * gcc.c-torture/execute/pr56205.c: New test. From-SVN: r195760
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r--gcc/tree-stdarg.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index cd573a339cf..8ad9fc2d22e 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -526,6 +526,37 @@ check_all_va_list_escapes (struct stdarg_info *si)
{
gimple_stmt_iterator i;
+ for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
+ {
+ tree lhs;
+ use_operand_p uop;
+ ssa_op_iter soi;
+ gimple phi = gsi_stmt (i);
+
+ lhs = PHI_RESULT (phi);
+ if (virtual_operand_p (lhs)
+ || bitmap_bit_p (si->va_list_escape_vars,
+ SSA_NAME_VERSION (lhs)))
+ continue;
+
+ FOR_EACH_PHI_ARG (uop, phi, soi, SSA_OP_USE)
+ {
+ tree rhs = USE_FROM_PTR (uop);
+ if (TREE_CODE (rhs) == SSA_NAME
+ && bitmap_bit_p (si->va_list_escape_vars,
+ SSA_NAME_VERSION (rhs)))
+ {
+ 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);
+ }
+ return true;
+ }
+ }
+ }
+
for (i = gsi_start_bb (bb); !gsi_end_p (i); gsi_next (&i))
{
gimple stmt = gsi_stmt (i);