summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2017-11-13 17:23:25 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2017-11-13 17:23:25 +0000
commit7c3432355e5a6fbd32ce0ddcca76ba21d5343f6d (patch)
tree6ecf459f42e8a834a49fe66dca8ae9575c9b5b31 /gcc
parentcbf33885f546b11b64dd04d22bf0f42c4627bfb3 (diff)
downloadgcc-7c3432355e5a6fbd32ce0ddcca76ba21d5343f6d.tar.gz
* cgraph.c (cgraph_edge::sreal_frequency): New function.
* cgraph.h (cgraph_edge::sreal_frequency): Declare. * ipa-fnsummary.c (dump_ipa_call_summary): Use sreal_frequency. (estimate_edge_size_and_time): Likewise. (ipa_merge_fn_summary_after_inlining): Likewise. * ipa-inline.c (cgraph_freq_base_rec): Remove. (compute_uninlined_call_time): Use sreal_frequency. (compute_inlined_call_time): Likewise. (ipa_inline): Do not initialize cgraph_freq_base_rec. * profile-count.c: Include sreal.h. (profile_count::to_sreal_scale): New. * profile-count.h: Forward declare sreal. (profile_count::to_sreal_scale): Declare. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254696 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/cgraph.c12
-rw-r--r--gcc/cgraph.h4
-rw-r--r--gcc/ipa-fnsummary.c17
-rw-r--r--gcc/ipa-inline.c15
-rw-r--r--gcc/profile-count.c27
-rw-r--r--gcc/profile-count.h3
7 files changed, 79 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 316bd020c07..87d200b24f1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2017-11-13 Jan Hubicka <hubicka@ucw.cz>
+
+ * cgraph.c (cgraph_edge::sreal_frequency): New function.
+ * cgraph.h (cgraph_edge::sreal_frequency): Declare.
+ * ipa-fnsummary.c (dump_ipa_call_summary): Use sreal_frequency.
+ (estimate_edge_size_and_time): Likewise.
+ (ipa_merge_fn_summary_after_inlining): Likewise.
+ * ipa-inline.c (cgraph_freq_base_rec): Remove.
+ (compute_uninlined_call_time): Use sreal_frequency.
+ (compute_inlined_call_time): Likewise.
+ (ipa_inline): Do not initialize cgraph_freq_base_rec.
+ * profile-count.c: Include sreal.h.
+ (profile_count::to_sreal_scale): New.
+ * profile-count.h: Forward declare sreal.
+ (profile_count::to_sreal_scale): Declare.
+
2017-11-13 Nathan Sidwell <nathan@acm.org>
* diagnostic.c (maybe_line_and_column): New.
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 83e496b4239..bc60fc90f56 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -3880,4 +3880,16 @@ cgraph_node::has_thunk_p (cgraph_node *node, void *)
return false;
}
+/* Expected frequency of executions within the function.
+ When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
+ per function call. The range is 0 to CGRAPH_FREQ_MAX. */
+
+sreal
+cgraph_edge::sreal_frequency ()
+{
+ return count.to_sreal_scale (caller->global.inlined_to
+ ? caller->global.inlined_to->count
+ : caller->count);
+}
+
#include "gt-cgraph.h"
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 8da8f605b6f..1c952eb5094 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -1766,6 +1766,9 @@ struct GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_caller"),
When set to CGRAPH_FREQ_BASE, the edge is expected to be called once
per function call. The range is 0 to CGRAPH_FREQ_MAX. */
int frequency ();
+
+ /* Expected frequency of executions within the function. */
+ sreal sreal_frequency ();
private:
/* Remove the edge from the list of the callers of the callee. */
void remove_caller (void);
@@ -3120,6 +3123,7 @@ cgraph_edge::frequency ()
: caller->count);
}
+
/* Return true if the TM_CLONE bit is set for a given FNDECL. */
static inline bool
decl_is_tm_clone (const_tree fndecl)
diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c
index 6c0e4370066..ddc16bd50d7 100644
--- a/gcc/ipa-fnsummary.c
+++ b/gcc/ipa-fnsummary.c
@@ -817,12 +817,12 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
int i;
fprintf (f,
- "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i"
+ "%*s%s/%i %s\n%*s loop depth:%2i freq:%4.2f size:%2i"
" time: %2i callee size:%2i stack:%2i",
indent, "", callee->name (), callee->order,
!edge->inline_failed
? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
- indent, "", es->loop_depth, edge->frequency (),
+ indent, "", es->loop_depth, edge->sreal_frequency ().to_double (),
es->call_stmt_size, es->call_stmt_time,
(int) ipa_fn_summaries->get (callee)->size / ipa_fn_summary::size_scale,
(int) ipa_fn_summaries->get (callee)->estimated_stack_size);
@@ -860,11 +860,12 @@ dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
for (edge = node->indirect_calls; edge; edge = edge->next_callee)
{
struct ipa_call_summary *es = ipa_call_summaries->get (edge);
- fprintf (f, "%*sindirect call loop depth:%2i freq:%4i size:%2i"
+ fprintf (f, "%*sindirect call loop depth:%2i freq:%4.2f size:%2i"
" time: %2i",
indent, "",
es->loop_depth,
- edge->frequency (), es->call_stmt_size, es->call_stmt_time);
+ edge->sreal_frequency ().to_double (), es->call_stmt_size,
+ es->call_stmt_time);
if (es->predicate)
{
fprintf (f, "predicate: ");
@@ -2578,10 +2579,10 @@ estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *min_size,
if (min_size)
*min_size += cur_size;
if (prob == REG_BR_PROB_BASE)
- *time += ((sreal)(call_time * e->frequency ())) / CGRAPH_FREQ_BASE;
+ *time += ((sreal)call_time) * e->sreal_frequency ();
else
- *time += ((sreal)call_time) * (prob * e->frequency ())
- / (CGRAPH_FREQ_BASE * REG_BR_PROB_BASE);
+ *time += ((sreal)call_time * prob) * e->sreal_frequency ()
+ / CGRAPH_FREQ_BASE;
}
@@ -3058,7 +3059,7 @@ ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
toplev_predicate);
if (p != false && nonconstp != false)
{
- sreal add_time = ((sreal)e->time * edge->frequency ()) / CGRAPH_FREQ_BASE;
+ sreal add_time = ((sreal)e->time * edge->sreal_frequency ());
int prob = e->nonconst_predicate.probability (callee_info->conds,
clause, es->param);
add_time = add_time * prob / REG_BR_PROB_BASE;
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 3128f320bdd..8a2fd4baeeb 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -129,8 +129,8 @@ static int overall_size;
static profile_count max_count;
static profile_count spec_rem;
-/* Pre-computed constants 1/CGRAPH_FREQ_BASE and 1/100. */
-static sreal cgraph_freq_base_rec, percent_rec;
+/* Pre-computed constant 1/100. */
+static sreal percent_rec;
/* Return false when inlining edge E would lead to violating
limits on function unit growth or stack usage growth.
@@ -644,8 +644,9 @@ compute_uninlined_call_time (struct cgraph_edge *edge,
&& caller->count.ipa ().nonzero_p ())
uninlined_call_time *= (sreal)edge->count.ipa ().to_gcov_type ()
/ caller->count.ipa ().to_gcov_type ();
- if (edge->frequency ())
- uninlined_call_time *= cgraph_freq_base_rec * edge->frequency ();
+ sreal freq = edge->sreal_frequency ();
+ if (freq != 0)
+ uninlined_call_time *= freq;
else
uninlined_call_time = uninlined_call_time >> 11;
@@ -668,8 +669,9 @@ compute_inlined_call_time (struct cgraph_edge *edge,
if (edge->count.ipa ().nonzero_p ()
&& caller->count.ipa ().nonzero_p ())
time *= (sreal)edge->count.to_gcov_type () / caller->count.to_gcov_type ();
- if (edge->frequency ())
- time *= cgraph_freq_base_rec * edge->frequency ();
+ sreal freq = edge->sreal_frequency ();
+ if (freq != 0)
+ time *= freq;
else
time = time >> 11;
@@ -2390,7 +2392,6 @@ ipa_inline (void)
int cold;
bool remove_functions = false;
- cgraph_freq_base_rec = (sreal) 1 / (sreal) CGRAPH_FREQ_BASE;
percent_rec = (sreal) 1 / (sreal) 100;
order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
diff --git a/gcc/profile-count.c b/gcc/profile-count.c
index 9c57323db6e..51c3b74fefa 100644
--- a/gcc/profile-count.c
+++ b/gcc/profile-count.c
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "data-streamer.h"
#include "cgraph.h"
#include "wide-int.h"
+#include "sreal.h"
/* Dump THIS to F. */
@@ -256,6 +257,32 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const
return MIN (scale, CGRAPH_FREQ_MAX);
}
+/* Return THIS/IN as sreal value. */
+
+sreal
+profile_count::to_sreal_scale (profile_count in, bool *known) const
+{
+ if (!initialized_p ())
+ {
+ if (known)
+ *known = false;
+ return CGRAPH_FREQ_BASE;
+ }
+ if (known)
+ *known = true;
+ if (*this == profile_count::zero ())
+ return 0;
+ gcc_checking_assert (in.initialized_p ());
+
+ if (!in.m_val)
+ {
+ if (!m_val)
+ return 1;
+ return m_val * 4;
+ }
+ return (sreal)m_val / (sreal)in.m_val;
+}
+
/* We want to scale profile across function boundary from NUM to DEN.
Take care of the side case when DEN is zeros. We still want to behave
sanely here which means
diff --git a/gcc/profile-count.h b/gcc/profile-count.h
index aa42b4e2397..90d1bc747ee 100644
--- a/gcc/profile-count.h
+++ b/gcc/profile-count.h
@@ -601,6 +601,8 @@ public:
*/
+class sreal;
+
class GTY(()) profile_count
{
/* Use 62bit to hold basic block counters. Should be at least
@@ -1034,6 +1036,7 @@ public:
int to_frequency (struct function *fun) const;
int to_cgraph_frequency (profile_count entry_bb_count) const;
+ sreal to_sreal_scale (profile_count in, bool *known = NULL) const;
/* Output THIS to F. */
void dump (FILE *f) const;