aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-stdarg.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-stdarg.c')
-rw-r--r--gcc/tree-stdarg.c29
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;