diff options
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r-- | gcc/tree-stdarg.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c index 110c9f164b4..2de2f2aff70 100644 --- a/gcc/tree-stdarg.c +++ b/gcc/tree-stdarg.c @@ -517,28 +517,23 @@ check_all_va_list_escapes (struct stdarg_info *si) { tree stmt = bsi_stmt (i), use; ssa_op_iter iter; + bool loads_escape_p; + + loads_escape_p = false; + if (stmt_references_memory_p (stmt)) + { + mem_syms_map_t mp = get_loads_and_stores (stmt); + loads_escape_p = mp->loads + && bitmap_intersect_p (si->va_list_escape_vars, + mp->loads); + } FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_ALL_USES) { tree sym = SSA_NAME_VAR (use); - if (sym == mem_var) - { - if (loads == NULL) - { - loads = BITMAP_ALLOC (NULL); - stores = BITMAP_ALLOC (NULL); - } - else - { - bitmap_clear (loads); - bitmap_clear (stores); - } - - get_loads_and_stores (stmt, loads, stores); - if (!bitmap_intersect_p (si->va_list_escape_vars, loads)) - continue; - } + if (sym == mem_var && loads_escape_p) + continue; else if (!bitmap_bit_p (si->va_list_escape_vars, DECL_UID (sym))) continue; |