https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89330

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|marxin at gcc dot gnu.org          |jamborm at gcc dot 
gnu.org

--- Comment #20 from Martin Liška <marxin at gcc dot gnu.org> ---
Ok, one can reproduce the problem with:

$ ../configure --enable-languages=c,c++,lto,fortran --disable-multilib
--prefix=/home/marxin/bin/gcc2 --enable-checking=release --without-isl
--disable-libsanitizer --disable-bootstrap

Reduced test-case:

$ cat /tmp/tree-ssa-sccvn-ice.ii
class A {
public:
  int dest;
};
class B {
public:
  B(int);
  virtual int m_fn1();
};
int B::m_fn1() { return __null; }
void fn1(B &p1, bool, bool, bool, bool, bool) {
  for (;;) {
    p1.m_fn1();
    p1.m_fn1();
  }
}
A a;
void fn2(bool p1) {
  B b(a.dest);
  fn1(b, false, false, p1, fn2, &a);
}

I also have a debugging patch that shows which released edge is used:

diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 81250acb70c..c585713b23a 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -1008,8 +1008,10 @@ symbol_table::free_edge (cgraph_edge *e)
   if (e->m_summary_id != -1)
     edge_released_summary_ids.safe_push (e->m_summary_id);

+  fprintf (stderr, "releasing: %p: %p->%p\n", e, e->caller, e->callee);
   if (e->indirect_info)
     ggc_free (e->indirect_info);
+  e->caller = NULL;
   ggc_free (e);
 }

@@ -1111,6 +1113,8 @@ cgraph_edge::speculative_call_info (cgraph_edge *&direct,
       if (e2->call_stmt)
        {
          e = e->caller->get_edge (e2->call_stmt);
+         fprintf (stderr, "cgraph_edge::speculative_call_info: %p\n", e);
+         gcc_assert (e->caller);
          gcc_assert (e->speculative && !e->indirect_unknown_callee);
        }
       else
@@ -1223,6 +1227,8 @@ cgraph_edge::make_direct (cgraph_node *callee)
   ggc_free (indirect_info);
   indirect_info = NULL;

+  fprintf (stderr, "cgraph_edge::make_direct: %p\n", this);
+
   /* Get the edge out of the indirect edge list. */
   if (prev_callee)
     prev_callee->next_callee = next_callee;

$ ./xgcc -B. /tmp/tree-ssa-sccvn-ice.ii -c -O2
/tmp/tree-ssa-sccvn-ice.ii: In member function ‘virtual int B::m_fn1()’:
/tmp/tree-ssa-sccvn-ice.ii:10:25: warning: converting to non-pointer type ‘int’
from NULL [-Wconversion-null]
   10 | int B::m_fn1() { return __null; }
      |                         ^~~~~~
releasing: 0x7fe4853894e0: 0x7fe485380438->(nil)
releasing: 0x7fe485389478: 0x7fe485380438->(nil)
releasing: 0x7fe485389820: 0x7fe4853805a0->0x7fe485380438
releasing: 0x7fe4853897b8: 0x7fe4853805a0->0x7fe485380708
releasing: 0x7fe485389958: 0x7fe485380438->(nil)
releasing: 0x7fe4853898f0: 0x7fe485380438->(nil)
releasing: 0x7fe485389af8: 0x7fe485380438->(nil)
releasing: 0x7fe485389a90: 0x7fe485380438->(nil)
releasing: 0x7fe485389a28: 0x7fe4853805a0->0x7fe485380438
releasing: 0x7fe4853899c0: 0x7fe4853805a0->0x7fe485380708
releasing: 0x7fe485389ea0: 0x7fe4853805a0->0x7fe485380438
releasing: 0x7fe485389e38: 0x7fe4853805a0->0x7fe485380708
cgraph_edge::speculative_call_info: 0x7fe485389888
cgraph_edge::speculative_call_info: 0x7fe485389888
releasing: 0x7fe4853899c0: 0x7fe4854f92d0->(nil)
cgraph_edge::make_direct: 0x7fe4853899c0
during IPA pass: inline
/tmp/tree-ssa-sccvn-ice.ii: At global scope:
/tmp/tree-ssa-sccvn-ice.ii:21:1: internal compiler error: Segmentation fault
   21 | }
      | ^
0x11f0c8a crash_signal
        ../../gcc/toplev.c:326
0x7fe48560de4f ???
       
/usr/src/debug/glibc-2.29-7.3.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
0xc078da cgraph_edge::make_direct(cgraph_node*)
        ../../gcc/cgraph.c:1238
0xef8525 ipa_make_edge_direct_to_target(cgraph_edge*, tree_node*, bool)
        ../../gcc/ipa-prop.c:2978
0xef951c try_make_edge_direct_virtual_call
        ../../gcc/ipa-prop.c:3398
0xef97cc update_indirect_edges_after_inlining
        ../../gcc/ipa-prop.c:3463
0xef9b71 propagate_info_to_inlined_callees
        ../../gcc/ipa-prop.c:3556
0xefa1ed ipa_propagate_indirect_call_infos(cgraph_edge*, vec<cgraph_edge*,
va_heap, vl_ptr>*)
        ../../gcc/ipa-prop.c:3713
0x1eb1b06 inline_call(cgraph_edge*, bool, vec<cgraph_edge*, va_heap, vl_ptr>*,
int*, bool, bool*)
        ../../gcc/ipa-inline-transform.c:486
0x1ea3efd inline_small_functions
        ../../gcc/ipa-inline.c:2088
0x1ea58c3 ipa_inline
        ../../gcc/ipa-inline.c:2550
0x1ea66b0 execute
        ../../gcc/ipa-inline.c:2958

@Martin: Can you please take a look at that?

Reply via email to