re PR ipa/60600 (ICE in ipa_get_indirect_edge_target_1)
authorMartin Jambor <mjambor@suse.cz>
Tue, 25 Mar 2014 18:22:41 +0000 (19:22 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Tue, 25 Mar 2014 18:22:41 +0000 (19:22 +0100)
2014-03-25  Martin Jambor  <mjambor@suse.cz>

PR ipa/60600
* ipa-cp.c (ipa_get_indirect_edge_target_1): Redirect type
inconsistent devirtualizations to __builtin_unreachable.

testsuite/
* g++.dg/ipa/pr60600.C: New test.

From-SVN: r208818

gcc/ChangeLog
gcc/ipa-cp.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr60600.C [new file with mode: 0644]

index 9bb7e2f607e7283327f32d6e91620f7b7c8a9211..d3dfb305aa6631feffeaad822c47e1026849aba9 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/60600
+       * ipa-cp.c (ipa_get_indirect_edge_target_1): Redirect type
+       inconsistent devirtualizations to __builtin_unreachable.
+
 2014-03-25  Marek Polacek  <polacek@redhat.com>
 
        PR c/35449
index b71048acc71a983c3ecc5ade17e4ea56f4bec8d9..74042adb5a1deab24341a9b29593897f4a4ac689 100644 (file)
@@ -1639,11 +1639,18 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie,
        return NULL_TREE;
       target = gimple_get_virt_method_for_binfo (token, binfo);
     }
-#ifdef ENABLE_CHECKING
-  if (target)
-    gcc_assert (possible_polymorphic_call_target_p
-                (ie, cgraph_get_node (target)));
-#endif
+
+  if (target && !possible_polymorphic_call_target_p (ie,
+                                                    cgraph_get_node (target)))
+    {
+      if (dump_file)
+       fprintf (dump_file,
+                "Type inconsident devirtualization: %s/%i->%s\n",
+                ie->caller->name (), ie->caller->order,
+                IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
+      target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
+      cgraph_get_create_node (target);
+    }
 
   return target;
 }
index 55d746675f00f4782f7beef9ec0b25fb854e6315..da8d6437047238271a1474596dbfab32304f286d 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-25  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/60600
+       * g++.dg/ipa/pr60600.C: New test.
+
 2014-03-25  John David Anglin  <danglin@gcc.gnu.org>
 
        PR testsuite/58013
diff --git a/gcc/testsuite/g++.dg/ipa/pr60600.C b/gcc/testsuite/g++.dg/ipa/pr60600.C
new file mode 100644 (file)
index 0000000..00c368e
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-ipa-cp" } */
+
+struct data {
+    data(int);
+};
+
+struct top {
+    virtual int topf();
+};
+
+struct intermediate: top {
+    int topf() /* override */ { return 0; }
+};
+
+struct child1: top {
+    void childf()
+    {
+        data d(topf());
+    }
+};
+
+struct child2: intermediate {};
+
+void test(top& t)
+{
+    child1& c = static_cast<child1&>(t);
+    c.childf();
+    child2 d;
+    test(d);
+}
+
+/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */
+/* { dg-final { cleanup-ipa-dump "cp" } } */