From: Jan Hubicka Date: Wed, 17 Jul 2019 17:19:21 +0000 (+0200) Subject: alias.c (record_component_aliases): Do not simplify pointed-to types of ODR types X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=17b99c984b69b0b4927af6f81380c855c60475b7;p=gcc.git alias.c (record_component_aliases): Do not simplify pointed-to types of ODR types * alias.c (record_component_aliases): Do not simplify pointed-to types of ODR types * testsuite/g++.dg/lto/alias-4_0.C From-SVN: r273552 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c69a63c18a..26c647f3f46 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-17 Jan Hubicka + + * alias.c (record_component_aliases): Do not simplify pointed-to + types of ODR types + 2019-07-17 Uroš Bizjak * config/i386/i386.md (*andqi_2_maybe_si): Handle potential diff --git a/gcc/alias.c b/gcc/alias.c index eece84ae244..2755df72907 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -1202,47 +1202,52 @@ record_component_aliases (tree type) case RECORD_TYPE: case UNION_TYPE: case QUAL_UNION_TYPE: - for (field = TYPE_FIELDS (type); field != 0; field = DECL_CHAIN (field)) - if (TREE_CODE (field) == FIELD_DECL && !DECL_NONADDRESSABLE_P (field)) - { - /* LTO type merging does not make any difference between - component pointer types. We may have - - struct foo {int *a;}; - - as TYPE_CANONICAL of - - struct bar {float *a;}; - - Because accesses to int * and float * do not alias, we would get - false negative when accessing the same memory location by - float ** and bar *. We thus record the canonical type as: - - struct {void *a;}; - - void * is special cased and works as a universal pointer type. - Accesses to it conflicts with accesses to any other pointer - type. */ - tree t = TREE_TYPE (field); - if (in_lto_p) - { - /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their - element type and that type has to be normalized to void *, - too, in the case it is a pointer. */ - while (!canonical_type_used_p (t) && !POINTER_TYPE_P (t)) - { - gcc_checking_assert (TYPE_STRUCTURAL_EQUALITY_P (t)); - t = TREE_TYPE (t); - } - if (POINTER_TYPE_P (t)) - t = ptr_type_node; - else if (flag_checking) - gcc_checking_assert (get_alias_set (t) - == get_alias_set (TREE_TYPE (field))); - } - - record_alias_subset (superset, get_alias_set (t)); - } + { + /* LTO non-ODR type merging does not make any difference between + component pointer types. We may have + + struct foo {int *a;}; + + as TYPE_CANONICAL of + + struct bar {float *a;}; + + Because accesses to int * and float * do not alias, we would get + false negative when accessing the same memory location by + float ** and bar *. We thus record the canonical type as: + + struct {void *a;}; + + void * is special cased and works as a universal pointer type. + Accesses to it conflicts with accesses to any other pointer + type. */ + bool void_pointers = in_lto_p + && (!odr_type_p (type) + || !odr_based_tbaa_p (type)); + for (field = TYPE_FIELDS (type); field != 0; field = DECL_CHAIN (field)) + if (TREE_CODE (field) == FIELD_DECL && !DECL_NONADDRESSABLE_P (field)) + { + tree t = TREE_TYPE (field); + if (void_pointers) + { + /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their + element type and that type has to be normalized to void *, + too, in the case it is a pointer. */ + while (!canonical_type_used_p (t) && !POINTER_TYPE_P (t)) + { + gcc_checking_assert (TYPE_STRUCTURAL_EQUALITY_P (t)); + t = TREE_TYPE (t); + } + if (POINTER_TYPE_P (t)) + t = ptr_type_node; + else if (flag_checking) + gcc_checking_assert (get_alias_set (t) + == get_alias_set (TREE_TYPE (field))); + } + + record_alias_subset (superset, get_alias_set (t)); + } + } break; case COMPLEX_TYPE: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d7a6bfc654..d3d710796b8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-07-17 Jan Hubicka + + * g++.dg/lto/alias-4_0.C + 2019-07-17 Richard Biener PR tree-optimization/91178 diff --git a/gcc/testsuite/g++.dg/lto/alias-4_0.C b/gcc/testsuite/g++.dg/lto/alias-4_0.C new file mode 100644 index 00000000000..410c3140baf --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/alias-4_0.C @@ -0,0 +1,31 @@ +/* { dg-lto-do run } */ +/* { dg-lto-options { { -O3 -flto -fno-early-inlining } } } */ +__attribute__ ((used)) +short *ptr_init, **ptr=&ptr_init; + +__attribute__ ((used)) +struct a { + int *aptr; +} a, *aptr=&a; + +void +write_ptr () +{ + *aptr = a; +} + +__attribute__ ((used)) +void +test () +{ + *ptr = (short int *)0; + write_ptr (); + if (!__builtin_constant_p (*ptr == (void *)0)) + __builtin_abort (); +} +int +main() +{ + test (); + return 0; +}