> Hi. > > Noticed during building of libbackend.a with the LTO partial linking. > > The function release_body is called even if clone_of is a clone > of a another function and thus it shares tree declaration. We should > preserve it in that situation. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > PR ipa/107944 > > gcc/ChangeLog: > > * cgraph.cc (cgraph_node::remove): Do not release body > if a node is clone of another node. > --- > gcc/cgraph.cc | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc > index f15cb47c8b8..2e7d77ffd6c 100644 > --- a/gcc/cgraph.cc > +++ b/gcc/cgraph.cc > @@ -1893,7 +1893,7 @@ cgraph_node::remove (void) > else if (clone_of) > { > clone_of->clones = next_sibling_clone; > - if (!clone_of->analyzed && !clone_of->clones && !clones) > + if (!clone_of->analyzed && !clone_of->clones && !clones && > !clone_of->clone_of) > clone_of->release_body ();
It is interesting that the problem reproduced only after almost 20 years. But I suppose it is because we materialize clones in parituclar order. I think there are two ways to fix it. Either declare release_body to be applicable only to the master clone and avoid calling it here (as you do) or make release_body do nothing when called on a clone. I guess it makes sense to keep your approach but please add sanity check to release_body that clone_of == NULL with a comment. OK with that change. Honza > } > if (next_sibling_clone) > -- > 2.38.1 >