[Google] Fix AFDO early inline ICEs due to DFE

Dehao Chen dehao@google.com
Thu Jun 12 21:47:00 GMT 2014


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



More information about the Gcc-patches mailing list