diff options
author | matz <matz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-15 14:56:26 +0000 |
---|---|---|
committer | matz <matz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-06-15 14:56:26 +0000 |
commit | fc3c948c71ff8dc24f823040fc4d25021ff12e81 (patch) | |
tree | c2dc3b99a269da39a68e404629f95304e79da708 /gcc/cfgexpand.c | |
parent | 930802aa5979d14a3e03f188998805d422643749 (diff) | |
download | gcc-fc3c948c71ff8dc24f823040fc4d25021ff12e81.tar.gz |
PR middle-end/38474
* cfgexpand.c (add_alias_set_conflicts): Remove.
(expand_used_vars): Don't call it.
(aggregate_contains_union_type): Remove.
* function.c (n_temp_slots_in_use): New static data.
(make_slot_available, assign_stack_temp_for_type): Update it.
(init_temp_slots): Zero it.
(remove_unused_temp_slot_addresses): Use it for quicker removal.
(remove_unused_temp_slot_addresses_1): Use htab_clear_slot.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188667 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 68 |
1 files changed, 0 insertions, 68 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 8a31a9f5835..a8397c69b03 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -329,70 +329,6 @@ stack_var_conflict_p (size_t x, size_t y) return bitmap_bit_p (a->conflicts, y); } -/* Returns true if TYPE is or contains a union type. */ - -static bool -aggregate_contains_union_type (tree type) -{ - tree field; - - if (TREE_CODE (type) == UNION_TYPE - || TREE_CODE (type) == QUAL_UNION_TYPE) - return true; - if (TREE_CODE (type) == ARRAY_TYPE) - return aggregate_contains_union_type (TREE_TYPE (type)); - if (TREE_CODE (type) != RECORD_TYPE) - return false; - - for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) - if (TREE_CODE (field) == FIELD_DECL) - if (aggregate_contains_union_type (TREE_TYPE (field))) - return true; - - return false; -} - -/* A subroutine of expand_used_vars. If two variables X and Y have alias - sets that do not conflict, then do add a conflict for these variables - in the interference graph. We also need to make sure to add conflicts - for union containing structures. Else RTL alias analysis comes along - and due to type based aliasing rules decides that for two overlapping - union temporaries { short s; int i; } accesses to the same mem through - different types may not alias and happily reorders stores across - life-time boundaries of the temporaries (See PR25654). */ - -static void -add_alias_set_conflicts (void) -{ - size_t i, j, n = stack_vars_num; - - for (i = 0; i < n; ++i) - { - tree type_i = TREE_TYPE (stack_vars[i].decl); - bool aggr_i = AGGREGATE_TYPE_P (type_i); - bool contains_union; - - contains_union = aggregate_contains_union_type (type_i); - for (j = 0; j < i; ++j) - { - tree type_j = TREE_TYPE (stack_vars[j].decl); - bool aggr_j = AGGREGATE_TYPE_P (type_j); - if (aggr_i != aggr_j - /* Either the objects conflict by means of type based - aliasing rules, or we need to add a conflict. */ - || !objects_must_conflict_p (type_i, type_j) - /* In case the types do not conflict ensure that access - to elements will conflict. In case of unions we have - to be careful as type based aliasing rules may say - access to the same memory does not conflict. So play - safe and add a conflict in this case when - -fstrict-aliasing is used. */ - || (contains_union && flag_strict_aliasing)) - add_stack_var_conflict (i, j); - } - } -} - /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var enter its partition number into bitmap DATA. */ @@ -1625,10 +1561,6 @@ expand_used_vars (void) if (stack_vars_num > 0) { add_scope_conflicts (); - /* Due to the way alias sets work, no variables with non-conflicting - alias sets may be assigned the same address. Add conflicts to - reflect this. */ - add_alias_set_conflicts (); /* If stack protection is enabled, we don't share space between vulnerable data and non-vulnerable data. */ |