re PR ipa/64978 (ICE: in ipcp_verify_propagated_values, at ipa-cp.c:1060)
authorJan Hubicka <hubicka@ucw.cz>
Tue, 10 Feb 2015 00:38:46 +0000 (01:38 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 10 Feb 2015 00:38:46 +0000 (00:38 +0000)
PR ipa/64978
* ipa-cp.c (gather_caller_stats): Skip thunks.
(propagate_constants_topo): Skip aliases.

* g++.dg/torture/pr64978.C: New testcase.

From-SVN: r220557

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

index 5981be8..4757470 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-09  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64978
+       * ipa-cp.c (gather_caller_stats): Skip thunks.
+       (propagate_constants_topo): Skip aliases.
+
 2015-02-09  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        PR target/64761
index 0c540eb..440ced4 100644 (file)
@@ -560,10 +560,7 @@ gather_caller_stats (struct cgraph_node *node, void *data)
   struct cgraph_edge *cs;
 
   for (cs = node->callers; cs; cs = cs->next_caller)
-    if (cs->caller->thunk.thunk_p)
-      cs->caller->call_for_symbol_thunks_and_aliases (gather_caller_stats,
-                                                   stats, false);
-    else
+    if (!cs->caller->thunk.thunk_p)
       {
        stats->count_sum += cs->count;
        stats->freq_sum += cs->frequency;
@@ -2643,7 +2640,7 @@ propagate_constants_topo (struct ipa_topo_info *topo)
          for (cs = v->callees; cs; cs = cs->next_callee)
            if (ipa_edge_within_scc (cs)
                && propagate_constants_accross_call (cs))
-             push_node_to_stack (topo, cs->callee);
+             push_node_to_stack (topo, cs->callee->function_symbol ());
          v = pop_node_from_stack (topo);
        }
 
index 67f1e8e..f34de6e 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64978
+       * g++.dg/torture/pr64978.C: New testcase.
+
 2015-02-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR sanitizer/64981
diff --git a/gcc/testsuite/g++.dg/torture/pr64978.C b/gcc/testsuite/g++.dg/torture/pr64978.C
new file mode 100644 (file)
index 0000000..a9ac49f
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+class A {
+public:
+  A(int, int);
+};
+class B {
+public:
+  void m_fn1(bool, const int *, int &);
+  unsigned m_fn2();
+};
+namespace {
+class C {
+  B &VTables;
+  void m_fn3(A, unsigned, const int *, int &);
+
+public:
+  int VFTableBuilder_VisitedBases;
+  B VFTableBuilder_VTables;
+  C() : VTables(VFTableBuilder_VTables) {
+    m_fn3(A(0, 0), 0, 0, VFTableBuilder_VisitedBases);
+  }
+};
+}
+int a;
+void C::m_fn3(A, unsigned, const int *, int &) {
+  for (;;)
+    1 ? VTables.m_fn2() : 0;
+}
+void B::m_fn1(bool, const int *, int &) { C(); }
+unsigned B::m_fn2() { m_fn1(0, 0, a); }