Commit 14cf68d9 by Richard Guenther Committed by Richard Biener

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
parent 69ba91ed
2009-10-28 Richard Guenther <rguenther@suse.de> 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 PR middle-end/41855
* tree-ssa-alias.c (refs_may_alias_p_1): Deal with CONST_DECLs * tree-ssa-alias.c (refs_may_alias_p_1): Deal with CONST_DECLs
(ref_maybe_used_by_call_p_1): Fix bcopy handling. (ref_maybe_used_by_call_p_1): Fix bcopy handling.
...@@ -4131,7 +4131,6 @@ gimple_signed_type (tree type) ...@@ -4131,7 +4131,6 @@ gimple_signed_type (tree type)
alias_set_type alias_set_type
gimple_get_alias_set (tree t) gimple_get_alias_set (tree t)
{ {
static bool recursing_p;
tree u; tree u;
/* Permit type-punning when accessing a union, provided the access /* Permit type-punning when accessing a union, provided the access
...@@ -4171,15 +4170,9 @@ gimple_get_alias_set (tree t) ...@@ -4171,15 +4170,9 @@ gimple_get_alias_set (tree t)
} }
else if (POINTER_TYPE_P (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 Unfortunately, there is no canonical form of a pointer type.
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.
In particular, if we have `typedef int I', then `int *', and In particular, if we have `typedef int I', then `int *', and
`I *' are different types. So, we have to pick a canonical `I *' are different types. So, we have to pick a canonical
representative. We do this below. representative. We do this below.
...@@ -4201,15 +4194,36 @@ gimple_get_alias_set (tree t) ...@@ -4201,15 +4194,36 @@ gimple_get_alias_set (tree t)
can dereference IPP and CIPP. So, we ignore cv-qualifiers on can dereference IPP and CIPP. So, we ignore cv-qualifiers on
the pointed-to types. This issue has been reported to the the pointed-to types. This issue has been reported to the
C++ committee. */ C++ committee. */
t1 = build_type_no_quals (t);
if (t1 != t) /* In addition to the above canonicalization issue with LTO
{ we should also canonicalize `T (*)[]' to `T *' avoiding
alias_set_type set; alias issues with pointer-to element types and pointer-to
recursing_p = true; array types.
set = get_alias_set (t1);
recursing_p = false; Likewise we need to deal with the situation of incomplete
return set; 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; return -1;
......
...@@ -4171,11 +4171,6 @@ free_lang_data_in_type (tree type) ...@@ -4171,11 +4171,6 @@ free_lang_data_in_type (tree type)
{ {
gcc_assert (TYPE_P (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. */ /* Give the FE a chance to remove its own data first. */
lang_hooks.free_lang_data (type); lang_hooks.free_lang_data (type);
...@@ -4924,6 +4919,20 @@ free_lang_data_in_cgraph (void) ...@@ -4924,6 +4919,20 @@ free_lang_data_in_cgraph (void)
static unsigned static unsigned
free_lang_data (void) 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 /* Traverse the IL resetting language specific information for
operands, expressions, etc. */ operands, expressions, etc. */
free_lang_data_in_cgraph (); free_lang_data_in_cgraph ();
...@@ -4951,9 +4960,9 @@ free_lang_data (void) ...@@ -4951,9 +4960,9 @@ free_lang_data (void)
else else
signed_char_type_node = char_type_node; 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.callgraph.analyze_expr = NULL;
lang_hooks.types_compatible_p = NULL;
lang_hooks.dwarf_name = lhd_dwarf_name; lang_hooks.dwarf_name = lhd_dwarf_name;
lang_hooks.decl_printable_name = gimple_decl_printable_name; lang_hooks.decl_printable_name = gimple_decl_printable_name;
lang_hooks.set_decl_assembler_name = lhd_set_decl_assembler_name; lang_hooks.set_decl_assembler_name = lhd_set_decl_assembler_name;
...@@ -4975,24 +4984,12 @@ free_lang_data (void) ...@@ -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 = struct simple_ipa_opt_pass pass_ipa_free_lang_data =
{ {
{ {
SIMPLE_IPA_PASS, SIMPLE_IPA_PASS,
NULL, /* name */ NULL, /* name */
gate_free_lang_data, /* gate */ NULL, /* gate */
free_lang_data, /* execute */ free_lang_data, /* execute */
NULL, /* sub */ NULL, /* sub */
NULL, /* next */ NULL, /* next */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment