Josef Melcr <[email protected]> writes: > The inclusion of this early return statement has been discussed before, > it was ultimately left out of the original patch, but it turns out to be > necessary. > > When a callback edge is being created, it is first created by > symbol_table::create_edge, which is where it is added to the call site > hash. However, its callback flag is not set at that point, so the early > return for callback edges doesn't affect it. This causes the wrong edge > to be hashed, ultimately leading to segfaults and ICEs. This happens > many times in the testsuite, the one I noticed first was > libgomp.fortran/simd7.f90.
Ping on this (and the rest of the series). This one is needed to stop IM ICEing (PR122358). I've been using it for a month. > > gcc/ChangeLog: > > * cgraph.cc (cgraph_add_edge_to_call_site_hash): Add an early > return when the hashed edge is a callback-carrying edge. > > Signed-off-by: Josef Melcr <[email protected]> > --- > gcc/cgraph.cc | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc > index d1b2e2a162c..782c4d87b63 100644 > --- a/gcc/cgraph.cc > +++ b/gcc/cgraph.cc > @@ -885,9 +885,10 @@ cgraph_add_edge_to_call_site_hash (cgraph_edge *e) > gcc_assert (edge->speculative || edge->has_callback); > if (edge->has_callback) > /* If the slot is already occupied, then the hashed edge is the > - callback-carrying edge, which is desired behavior, so we can safely > - return. */ > - gcc_checking_assert (edge == e); > + callback-carrying edge, which is desired behavior. If we don't > + return now, the slot could be overwritten during callback edge > + creation, because the flags are not initialized at that point. */ > + return; > if (e->callee && (!e->prev_callee > || !e->prev_callee->speculative > || e->prev_callee->call_stmt != e->call_stmt))
