Message ID | CAAe5K+ULyxAfLLYgOWyggH99cE+ahM_0+5HKce16EvAs5Yb5kQ@mail.gmail.com |
---|---|
State | New |
Headers | show |
I think the patch looks good. David and Rong, any comments? Dehao On Thu, Jun 12, 2014 at 11:23 AM, Teresa Johnson <tejohnson@google.com> wrote: > These two patches fix multiple ICE that occurred due to DFE being > recently enabled after AutoFDO LIPO linking. > > Passes regression and internal testing. Ok for Google/4_8? > > Teresa > > 2014-06-12 Teresa Johnson <tejohnson@google.com> > Dehao Chen <dehao@google.com> > > Google ref b/15521327. > > * cgraphclones.c (cgraph_clone_edge): Use resolved node. > * l-ipo.c (resolve_cgraph_node): Resolve to non-removable node. > > Index: cgraphclones.c > =================================================================== > --- cgraphclones.c (revision 211386) > +++ cgraphclones.c (working copy) > @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. If not see > #include "ipa-utils.h" > #include "lto-streamer.h" > #include "except.h" > +#include "l-ipo.h" > > /* Create clone of E in the node N represented by CALL_EXPR the callgraph. */ > struct cgraph_edge * > @@ -118,7 +119,11 @@ cgraph_clone_edge (struct cgraph_edge *e, struct c > > if (call_stmt && (decl = gimple_call_fndecl (call_stmt))) > { > - struct cgraph_node *callee = cgraph_get_node (decl); > + struct cgraph_node *callee; > + if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done) > + callee = cgraph_lipo_get_resolved_node (decl); > + else > + callee = cgraph_get_node (decl); > gcc_checking_assert (callee); > new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq); > } > Index: l-ipo.c > =================================================================== > --- l-ipo.c (revision 211386) > +++ l-ipo.c (working copy) > @@ -1542,6 +1542,18 @@ resolve_cgraph_node (struct cgraph_sym **slot, str > gcc_assert (decl1_defined); > add_define_module (*slot, decl2); > > + /* Pick the node that cannot be removed, to avoid a situation > + where we remove the resolved node and later try to access > + it for the remaining non-removable copy. E.g. one may be > + extern and the other weak, only the extern copy can be removed. */ > + if (cgraph_can_remove_if_no_direct_calls_and_refs_p ((*slot)->rep_node) > + && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node)) > + { > + (*slot)->rep_node = node; > + (*slot)->rep_decl = decl2; > + return; > + } > + > has_prof1 = has_profile_info (decl1); > bool is_aux1 = cgraph_is_auxiliary (decl1); > bool is_aux2 = cgraph_is_auxiliary (decl2); > > > -- > Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
This looks fine to me. -Rong On Thu, Jun 12, 2014 at 11:23 AM, Teresa Johnson <tejohnson@google.com> wrote: > These two patches fix multiple ICE that occurred due to DFE being > recently enabled after AutoFDO LIPO linking. > > Passes regression and internal testing. Ok for Google/4_8? > > Teresa > > 2014-06-12 Teresa Johnson <tejohnson@google.com> > Dehao Chen <dehao@google.com> > > Google ref b/15521327. > > * cgraphclones.c (cgraph_clone_edge): Use resolved node. > * l-ipo.c (resolve_cgraph_node): Resolve to non-removable node. > > Index: cgraphclones.c > =================================================================== > --- cgraphclones.c (revision 211386) > +++ cgraphclones.c (working copy) > @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. If not see > #include "ipa-utils.h" > #include "lto-streamer.h" > #include "except.h" > +#include "l-ipo.h" > > /* Create clone of E in the node N represented by CALL_EXPR the callgraph. */ > struct cgraph_edge * > @@ -118,7 +119,11 @@ cgraph_clone_edge (struct cgraph_edge *e, struct c > > if (call_stmt && (decl = gimple_call_fndecl (call_stmt))) > { > - struct cgraph_node *callee = cgraph_get_node (decl); > + struct cgraph_node *callee; > + if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done) > + callee = cgraph_lipo_get_resolved_node (decl); > + else > + callee = cgraph_get_node (decl); > gcc_checking_assert (callee); > new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq); > } > Index: l-ipo.c > =================================================================== > --- l-ipo.c (revision 211386) > +++ l-ipo.c (working copy) > @@ -1542,6 +1542,18 @@ resolve_cgraph_node (struct cgraph_sym **slot, str > gcc_assert (decl1_defined); > add_define_module (*slot, decl2); > > + /* Pick the node that cannot be removed, to avoid a situation > + where we remove the resolved node and later try to access > + it for the remaining non-removable copy. E.g. one may be > + extern and the other weak, only the extern copy can be removed. */ > + if (cgraph_can_remove_if_no_direct_calls_and_refs_p ((*slot)->rep_node) > + && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node)) > + { > + (*slot)->rep_node = node; > + (*slot)->rep_decl = decl2; > + return; > + } > + > has_prof1 = has_profile_info (decl1); > bool is_aux1 = cgraph_is_auxiliary (decl1); > bool is_aux2 = cgraph_is_auxiliary (decl2); > > > -- > Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
Index: cgraphclones.c =================================================================== --- cgraphclones.c (revision 211386) +++ cgraphclones.c (working copy) @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3. If not see #include "ipa-utils.h" #include "lto-streamer.h" #include "except.h" +#include "l-ipo.h" /* Create clone of E in the node N represented by CALL_EXPR the callgraph. */ struct cgraph_edge * @@ -118,7 +119,11 @@ cgraph_clone_edge (struct cgraph_edge *e, struct c if (call_stmt && (decl = gimple_call_fndecl (call_stmt))) { - struct cgraph_node *callee = cgraph_get_node (decl); + struct cgraph_node *callee; + if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done) + callee = cgraph_lipo_get_resolved_node (decl); + else + callee = cgraph_get_node (decl); gcc_checking_assert (callee); new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq); } Index: l-ipo.c =================================================================== --- l-ipo.c (revision 211386) +++ l-ipo.c (working copy) @@ -1542,6 +1542,18 @@ resolve_cgraph_node (struct cgraph_sym **slot, str gcc_assert (decl1_defined); add_define_module (*slot, decl2); + /* Pick the node that cannot be removed, to avoid a situation + where we remove the resolved node and later try to access + it for the remaining non-removable copy. E.g. one may be + extern and the other weak, only the extern copy can be removed. */ + if (cgraph_can_remove_if_no_direct_calls_and_refs_p ((*slot)->rep_node) + && !cgraph_can_remove_if_no_direct_calls_and_refs_p (node)) + { + (*slot)->rep_node = node; + (*slot)->rep_decl = decl2; + return; + } + has_prof1 = has_profile_info (decl1); bool is_aux1 = cgraph_is_auxiliary (decl1); bool is_aux2 = cgraph_is_auxiliary (decl2);