This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/51600] [4.7 Regression] ice in estimate_local_effects
- From: "hubicka at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 04 Jan 2012 14:57:34 +0000
- Subject: [Bug tree-optimization/51600] [4.7 Regression] ice in estimate_local_effects
- Auto-submitted: auto-generated
- References: <bug-51600-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51600
--- Comment #6 from Jan Hubicka <hubicka at gcc dot gnu.org> 2012-01-04 14:57:34 UTC ---
Estimate_edge_devirt_benefit seems to not make much of sense in mixing the
effects of inlining into the local size. Unforutnately we don't really have
much infrastructure for similar cases. For 4.8 I plan to add benefit metrics
that allows inline-analysis to hint inliner that the inlining is cool idea
besides the local code size/time improvements.
I am testing the following patch.
Index: ipa-inline-analysis.c
===================================================================
--- ipa-inline-analysis.c (revision 182871)
+++ ipa-inline-analysis.c (working copy)
@@ -2204,9 +2204,9 @@ estimate_edge_devirt_benefit (struct cgr
tree target;
struct cgraph_node *callee;
struct inline_summary *isummary;
- int edge_size = 0, edge_time = 0;
+ int edge_size, edge_time, time_diff, size_diff;
- if (!known_vals || !known_binfos)
+ if (!known_vals && !known_binfos)
return;
target = ipa_get_indirect_edge_target (ie, known_vals, known_binfos);
@@ -2214,10 +2214,12 @@ estimate_edge_devirt_benefit (struct cgr
return;
/* Account for difference in cost between indirect and direct calls. */
- *size -= ((eni_size_weights.indirect_call_cost - eni_size_weights.call_cost)
- * INLINE_SIZE_SCALE);
- *time -= ((eni_time_weights.indirect_call_cost - eni_time_weights.call_cost)
- * INLINE_TIME_SCALE * prob / REG_BR_PROB_BASE);
+ size_diff = ((eni_size_weights.indirect_call_cost -
eni_size_weights.call_cost)
+ * INLINE_SIZE_SCALE);
+ *size -= size_diff;
+ time_diff = ((eni_time_weights.indirect_call_cost -
eni_time_weights.call_cost)
+ * INLINE_TIME_SCALE * prob / REG_BR_PROB_BASE);
+ *time -= time_diff;
callee = cgraph_get_node (target);
if (!callee || !callee->analyzed)
@@ -2229,21 +2231,18 @@ estimate_edge_devirt_benefit (struct cgr
estimate_edge_size_and_time (ie, &edge_size, &edge_time, prob);
/* Count benefit only from functions that definitely will be inlined
- if additional context from NODE's caller were available. */
- if (edge_size >= isummary->size * INLINE_SIZE_SCALE)
+ if additional context from NODE's caller were available.
+
+ We just account overall size change by inlining. TODO:
+ we really need to add sort of benefit metrics for these kind of
+ cases. */
+ if (edge_size - size_diff >= isummary->size * INLINE_SIZE_SCALE)
{
/* Subtract size and time that we added for edge IE. */
- *size -= edge_size;
- *time -= edge_time;
+ *size -= edge_size - size_diff;
- /* Subtract benefit from inlining devirtualized call. */
- *size -= edge_size - isummary->size * INLINE_SIZE_SCALE;
- *time -= edge_time - (isummary->time * INLINE_TIME_SCALE * prob
- / REG_BR_PROB_BASE);
-
- /* TODO: estimate benefit from optimizing CALLEE's body provided
- additional context from IE call site.
- For insipiration see ipa-cp.c: devirtualization_time_bonus(). */
+ /* Account inlined call. */
+ *size += isummary->size * INLINE_SIZE_SCALE;
}
}