diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-09-26 15:15:28 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-09-26 15:15:28 +0000 |
commit | d400f5e165bbb0ce11bc4067f7d653a7bc08522e (patch) | |
tree | ed3cda18db90db3a4a3281d0e1ae3992e9f3f3a3 | |
parent | f2a895863cc419a273c362325a59baa2198afb46 (diff) | |
download | gcc-d400f5e165bbb0ce11bc4067f7d653a7bc08522e.tar.gz |
2013-09-26 Richard Biener <rguenther@suse.de>
* alias.h (component_uses_parent_alias_set): Rename to ...
(component_uses_parent_alias_set_from): ... this.
* alias.c (component_uses_parent_alias_set): Rename to ...
(component_uses_parent_alias_set_from): ... this and return
the desired parent.
(reference_alias_ptr_type_1): Use the result from
component_uses_parent_alias_set_from instead of stripping
components one at a time.
* emit-rtl.c (set_mem_attributes_minus_bitpos): Adjust.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202948 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/alias.c | 64 | ||||
-rw-r--r-- | gcc/alias.h | 2 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 2 |
4 files changed, 48 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f69ae29ae1b..d16da937178 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2013-09-26 Richard Biener <rguenther@suse.de> + + * alias.h (component_uses_parent_alias_set): Rename to ... + (component_uses_parent_alias_set_from): ... this. + * alias.c (component_uses_parent_alias_set): Rename to ... + (component_uses_parent_alias_set_from): ... this and return + the desired parent. + (reference_alias_ptr_type_1): Use the result from + component_uses_parent_alias_set_from instead of stripping + components one at a time. + * emit-rtl.c (set_mem_attributes_minus_bitpos): Adjust. + 2013-09-26 Andrew MacLeod <amacleod@redhat.com> * tree-ssa-live.h (find_replaceable_exprs, dump_replaceable_exprs): Move diff --git a/gcc/alias.c b/gcc/alias.c index 7d28267657b..a48bb51ed96 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -500,51 +500,58 @@ objects_must_conflict_p (tree t1, tree t2) return alias_sets_must_conflict_p (set1, set2); } -/* Return true if all nested component references handled by - get_inner_reference in T are such that we should use the alias set - provided by the object at the heart of T. +/* Return the outermost parent of component present in the chain of + component references handled by get_inner_reference in T with the + following property: + - the component is non-addressable, or + - the parent has alias set zero, + or NULL_TREE if no such parent exists. In the former cases, the alias + set of this parent is the alias set that must be used for T itself. */ - This is true for non-addressable components (which don't have their - own alias set), as well as components of objects in alias set zero. - This later point is a special case wherein we wish to override the - alias set used by the component, but we don't have per-FIELD_DECL - assignable alias sets. */ - -bool -component_uses_parent_alias_set (const_tree t) +tree +component_uses_parent_alias_set_from (const_tree t) { - while (1) - { - /* If we're at the end, it vacuously uses its own alias set. */ - if (!handled_component_p (t)) - return false; + const_tree found = NULL_TREE; + while (handled_component_p (t)) + { switch (TREE_CODE (t)) { case COMPONENT_REF: if (DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1))) - return true; + found = t; break; case ARRAY_REF: case ARRAY_RANGE_REF: if (TYPE_NONALIASED_COMPONENT (TREE_TYPE (TREE_OPERAND (t, 0)))) - return true; + found = t; break; case REALPART_EXPR: case IMAGPART_EXPR: break; - default: + case BIT_FIELD_REF: + case VIEW_CONVERT_EXPR: /* Bitfields and casts are never addressable. */ - return true; + found = t; + break; + + default: + gcc_unreachable (); } + if (get_alias_set (TREE_TYPE (TREE_OPERAND (t, 0))) == 0) + found = t; + t = TREE_OPERAND (t, 0); - if (get_alias_set (TREE_TYPE (t)) == 0) - return true; } + + if (found) + return TREE_OPERAND (found, 0); + + return NULL_TREE; } @@ -645,14 +652,11 @@ reference_alias_ptr_type_1 (tree *t) (TREE_TYPE (TREE_TYPE (TREE_OPERAND (inner, 1)))))) return TREE_TYPE (TREE_OPERAND (inner, 1)); - /* Otherwise, pick up the outermost object that we could have a pointer - to, processing conversions as above. */ - /* ??? Ick, this is worse than quadratic! */ - while (component_uses_parent_alias_set (*t)) - { - *t = TREE_OPERAND (*t, 0); - STRIP_NOPS (*t); - } + /* Otherwise, pick up the outermost object that we could have + a pointer to. */ + tree tem = component_uses_parent_alias_set_from (*t); + if (tem) + *t = tem; return NULL_TREE; } diff --git a/gcc/alias.h b/gcc/alias.h index dd4b641ee8c..ff190eb094e 100644 --- a/gcc/alias.h +++ b/gcc/alias.h @@ -33,7 +33,7 @@ extern alias_set_type get_alias_set (tree); extern alias_set_type get_deref_alias_set (tree); extern alias_set_type get_varargs_alias_set (void); extern alias_set_type get_frame_alias_set (void); -extern bool component_uses_parent_alias_set (const_tree); +extern tree component_uses_parent_alias_set_from (const_tree); extern bool alias_set_subset_of (alias_set_type, alias_set_type); extern void record_alias_subset (alias_set_type, alias_set_type); extern void record_component_aliases (tree); diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index a7ac1276b54..888076cf4d7 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1704,7 +1704,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, /* If this expression uses it's parent's alias set, mark it such that we won't change it. */ - if (component_uses_parent_alias_set (t)) + if (component_uses_parent_alias_set_from (t) != NULL_TREE) MEM_KEEP_ALIAS_SET_P (ref) = 1; /* If this is a decl, set the attributes of the MEM from it. */ |