aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog22
-rw-r--r--gcc/ipa-inline-analysis.c2
-rw-r--r--gcc/ipa-split.c2
-rw-r--r--gcc/ipa.c33
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/timevar.def1
-rw-r--r--gcc/tree-pass.h1
7 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 578b0a0..6839fda 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,25 @@
+2012-08-02 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/53321
+ PR middle-end/53865
+ * ipa-inline-analysis.c (inline_free_summary): Return if
+ inline_edge_summary_vec is NULL.
+
+ * ipa-split.c (execute_split_functions): Check if a function
+ is inlinable only if inline_edge_summary_vec != NULL.
+
+ * ipa.c (symtab_remove_unreachable_nodes): Restore
+ cgraph_propagate_frequency call when something was changed.
+ (free_inline_summary): New function.
+ (pass_ipa_free_inline_summary): New pass.
+
+ * passes.c (init_optimization_passes): Add
+ pass_ipa_free_inline_summary before pass_ipa_tree_profile.
+
+ * timevar.def (TV_IPA_FREE_INLINE_SUMMARY): New.
+
+ * tree-pass.h (pass_ipa_free_inline_summary): New.
+
2012-08-02 Richard Earnshaw <rearnsha@arm.com>
* arm.c (arm_gen_constant): Use UBFX for some AND operations when
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index ae32131..970be1e 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -3242,6 +3242,8 @@ void
inline_free_summary (void)
{
struct cgraph_node *node;
+ if (inline_edge_summary_vec == NULL)
+ return;
FOR_EACH_DEFINED_FUNCTION (node)
reset_inline_summary (node);
if (function_insertion_hook_holder)
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index d6aad89..7155f99 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1397,7 +1397,7 @@ execute_split_functions (void)
}
/* This can be relaxed; function might become inlinable after splitting
away the uninlinable part. */
- if (!inline_summary (node)->inlinable)
+ if (inline_edge_summary_vec && !inline_summary (node)->inlinable)
{
if (dump_file)
fprintf (dump_file, "Not splitting: not inlinable.\n");
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 9329d9b..e270591 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -448,6 +448,11 @@ symtab_remove_unreachable_nodes (bool before_inlining_p, FILE *file)
verify_symtab ();
#endif
+ /* If we removed something, perhaps profile could be improved. */
+ if (changed && optimize && inline_edge_summary_vec)
+ FOR_EACH_DEFINED_FUNCTION (node)
+ cgraph_propagate_frequency (node);
+
return changed;
}
@@ -960,6 +965,34 @@ struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility =
}
};
+/* Free inline summary. */
+
+static unsigned
+free_inline_summary (void)
+{
+ inline_free_summary ();
+ return 0;
+}
+
+struct simple_ipa_opt_pass pass_ipa_free_inline_summary =
+{
+ {
+ SIMPLE_IPA_PASS,
+ "*free_inline_summary", /* name */
+ NULL, /* gate */
+ free_inline_summary, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_ggc_collect /* todo_flags_finish */
+ }
+};
+
/* Do not re-run on ltrans stage. */
static bool
diff --git a/gcc/passes.c b/gcc/passes.c
index 877a768..31e1f25 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1323,6 +1323,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_rebuild_cgraph_edges);
NEXT_PASS (pass_inline_parameters);
}
+ NEXT_PASS (pass_ipa_free_inline_summary);
NEXT_PASS (pass_ipa_tree_profile);
{
struct opt_pass **p = &pass_ipa_tree_profile.pass.sub;
diff --git a/gcc/timevar.def b/gcc/timevar.def
index 18d419d..8fa1a2b 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -89,6 +89,7 @@ DEFTIMEVAR (TV_IPA_PURE_CONST , "ipa pure const")
DEFTIMEVAR (TV_IPA_PTA , "ipa points-to")
DEFTIMEVAR (TV_IPA_SRA , "ipa SRA")
DEFTIMEVAR (TV_IPA_FREE_LANG_DATA , "ipa free lang data")
+DEFTIMEVAR (TV_IPA_FREE_INLINE_SUMMARY, "ipa free inline summary")
/* Time spent by constructing CFG. */
DEFTIMEVAR (TV_CFG , "cfg construction")
/* Time spent by cleaning up CFG. */
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 80ff513..4be92f4 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -375,6 +375,7 @@ extern struct simple_ipa_opt_pass pass_ipa_increase_alignment;
extern struct simple_ipa_opt_pass pass_ipa_matrix_reorg;
extern struct ipa_opt_pass_d pass_ipa_inline;
extern struct simple_ipa_opt_pass pass_ipa_free_lang_data;
+extern struct simple_ipa_opt_pass pass_ipa_free_inline_summary;
extern struct ipa_opt_pass_d pass_ipa_cp;
extern struct ipa_opt_pass_d pass_ipa_reference;
extern struct ipa_opt_pass_d pass_ipa_pure_const;