[GOOGLE] Fix incorrect detection of recursive calls during LIPO IPA inlining
Teresa Johnson
tejohnson@google.com
Thu Apr 10 21:04:00 GMT 2014
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
More information about the Gcc-patches
mailing list