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>
* 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.
......@@ -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 */
......
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