On Tue, 2021-04-13 at 08:08 +0200, Jan Hubicka wrote: > Hi, > stepping through the streaming process it turns out to be funny > difference between gimple_has_body and node->has_gimple_body_p. > While the first tests whether gimple body really exists in memory (by > looking for DECL_STRUCT_FUNCTION) the second tests if gimple body can > be > made available via node->get_body (so gimple_body_p returns 1). > > Now what happens is that function clone is created and the original > function becomes dead and thus is marked as external declaration. At > this point we can not get the body via node->get_body, but body is > still > around since analyzer read it. This makes the renumbering loop to > miss > this particular body. Since for node->clone_of we have > gimple_body_p (node->clone_of->decl) == true > and > node->has_gimple_body_p (node->clone_of) == false > While for node we have > node->has_gimple_body_p (node) == true > > This is both correct but next stage1 we really ought to rename one of > predicates. Sadly I can not think of much better names though. > > I am testing. > > diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c > index ceb61bb300b..5903f75ac23 100644 > --- a/gcc/lto/lto.c > +++ b/gcc/lto/lto.c > @@ -306,7 +306,7 @@ lto_wpa_write_files (void) > cgraph_node *node; > /* Do body modifications needed for streaming before we fork out > worker processes. */ > - FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node) > + FOR_EACH_FUNCTION (node) > if (!node->clone_of && gimple_has_body_p (node->decl)) > lto_prepare_function_for_streaming (node); >
Thanks for digging into it. FWIW the above patch seems to fix my reproducer (if I remove the uid restoration logic from my patch). But maybe leave it to next stage 1, and keep my workaround for now? On the subject of the analyzer and LTO, I should note that the analyzer somewhat abuses the framework by doing all of the analysis together in WPA, rather than trying to storing summaries from WPA to allow sharding of the analysis in LTRANS. The analyzer currently only has a placeholder implementation of call summarization; it's something I hope to look at for GCC 12: Updating it further to properly split things between WPA and LTRANS would be additional work on top of that. Dave