diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c52d7f973a..93be53d2592 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-12-30 Jan Hubicka + + * tree-ssa-alias.c (create_structure_vars): When in SSA, update operand + caches. + * tree-ssa-operands.c (build_ssa_operands): Recompute addresses_taken + bitmap. + 2006-12-30 Jan Hubicka Vladimir Yanovsky diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 939ac0f8fec..2ef529707cd 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -3188,6 +3188,58 @@ create_structure_vars (void) } htab_delete (used_portions); VEC_free (tree, heap, varvec); + + /* Update SSA operands of statememnts mentioning varibales we split. */ + if (gimple_in_ssa_p (cfun)) + FOR_EACH_BB (bb) + { + block_stmt_iterator bsi; + for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) + { + tree stmt = bsi_stmt (bsi); + bool update = false; + unsigned int i; + bitmap_iterator bi; + + if (STORED_SYMS (stmt)) + EXECUTE_IF_SET_IN_BITMAP (STORED_SYMS (stmt), 0, i, bi) + { + tree sym = referenced_var_lookup (i); + if (get_subvars_for_var (sym)) + { + update=true; + break; + } + } + + if (LOADED_SYMS (stmt) && !update) + EXECUTE_IF_SET_IN_BITMAP (LOADED_SYMS (stmt), 0, i, bi) + { + tree sym = referenced_var_lookup (i); + if (get_subvars_for_var (sym)) + { + update=true; + break; + } + } + + if (stmt_ann (stmt)->addresses_taken && !update) + EXECUTE_IF_SET_IN_BITMAP (stmt_ann (stmt)->addresses_taken, + 0, i, bi) + { + tree sym = referenced_var_lookup (i); + if (get_subvars_for_var (sym)) + { + update=true; + break; + } + } + + if (update) + update_stmt (stmt); + } + } + return 0; } diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index d47d19cba1a..9d4b84cc709 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -2337,6 +2337,9 @@ build_ssa_operands (tree stmt) makes no memory references. */ ann->has_volatile_ops = false; ann->references_memory = false; + /* Just clear the bitmap so we don't end up reallocating it over and over. */ + if (ann->addresses_taken) + bitmap_clear (ann->addresses_taken); start_ssa_stmt_operands (); parse_ssa_operands (stmt); @@ -2344,6 +2347,8 @@ build_ssa_operands (tree stmt) operand_build_sort_virtual (build_vdefs); finalize_ssa_stmt_operands (stmt); + if (ann->addresses_taken && bitmap_empty_p (ann->addresses_taken)) + ann->addresses_taken = NULL; /* For added safety, assume that statements with volatile operands also reference memory. */ if (ann->has_volatile_ops)