alias.c: Include ipa-utils.h.
authorJan Hubicka <jh@suse.cz>
Sat, 1 Jun 2019 16:36:49 +0000 (18:36 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 1 Jun 2019 16:36:49 +0000 (16:36 +0000)
* alias.c: Include ipa-utils.h.
(get_alias_set): Try to complete ODR type via ODR type hash lookup.
* ipa-devirt.c (prevailing_odr_type): New.
* ipa-utils.h (previaling_odr_type): Declare.

* g++.dg/lto/alias-1_0.C: New testcase.
* g++.dg/lto/alias-1_1.C: New testcase.

From-SVN: r271837

gcc/ChangeLog
gcc/alias.c
gcc/ipa-devirt.c
gcc/ipa-utils.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/alias-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/alias-1_1.C [new file with mode: 0644]

index a1e8127e9e9130b949184ce5518938fb550eafb2..491577b8828086a1780750b741ac849328417f8b 100644 (file)
@@ -1,3 +1,10 @@
+2019-05-31  Jan Hubicka  <jh@suse.cz>
+
+       * alias.c: Include ipa-utils.h.
+       (get_alias_set): Try to complete ODR type via ODR type hash lookup.
+       * ipa-devirt.c (prevailing_odr_type): New.
+       * ipa-utils.h (previaling_odr_type): Declare.
+
 2019-05-31  H.J. Lu  <hongjiu.lu@intel.com>
            Hongtao Liu  <hongtao.liu@intel.com>
 
index d3cc07c721663ad2edd9bd5cc0a633b337e8a827..eece84ae2442dfd5a2267de591a7bd316f2d33cd 100644 (file)
@@ -39,6 +39,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "cfganal.h"
 #include "rtl-iter.h"
 #include "cgraph.h"
+#include "ipa-utils.h"
 
 /* The aliasing API provided here solves related but different problems:
 
@@ -1008,6 +1009,14 @@ get_alias_set (tree t)
        }
       p = TYPE_MAIN_VARIANT (p);
 
+      /* In LTO for C++ programs we can turn in complete types to complete
+        using ODR name lookup.  */
+      if (in_lto_p && TYPE_STRUCTURAL_EQUALITY_P (p) && odr_type_p (p))
+       {
+         p = prevailing_odr_type (p);
+         gcc_checking_assert (TYPE_MAIN_VARIANT (p) == p);
+       }
+
       /* Make void * compatible with char * and also void **.
         Programs are commonly violating TBAA by this.
 
index a51b15174225cb18fb4351510530660c43783f3a..e9cb1800b3f31d71a1188e383f43322fc06c5d40 100644 (file)
@@ -2170,6 +2170,20 @@ get_odr_type (tree type, bool insert)
   return val;
 }
 
+/* Return type that in ODR type hash prevailed TYPE.  Be careful and punt
+   on ODR violations.  */
+
+tree
+prevailing_odr_type (tree type)
+{
+  odr_type t = get_odr_type (type, false);
+  if (!t || t->odr_violated)
+    return type;
+  return t->type;
+}
+
+/* Return true if we reported some ODR violation on TYPE.  */
+
 bool
 odr_type_violation_reported_p (tree type)
 {
index b70e8c571086daae188a78086f4764e69199eade..77cf3d3d91dd795d8d74aa7e156b070330f55cca 100644 (file)
@@ -92,6 +92,7 @@ void warn_types_mismatch (tree t1, tree t2, location_t loc1 = UNKNOWN_LOCATION,
 bool odr_or_derived_type_p (const_tree t);
 bool odr_types_equivalent_p (tree type1, tree type2);
 bool odr_type_violation_reported_p (tree type);
+tree prevailing_odr_type (tree type);
 
 /* Return vector containing possible targets of polymorphic call E.
    If COMPLETEP is non-NULL, store true if the list is complete. 
index 04fb8bc55606490df42c2bd2eb6b603726f2ecf8..0663f4c07c62267e70267f75ce9147dc68998c92 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-31  Jan Hubicka  <jh@suse.cz>
+
+       * g++.dg/lto/alias-1_0.C: New testcase.
+       * g++.dg/lto/alias-1_1.C: New testcase.
+
 2019-05-31  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/89355
diff --git a/gcc/testsuite/g++.dg/lto/alias-1_0.C b/gcc/testsuite/g++.dg/lto/alias-1_0.C
new file mode 100644 (file)
index 0000000..32f3ff0
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { { -O2 -flto } } } */
+
+/* With LTO we consider all pointers to incomplete types to be possibly
+   aliasing.  This makes *bptr to alias with aptr.
+   However with C++ ODR rule we can turn incomplete pointers to complete
+   dragging in info from alias-1_1.C.  */
+
+#include <string.h>
+
+typedef int (*fnptr) ();
+
+__attribute__ ((used))
+struct a *aptr;
+
+__attribute__ ((used))
+struct b **bptr = (struct b**)&aptr;
+extern void init ();
+extern void inline_me_late (int);
+
+
+int
+main (int argc, char **argv)
+{
+  init ();
+  aptr = 0;
+  inline_me_late (argc);
+  if (!__builtin_constant_p (aptr == 0))
+    __builtin_abort ();
+  return (size_t)aptr;
+}
diff --git a/gcc/testsuite/g++.dg/lto/alias-1_1.C b/gcc/testsuite/g++.dg/lto/alias-1_1.C
new file mode 100644 (file)
index 0000000..49e8217
--- /dev/null
@@ -0,0 +1,16 @@
+#include <string.h>
+struct a {int a;} a;
+struct b {short b;} b;
+extern struct b **bptr;
+void
+inline_me_late (int argc)
+{
+  if (argc == -1)
+    *bptr = (struct b *)(size_t)1;
+}
+void
+init()
+{
+  a.a=1;
+  b.b=2;
+}