tree.c: (obj_type_ref_class): Move to...
authorJan Hubicka <jh@suse.cz>
Sat, 22 Dec 2018 20:06:52 +0000 (21:06 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 22 Dec 2018 20:06:52 +0000 (20:06 +0000)
* tree.c: (obj_type_ref_class): Move to...
* ipa-devirt.c (obj_type_ref_class): Move to here; lookup main
odr type.
(get_odr_type): Compensate for type simplification.

* g++.dg/ipa/devirt-30.C: Add dg-do.
* g++.dg/lto/devirt-1_0.C: New testcase.
* g++.dg/lto/devirt-2_0.C: New testcase.
* g++.dg/lto/devirt-3_0.C: New testcase.
* g++.dg/lto/devirt-4_0.C: New testcase.
* g++.dg/lto/devirt-5_0.C: New testcase.
* g++.dg/lto/devirt-6_0.C: New testcase.
* g++.dg/lto/devirt-13_0.C: New testcase.
* g++.dg/lto/devirt-14_0.C: New testcase.
* g++.dg/lto/devirt-19_0.C: New testcase.
* g++.dg/lto/devirt-22_0.C: New testcase.
* g++.dg/lto/devirt-23_0.C: New testcase.
* g++.dg/lto/devirt-30_0.C: New testcase.
* g++.dg/lto/devirt-34_0.C: New testcase.

From-SVN: r267359

17 files changed:
gcc/ipa-devirt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/devirt-30.C
gcc/testsuite/g++.dg/lto/devirt-13_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-14_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-19_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-1_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-22_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-23_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-2_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-30_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-34_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-3_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-4_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-5_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/devirt-6_0.C [new file with mode: 0644]
gcc/tree.c

index 9c6e2718353e4d475e33c06f6359a09350d36079..ac907aa5fd2b2649ec82c0ae72d87f340123779e 100644 (file)
@@ -1985,6 +1985,30 @@ add_type_duplicate (odr_type val, tree type)
   return build_bases;
 }
 
+/* REF is OBJ_TYPE_REF, return the class the ref corresponds to.  */
+
+tree
+obj_type_ref_class (const_tree ref)
+{
+  gcc_checking_assert (TREE_CODE (ref) == OBJ_TYPE_REF);
+  ref = TREE_TYPE (ref);
+  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
+  ref = TREE_TYPE (ref);
+  /* We look for type THIS points to.  ObjC also builds
+     OBJ_TYPE_REF with non-method calls, Their first parameter
+     ID however also corresponds to class type. */
+  gcc_checking_assert (TREE_CODE (ref) == METHOD_TYPE
+                      || TREE_CODE (ref) == FUNCTION_TYPE);
+  ref = TREE_VALUE (TYPE_ARG_TYPES (ref));
+  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
+  tree ret = TREE_TYPE (ref);
+  if (!in_lto_p)
+    ret = TYPE_CANONICAL (ret);
+  else
+    ret = get_odr_type (ret)->type;
+  return ret;
+}
+
 /* Get ODR type hash entry for TYPE.  If INSERT is true, create
    possibly new entry.  */
 
@@ -2000,6 +2024,8 @@ get_odr_type (tree type, bool insert)
   int base_id = -1;
 
   type = TYPE_MAIN_VARIANT (type);
+  if (!in_lto_p)
+    type = TYPE_CANONICAL (type);
 
   gcc_checking_assert (can_be_name_hashed_p (type)
                       || can_be_vtable_hashed_p (type));
index 85495144d83198a62c6d9ebb8e5d169e30bd190a..473d0c8bc964804dab8f67f461fa040991c9c2f1 100644 (file)
@@ -1,3 +1,20 @@
+2018-12-21  Jan Hubicka  <jh@suse.cz>
+
+       * g++.dg/ipa/devirt-30.C: Add dg-do.
+       * g++.dg/lto/devirt-1_0.C: New testcase.
+       * g++.dg/lto/devirt-2_0.C: New testcase.
+       * g++.dg/lto/devirt-3_0.C: New testcase.
+       * g++.dg/lto/devirt-4_0.C: New testcase.
+       * g++.dg/lto/devirt-5_0.C: New testcase.
+       * g++.dg/lto/devirt-6_0.C: New testcase.
+       * g++.dg/lto/devirt-13_0.C: New testcase.
+       * g++.dg/lto/devirt-14_0.C: New testcase.
+       * g++.dg/lto/devirt-19_0.C: New testcase.
+       * g++.dg/lto/devirt-22_0.C: New testcase.
+       * g++.dg/lto/devirt-23_0.C: New testcase.
+       * g++.dg/lto/devirt-30_0.C: New testcase.
+       * g++.dg/lto/devirt-34_0.C: New testcase.
+
 2018-12-26  Steven G . Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/85798
index 15e85975dcdfc9ccc30d43995ddc71455e67645a..630fb8aef6dccb807e3cdf47c97fd8e8aac8ef39 100644 (file)
@@ -1,4 +1,5 @@
 // PR c++/58678
+// { dg-do compile }
 // { dg-options "-O3 -fdump-ipa-devirt" }
 
 // We shouldn't speculatively devirtualize to ~B because B is an abstract
