summaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-06 17:32:40 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-11-06 17:32:40 +0000
commit698dd25b854c589f62180a0324806e8899c76bcd (patch)
treeabfafac6fff8d3f68f3f7615907940c7f4ea8ec2 /gcc/ipa-inline.c
parent026720255172a98a25274508228dfb202a2ba9c4 (diff)
downloadgcc-698dd25b854c589f62180a0324806e8899c76bcd.tar.gz
* ipa-inline.c (compute_uninlined_call_time): Return gcov_type.
(compute_inlined_call_time): Watch overflows. (relative_time_benefit): Compute in gcov_type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193249 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r--gcc/ipa-inline.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index b6a69cbbc7c..4b705799855 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -459,16 +459,16 @@ want_early_inline_function_p (struct cgraph_edge *e)
/* Compute time of the edge->caller + edge->callee execution when inlining
does not happen. */
-inline int
+inline gcov_type
compute_uninlined_call_time (struct inline_summary *callee_info,
struct cgraph_edge *edge)
{
- int uninlined_call_time =
+ gcov_type uninlined_call_time =
RDIV ((gcov_type)callee_info->time * MAX (edge->frequency, 1),
CGRAPH_FREQ_BASE);
- int caller_time = inline_summary (edge->caller->global.inlined_to
- ? edge->caller->global.inlined_to
- : edge->caller)->time;
+ gcov_type caller_time = inline_summary (edge->caller->global.inlined_to
+ ? edge->caller->global.inlined_to
+ : edge->caller)->time;
return uninlined_call_time + caller_time;
}
@@ -479,12 +479,13 @@ inline gcov_type
compute_inlined_call_time (struct cgraph_edge *edge,
int edge_time)
{
- int caller_time = inline_summary (edge->caller->global.inlined_to
- ? edge->caller->global.inlined_to
- : edge->caller)->time;
- int time = caller_time + RDIV ((edge_time - inline_edge_summary (edge)->call_stmt_time)
- * MAX (edge->frequency, 1),
- CGRAPH_FREQ_BASE);
+ gcov_type caller_time = inline_summary (edge->caller->global.inlined_to
+ ? edge->caller->global.inlined_to
+ : edge->caller)->time;
+ gcov_type time = (caller_time
+ + RDIV (((gcov_type) edge_time
+ - inline_edge_summary (edge)->call_stmt_time)
+ * MAX (edge->frequency, 1), CGRAPH_FREQ_BASE));
/* Possible one roundoff error, but watch for overflows. */
gcc_checking_assert (time >= INT_MIN / 2);
if (time < 0)
@@ -770,9 +771,9 @@ relative_time_benefit (struct inline_summary *callee_info,
struct cgraph_edge *edge,
int edge_time)
{
- int relbenefit;
- int uninlined_call_time = compute_uninlined_call_time (callee_info, edge);
- int inlined_call_time = compute_inlined_call_time (edge, edge_time);
+ gcov_type relbenefit;
+ gcov_type uninlined_call_time = compute_uninlined_call_time (callee_info, edge);
+ gcov_type inlined_call_time = compute_inlined_call_time (edge, edge_time);
/* Inlining into extern inline function is not a win. */
if (DECL_EXTERNAL (edge->caller->global.inlined_to
@@ -918,7 +919,7 @@ edge_badness (struct cgraph_edge *edge, bool dump)
(int) badness, (double)edge->frequency / CGRAPH_FREQ_BASE,
relative_time_benefit (callee_info, edge, edge_time) * 100.0
/ RELATIVE_TIME_BENEFIT_RANGE,
- compute_uninlined_call_time (callee_info, edge),
+ (int)compute_uninlined_call_time (callee_info, edge),
(int)compute_inlined_call_time (edge, edge_time),
estimate_growth (callee),
callee_info->growth);