aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-10-28 13:52:20 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-10-28 13:52:20 +0000
commit14cf68d935bbe7e74d01ef08da9540a08423dd12 (patch)
tree173b119f1eca7e90448f2b336299d2a06df7254e /gcc
parent69ba91edf437188d6fb6522153903144353c0f61 (diff)
downloadgcc-14cf68d935bbe7e74d01ef08da9540a08423dd12.zip
gcc-14cf68d935bbe7e74d01ef08da9540a08423dd12.tar.gz
gcc-14cf68d935bbe7e74d01ef08da9540a08423dd12.tar.bz2
tree.c (free_lang_data_in_type): Do not call get_alias_set.
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. From-SVN: r153659
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/gimple.c50
-rw-r--r--gcc/tree.c37
3 files changed, 60 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9a7155f..65ca8c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
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.
+
+2009-10-28 Richard Guenther <rguenther@suse.de>
+
PR middle-end/41855
* tree-ssa-alias.c (refs_may_alias_p_1): Deal with CONST_DECLs
(ref_maybe_used_by_call_p_1): Fix bcopy handling.
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 0b76677..24ac0b8 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;
diff --git a/gcc/tree.c b/gcc/tree.c
index 4343415..6079725 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -4171,11 +4171,6 @@ free_lang_data_in_type (tree type)
{
gcc_assert (TYPE_P (type));
- /* Fill in the alias-set. We need to at least track zeroness here
- for correctness. */
- if (lang_hooks.get_alias_set (type) == 0)
- TYPE_ALIAS_SET (type) = 0;
-
/* Give the FE a chance to remove its own data first. */
lang_hooks.free_lang_data (type);
@@ -4924,6 +4919,20 @@ free_lang_data_in_cgraph (void)
static unsigned
free_lang_data (void)
{
+ unsigned i;
+
+ /* Allocate and assign alias sets to the standard integer types
+ while the slots are still in the way the frontends generated them. */
+ for (i = 0; i < itk_none; ++i)
+ if (integer_types[i])
+ TYPE_ALIAS_SET (integer_types[i]) = get_alias_set (integer_types[i]);
+
+ /* FIXME. Remove after save_debug_info is working. */
+ if (!(flag_generate_lto
+ || (!in_lto_p
+ && !flag_gtoggle && debug_info_level <= DINFO_LEVEL_TERSE)))
+ return 0;
+
/* Traverse the IL resetting language specific information for
operands, expressions, etc. */
free_lang_data_in_cgraph ();
@@ -4951,9 +4960,9 @@ free_lang_data (void)
else
signed_char_type_node = char_type_node;
- /* Reset some langhooks. */
+ /* Reset some langhooks. Do not reset types_compatible_p, it may
+ still be used indirectly via the get_alias_set langhook. */
lang_hooks.callgraph.analyze_expr = NULL;
- lang_hooks.types_compatible_p = NULL;
lang_hooks.dwarf_name = lhd_dwarf_name;
lang_hooks.decl_printable_name = gimple_decl_printable_name;
lang_hooks.set_decl_assembler_name = lhd_set_decl_assembler_name;
@@ -4975,24 +4984,12 @@ free_lang_data (void)
}
-/* Gate function for free_lang_data. */
-
-static bool
-gate_free_lang_data (void)
-{
- /* FIXME. Remove after save_debug_info is working. */
- return (flag_generate_lto
- || (!in_lto_p
- && !flag_gtoggle && debug_info_level <= DINFO_LEVEL_TERSE));
-}
-
-
struct simple_ipa_opt_pass pass_ipa_free_lang_data =
{
{
SIMPLE_IPA_PASS,
NULL, /* name */
- gate_free_lang_data, /* gate */
+ NULL, /* gate */
free_lang_data, /* execute */
NULL, /* sub */
NULL, /* next */