alias.c (get_alias_set): Honor TYPE_STRUCTURAL_EQUALITY_P.
2009-08-12 Richard Guenther <rguenther@suse.de> * alias.c (get_alias_set): Honor TYPE_STRUCTURAL_EQUALITY_P. * gimplify.c (gimplify_modify_expr): Do not use lang_hooks.types_compatible_p. * tree-ssa.c (useless_type_conversion_p): For aggregates just return false if the canonical types differ. From-SVN: r150695
This commit is contained in:
parent
30de16328a
commit
daad02781a
@ -1,3 +1,11 @@
|
||||
2009-08-12 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
* alias.c (get_alias_set): Honor TYPE_STRUCTURAL_EQUALITY_P.
|
||||
* gimplify.c (gimplify_modify_expr): Do not use
|
||||
lang_hooks.types_compatible_p.
|
||||
* tree-ssa.c (useless_type_conversion_p): For aggregates
|
||||
just return false if the canonical types differ.
|
||||
|
||||
2009-08-12 Sebastian Pop <sebastian.pop@amd.com>
|
||||
|
||||
PR middle-end/40980
|
||||
|
17
gcc/alias.c
17
gcc/alias.c
@ -680,11 +680,20 @@ get_alias_set (tree t)
|
||||
}
|
||||
|
||||
/* Variant qualifiers don't affect the alias set, so get the main
|
||||
variant. Always use the canonical type as well.
|
||||
If this is a type with a known alias set, return it. */
|
||||
variant. */
|
||||
t = TYPE_MAIN_VARIANT (t);
|
||||
if (TYPE_CANONICAL (t))
|
||||
t = TYPE_CANONICAL (t);
|
||||
|
||||
/* Always use the canonical type as well. If this is a type that
|
||||
requires structural comparisons to identify compatible types
|
||||
use alias set zero. */
|
||||
if (TYPE_STRUCTURAL_EQUALITY_P (t))
|
||||
return 0;
|
||||
t = TYPE_CANONICAL (t);
|
||||
/* Canonical types shouldn't form a tree nor should the canonical
|
||||
type require structural equality checks. */
|
||||
gcc_assert (!TYPE_STRUCTURAL_EQUALITY_P (t) && TYPE_CANONICAL (t) == t);
|
||||
|
||||
/* If this is a type with a known alias set, return it. */
|
||||
if (TYPE_ALIAS_SET_KNOWN_P (t))
|
||||
return TYPE_ALIAS_SET (t);
|
||||
|
||||
|
@ -4322,8 +4322,7 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
||||
/* Insert pointer conversions required by the middle-end that are not
|
||||
required by the frontend. This fixes middle-end type checking for
|
||||
for example gcc.dg/redecl-6.c. */
|
||||
if (POINTER_TYPE_P (TREE_TYPE (*to_p))
|
||||
&& lang_hooks.types_compatible_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
|
||||
if (POINTER_TYPE_P (TREE_TYPE (*to_p)))
|
||||
{
|
||||
STRIP_USELESS_TYPE_CONVERSION (*from_p);
|
||||
if (!useless_type_conversion_p (TREE_TYPE (*to_p), TREE_TYPE (*from_p)))
|
||||
|
@ -1102,17 +1102,12 @@ useless_type_conversion_p (tree outer_type, tree inner_type)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* For aggregates we may need to fall back to structural equality
|
||||
checks. */
|
||||
/* For aggregates we rely on TYPE_CANONICAL exclusively and require
|
||||
explicit conversions for types involving to be structurally
|
||||
compared types. */
|
||||
else if (AGGREGATE_TYPE_P (inner_type)
|
||||
&& TREE_CODE (inner_type) == TREE_CODE (outer_type))
|
||||
{
|
||||
if (TYPE_STRUCTURAL_EQUALITY_P (outer_type)
|
||||
|| TYPE_STRUCTURAL_EQUALITY_P (inner_type))
|
||||
return lang_hooks.types_compatible_p (inner_type, outer_type);
|
||||
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user