Ok, with minor fix to the comments: 1) Before possibly cloning --> Before possibly creating a new 2) It is not clear from the comments that the remaining references are from call statements in ipa cp clones that have not been fixed up. Possibly add a 3 line example to show the call statements calling the original function --> after fixup it will be calling the callee's clone?
thanks, David On Tue, Jul 1, 2014 at 7:06 AM, Teresa Johnson <tejohn...@google.com> wrote: > This patch addresses an issue with looking up the resolved node > rebuilding cgraph references during clone materialization. It is > possible that in ipa-cp cases the resolved node was eliminated during > inlining and indirect call promotion, but the clone still exists as a > function call argument in an inline virtual clone. The clones would be > removed later when we actually do the inline transformation, but in > the meantime during clone materialization the cgraph references are > rebuilt, and the temporary reference on the call still exists in the > IR. Handle this by skipping such references in inline clones. > > Passes regression tests. Ok for google/4_9? > > Teresa > > 2014-07-01 Teresa Johnson <tejohn...@google.com> > > Google ref b/15411384. > * cgraphbuild.c (mark_address): Skip resolved node lookup > in inline copies. > > Index: cgraphbuild.c > =================================================================== > --- cgraphbuild.c (revision 211957) > +++ cgraphbuild.c (working copy) > @@ -389,8 +389,28 @@ mark_address (gimple stmt, tree addr, tree, void * > addr = get_base_address (addr); > if (TREE_CODE (addr) == FUNCTION_DECL) > { > + /* Before possibly cloning the node in cgraph_get_create_node, > + save the current cgraph node for addr. */ > + struct cgraph_node *first_clone = cgraph_get_node (addr); > struct cgraph_node *node = cgraph_get_create_node (addr); > - if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done) > + /* In LIPO mode we use the resolved node. However, there is > + a possibility that it may not exist at this point. This > + can happen in cases of ipa-cp, where this is a reference > + that will eventually go away during inline_transform when we > + invoke cgraph_redirect_edge_call_stmt_to_callee to rewrite > + the call_stmt and skip some arguments. It is possible > + that earlier during inline_call the references to the original > + non-cloned resolved node were all eliminated, and it was removed. > + However, virtual clones may stick around until inline_transform, > + due to references in other virtual clones, at which point they > + will all be removed. In between inline_call and inline_transform, > + however, we will materialize clones which would rebuild references > + and end up here upon still seeing the reference on the call. > + Handle this by skipping the resolved node lookup when the first > + clone was marked global.inlined_to (i.e. it is a virtual clone, > + the original is gone). */ > + if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done > + && first_clone && !first_clone->global.inlined_to) > node = cgraph_lipo_get_resolved_node (addr); > > cgraph_mark_address_taken_node (node); > > > -- > Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413