aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-ssa-alias.c52
-rw-r--r--gcc/tree-ssa-operands.c5
3 files changed, 64 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c52d7f..93be53d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,11 @@
2006-12-30 Jan Hubicka <jh@suse.cz>
+
+ * 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 <jh@suse.cz>
Vladimir Yanovsky <volodyan@gmail.com>
* emit-rt.c (emit_copy_of_insn_after): Fix bug causing exponential
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 939ac0f..2ef5297 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 d47d19c..9d4b84c 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)