summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-26 15:15:28 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-26 15:15:28 +0000
commitd400f5e165bbb0ce11bc4067f7d653a7bc08522e (patch)
treeed3cda18db90db3a4a3281d0e1ae3992e9f3f3a3
parentf2a895863cc419a273c362325a59baa2198afb46 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/alias.c64
-rw-r--r--gcc/alias.h2
-rw-r--r--gcc/emit-rtl.c2
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. */