This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOOGLE] Fix incorrect detection of recursive calls during LIPO IPA inlining
- From: Xinliang David Li <davidxl at google dot com>
- To: Teresa Johnson <tejohnson at google dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Rong Xu <xur at google dot com>
- Date: Thu, 10 Apr 2014 14:10:31 -0700
- Subject: Re: [GOOGLE] Fix incorrect detection of recursive calls during LIPO IPA inlining
- Authentication-results: sourceware.org; auth=none
- References: <CAAe5K+Xgsn+dndRLEsTZqAhKCDFZqxGiuUuMqAkQjk0Pi+hruA at mail dot gmail dot com>
Looks good to me.
David
On Thu, Apr 10, 2014 at 2:04 PM, Teresa Johnson <tejohnson@google.com> wrote:
> This patch fixes an issue where self-recursive calls were missed
> during ipa inlining in LIPO compiles, since the resolved nodes were
> not checked. When a self-recursive call was inlined incorrectly,
> ipa_inline redirected the edge to the resolved node, leading to
> a cycle in the cgraph that wasn't expected and resulted in an
> infinite loop in estimate_calls_size_and_time.
>
> Also fix an inconsistency in the declaration of include_all_aux
> that was exposed when l-ipo.h was included in cgraph.
>
> Google ref b/13912450.
>
> Bootstrapped and tested. Ok for google/4_8?
>
> Thanks,
> Teresa
>
> 2014-04-10 Teresa Johnson <tejohnson@google.com>
>
> * cgraph.h (cgraph_edge_recursive_p): Check the resolved
> node in LIPO compiles.
> * l-ipo.h (include_all_aux): Fix declaration that didn't
> match definition.
> * Makefile.in (CGRAPH_H): Include l-ipo.h.
>
> Index: cgraph.h
> ===================================================================
> --- cgraph.h (revision 209280)
> +++ cgraph.h (working copy)
> @@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see
> #include "basic-block.h"
> #include "function.h"
> #include "ipa-ref.h"
> +#include "l-ipo.h"
>
> /* Symbol table consists of functions and variables.
> TODO: add labels, constant pool and aliases. */
> @@ -1388,10 +1389,15 @@ static inline bool
> cgraph_edge_recursive_p (struct cgraph_edge *e)
> {
> struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
> + struct cgraph_node *caller = e->caller;
> if (e->caller->global.inlined_to)
> - return e->caller->global.inlined_to->symbol.decl == callee->symbol.decl;
> - else
> - return e->caller->symbol.decl == callee->symbol.decl;
> + caller = e->caller->global.inlined_to;
> + if (L_IPO_COMP_MODE && cgraph_pre_profiling_inlining_done)
> + {
> + callee = cgraph_lipo_get_resolved_node (callee->symbol.decl);
> + caller = cgraph_lipo_get_resolved_node (caller->symbol.decl);
> + }
> + return (caller->symbol.decl == callee->symbol.decl);
> }
>
> /* Return true if the TM_CLONE bit is set for a given FNDECL. */
> Index: l-ipo.h
> ===================================================================
> --- l-ipo.h (revision 209280)
> +++ l-ipo.h (working copy)
> @@ -44,7 +44,7 @@ extern unsigned primary_module_id;
>
> /* Current module id. */
> extern unsigned current_module_id;
> -extern unsigned include_all_aux;
> +extern bool include_all_aux;
> extern struct gcov_module_info **module_infos;
> extern int is_last_module (unsigned mod_id);
>
> Index: Makefile.in
> ===================================================================
> --- Makefile.in (revision 209280)
> +++ Makefile.in (working copy)
> @@ -904,7 +904,8 @@ CFGLOOP_H = cfgloop.h $(BASIC_BLOCK_H) double-int.
> IPA_UTILS_H = ipa-utils.h $(TREE_H) $(CGRAPH_H)
> IPA_REFERENCE_H = ipa-reference.h $(BITMAP_H) $(TREE_H)
> CGRAPH_H = cgraph.h $(VEC_H) $(TREE_H) $(BASIC_BLOCK_H) $(FUNCTION_H) \
> - cif-code.def ipa-ref.h ipa-ref-inline.h $(LINKER_PLUGIN_API_H) is-a.h
> + cif-code.def ipa-ref.h ipa-ref-inline.h $(LINKER_PLUGIN_API_H) is-a.h \
> + l-ipo.h
> DF_H = df.h $(BITMAP_H) $(REGSET_H) sbitmap.h $(BASIC_BLOCK_H) \
> alloc-pool.h $(TIMEVAR_H)
> VALTRACK_H = valtrack.h $(BITMAP_H) $(DF_H) $(RTL_H) $(BASIC_BLOCK_H) \
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413