diff --git a/gcc/testsuite/g++.dg/lto/devirt-13_0.C b/gcc/testsuite/g++.dg/lto/devirt-13_0.C
new file mode 100644 (file)
index 0000000..f9015fd
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-lto-do run } */
+/* Call to foo should be devirtualized because there are no derived types of A.  */
+/* { dg-lto-options "-O2 -flto -fdump-tree-ssa"  } */
+#include "../ipa/devirt-13.C"
+/* { dg-final { scan-tree-dump-times "OBJ_TYPE_REF" 0 "ssa"} } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-14_0.C b/gcc/testsuite/g++.dg/lto/devirt-14_0.C
new file mode 100644 (file)
index 0000000..c7528f6
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options "-O2 -fdump-tree-ssa"  } */
+#include "../ipa/devirt-14.C"
+/* { dg-final { scan-tree-dump-not "A.*foo" "ssa"} } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-19_0.C b/gcc/testsuite/g++.dg/lto/devirt-19_0.C
new file mode 100644 (file)
index 0000000..696d8c0
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { "-O2 -fdump-ipa-cp -Wno-return-type -flto -r -nostdlib" } } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
+#include "../ipa/devirt-19.C"
+/* { dg-final { scan-wpa-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-1_0.C b/gcc/testsuite/g++.dg/lto/devirt-1_0.C
new file mode 100644 (file)
index 0000000..682c40f
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
+#include "../ipa/devirt-1.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-22_0.C b/gcc/testsuite/g++.dg/lto/devirt-22_0.C
new file mode 100644 (file)
index 0000000..9052865
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp -flto -r -nostdlib" } } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
+#include "../ipa/devirt-22.C"
+/* { dg-final { scan-wpa-ipa-dump-times "Discovered a virtual call to a known target" 2 "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-23_0.C b/gcc/testsuite/g++.dg/lto/devirt-23_0.C
new file mode 100644 (file)
index 0000000..760f95f
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-ipa-sra -flto -fno-devirtualize-speculatively" } } */
+#include "../ipa/devirt-23.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to" "cp" { xfail *-*-* } } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-2_0.C b/gcc/testsuite/g++.dg/lto/devirt-2_0.C
new file mode 100644 (file)
index 0000000..4e92bb6
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
+#include "../ipa/devirt-2.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-30_0.C b/gcc/testsuite/g++.dg/lto/devirt-30_0.C
new file mode 100644 (file)
index 0000000..3e2118b
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { "-O3 -fdump-ipa-devirt -flto -r -nostdlib" } } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
+#include "../ipa/devirt-30.C"
+// { dg-final { scan-wpa-ipa-dump-not "Speculatively devirtualizing" "devirt" } }
diff --git a/gcc/testsuite/g++.dg/lto/devirt-34_0.C b/gcc/testsuite/g++.dg/lto/devirt-34_0.C
new file mode 100644 (file)
index 0000000..7ac3a8c
--- /dev/null
@@ -0,0 +1,6 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { "-O2 -fdump-ipa-devirt -flto -r -nostdlib" } } */
+/* { dg-extra-ld-options "-flinker-output=nolto-rel" } */
+#include "../ipa/devirt-34.C"
+/* { dg-final { scan-wpa-ipa-dump "Speculative targets"  "devirt"  } } */
+/* { dg-final { scan-wpa-ipa-dump "1 speculatively devirtualized"  "devirt"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-3_0.C b/gcc/testsuite/g++.dg/lto/devirt-3_0.C
new file mode 100644 (file)
index 0000000..1ec9d76
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
+#include "../ipa/devirt-3.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-4_0.C b/gcc/testsuite/g++.dg/lto/devirt-4_0.C
new file mode 100644 (file)
index 0000000..e44dbfd
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
+#include "../ipa/devirt-4.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-5_0.C b/gcc/testsuite/g++.dg/lto/devirt-5_0.C
new file mode 100644 (file)
index 0000000..daf96e8
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -fno-early-inlining -fno-inline -fdump-ipa-cp -fdump-tree-optimized -flto" } } */
+#include "../ipa/devirt-5.C"
+/* { dg-final { scan-wpa-ipa-dump "Discovered a virtual call to a known target.*foo"  "cp"  } } */
diff --git a/gcc/testsuite/g++.dg/lto/devirt-6_0.C b/gcc/testsuite/g++.dg/lto/devirt-6_0.C
new file mode 100644 (file)
index 0000000..6765a74
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-lto-do run } */
+/* { dg-lto-options { "-O3 -flto" } } */
+#include "../ipa/devirt-6.C"
index 5d0d4d3276811e665131647a0820c6a10260573c..c3d4bb8a00a286c2aada4e44ef656ceb552c6d63 100644 (file)
@@ -12838,25 +12838,6 @@ virtual_method_call_p (const_tree target)
   return true;
 }
 
-/* REF is OBJ_TYPE_REF, return the class the ref corresponds to.  */
-
-tree
-obj_type_ref_class (const_tree ref)
-{
-  gcc_checking_assert (TREE_CODE (ref) == OBJ_TYPE_REF);
-  ref = TREE_TYPE (ref);
-  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
-  ref = TREE_TYPE (ref);
-  /* We look for type THIS points to.  ObjC also builds
-     OBJ_TYPE_REF with non-method calls, Their first parameter
-     ID however also corresponds to class type. */
-  gcc_checking_assert (TREE_CODE (ref) == METHOD_TYPE
-                      || TREE_CODE (ref) == FUNCTION_TYPE);
-  ref = TREE_VALUE (TYPE_ARG_TYPES (ref));
-  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
-  return TREE_TYPE (ref);
-}
-
 /* Lookup sub-BINFO of BINFO of TYPE at offset POS.  */
 
 static tree