aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-06-16 13:41:19 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2017-06-16 11:41:19 +0000
commit7d72a77f93da14f52b2244d9bbd19dea52bcea26 (patch)
tree77051b4b87d6df7956332bd6d3707b0007772e61 /gcc
parent8d94f9324a2c79c6f93e5eea37776b2a27c3532c (diff)
downloadgcc-7d72a77f93da14f52b2244d9bbd19dea52bcea26.zip
gcc-7d72a77f93da14f52b2244d9bbd19dea52bcea26.tar.gz
gcc-7d72a77f93da14f52b2244d9bbd19dea52bcea26.tar.bz2
ipa-inline-transform.c (update_noncloned_frequencies): Update also counts.
* ipa-inline-transform.c (update_noncloned_frequencies): Update also counts. (clone_inlined_nodes): Update. From-SVN: r249244
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-inline-transform.c17
2 files changed, 19 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 219dc12..0fed0dc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-16 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa-inline-transform.c (update_noncloned_frequencies): Update also
+ counts.
+ (clone_inlined_nodes): Update.
+
2017-06-16 Maxim Kuvyrkov <maxim.kuvyrkov@linaro.org>
* config/aarch64/aarch64.c (qdf24xx_prefetch_tune): Update
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 9866a55..dc224f7 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -54,10 +54,12 @@ int nfunctions_inlined;
/* Scale frequency of NODE edges by FREQ_SCALE. */
static void
-update_noncloned_frequencies (struct cgraph_node *node,
- int freq_scale)
+update_noncloned_frequencies (struct cgraph_node *node,
+ int freq_scale, profile_count num,
+ profile_count den)
{
struct cgraph_edge *e;
+ bool scale = (num == profile_count::zero () || den > 0);
/* We do not want to ignore high loop nest after freq drops to 0. */
if (!freq_scale)
@@ -68,14 +70,20 @@ update_noncloned_frequencies (struct cgraph_node *node,
if (e->frequency > CGRAPH_FREQ_MAX)
e->frequency = CGRAPH_FREQ_MAX;
if (!e->inline_failed)
- update_noncloned_frequencies (e->callee, freq_scale);
+ update_noncloned_frequencies (e->callee, freq_scale, num, den);
+ if (scale)
+ e->count = e->count.apply_scale (num, den);
}
for (e = node->indirect_calls; e; e = e->next_callee)
{
e->frequency = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
if (e->frequency > CGRAPH_FREQ_MAX)
e->frequency = CGRAPH_FREQ_MAX;
+ if (scale)
+ e->count = e->count.apply_scale (num, den);
}
+ if (scale)
+ node->count = node->count.apply_scale (num, den);
}
/* We removed or are going to remove the last call to NODE.
@@ -212,7 +220,8 @@ clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
}
duplicate = false;
e->callee->externally_visible = false;
- update_noncloned_frequencies (e->callee, e->frequency);
+ update_noncloned_frequencies (e->callee, e->frequency,
+ e->count, e->callee->count);
dump_callgraph_transformation (e->callee, inlining_into,
"inlining to");