summaryrefslogtreecommitdiff
path: root/gcc/gimple.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-10-28 13:52:20 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2009-10-28 13:52:20 +0000
commit7b7fcfe18ace63ba73e5c326e5a07a34224c3cd6 (patch)
tree173b119f1eca7e90448f2b336299d2a06df7254e /gcc/gimple.c
parent9e434a362533ca39241b0331b31fb7b7270048b1 (diff)
downloadgcc-7b7fcfe18ace63ba73e5c326e5a07a34224c3cd6.tar.gz
2009-10-28 Richard Guenther <rguenther@suse.de>
* tree.c (free_lang_data_in_type): Do not call get_alias_set. (free_lang_data): Unconditionally compute alias sets for all standard integer types. Bail out if gate bailed out previously. Do not reset the types_compatible_p langhook. (gate_free_lang_data): Remove. (struct pass_ipa_free_lang_data): Enable unconditionally. * gimple.c (gimple_get_alias_set): Use the same alias-set for all pointer types. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153659 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimple.c')
-rw-r--r--gcc/gimple.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 0b7667782aa..24ac0b80ac6 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -4131,7 +4131,6 @@ gimple_signed_type (tree type)
alias_set_type
gimple_get_alias_set (tree t)
{
- static bool recursing_p;
tree u;
/* Permit type-punning when accessing a union, provided the access
@@ -4171,15 +4170,9 @@ gimple_get_alias_set (tree t)
}
else if (POINTER_TYPE_P (t))
{
- tree t1;
+ /* From the common C and C++ langhook implementation:
- /* ??? We can end up creating cycles with TYPE_MAIN_VARIANT
- and TYPE_CANONICAL. Avoid recursing endlessly between
- this langhook and get_alias_set. */
- if (recursing_p)
- return -1;
-
- /* Unfortunately, there is no canonical form of a pointer type.
+ Unfortunately, there is no canonical form of a pointer type.
In particular, if we have `typedef int I', then `int *', and
`I *' are different types. So, we have to pick a canonical
representative. We do this below.
@@ -4201,15 +4194,36 @@ gimple_get_alias_set (tree t)
can dereference IPP and CIPP. So, we ignore cv-qualifiers on
the pointed-to types. This issue has been reported to the
C++ committee. */
- t1 = build_type_no_quals (t);
- if (t1 != t)
- {
- alias_set_type set;
- recursing_p = true;
- set = get_alias_set (t1);
- recursing_p = false;
- return set;
- }
+
+ /* In addition to the above canonicalization issue with LTO
+ we should also canonicalize `T (*)[]' to `T *' avoiding
+ alias issues with pointer-to element types and pointer-to
+ array types.
+
+ Likewise we need to deal with the situation of incomplete
+ pointed-to types and make `*(struct X **)&a' and
+ `*(struct X {} **)&a' alias. Otherwise we will have to
+ guarantee that all pointer-to incomplete type variants
+ will be replaced by pointer-to complete type variants if
+ they are available.
+
+ With LTO the convenient situation of using `void *' to
+ access and store any pointer type will also become
+ more appearant (and `void *' is just another pointer-to
+ incomplete type). Assigning alias-set zero to `void *'
+ and all pointer-to incomplete types is a not appealing
+ solution. Assigning an effective alias-set zero only
+ affecting pointers might be - by recording proper subset
+ relationships of all pointer alias-sets.
+
+ Pointer-to function types are another grey area which
+ needs caution. Globbing them all into one alias-set
+ or the above effective zero set would work. */
+
+ /* For now just assign the same alias-set to all pointers.
+ That's simple and avoids all the above problems. */
+ if (t != ptr_type_node)
+ return get_alias_set (ptr_type_node);
}
return -1;