diff options
author | Richard Guenther <rguenther@suse.de> | 2009-10-28 13:52:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-10-28 13:52:20 +0000 |
commit | 14cf68d935bbe7e74d01ef08da9540a08423dd12 (patch) | |
tree | 173b119f1eca7e90448f2b336299d2a06df7254e | |
parent | 69ba91edf437188d6fb6522153903144353c0f61 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/gimple.c | 50 | ||||
-rw-r--r-- | gcc/tree.c | 37 |
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; @@ -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 */ |