aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline-transform.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-06-11 01:18:44 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2017-06-10 23:18:44 +0000
commit09fcc0c01d21bec1f7e1f40a4400c9248a2e5ca7 (patch)
treeca6b214b50302f2ecf5746397769ea8a6ca97ce0 /gcc/ipa-inline-transform.c
parent1511c8c005d91ff2af7010d852fe83bdde0fd3f3 (diff)
downloadgcc-09fcc0c01d21bec1f7e1f40a4400c9248a2e5ca7.zip
gcc-09fcc0c01d21bec1f7e1f40a4400c9248a2e5ca7.tar.gz
gcc-09fcc0c01d21bec1f7e1f40a4400c9248a2e5ca7.tar.bz2
ipa-inline-transform.c: Include function.h, cfg.h and basic-block.h
* ipa-inline-transform.c: Include function.h, cfg.h and basic-block.h (mark_all_inlined_calls_cdtor): Fix formating. (inline_transform): Rescale profile before inlining. From-SVN: r249098
Diffstat (limited to 'gcc/ipa-inline-transform.c')
-rw-r--r--gcc/ipa-inline-transform.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 01a6833..9866a55 100644
--- a/gcc/ipa-inline-transform.c
+++ b/gcc/ipa-inline-transform.c
@@ -44,6 +44,9 @@ along with GCC; see the file COPYING3. If not see
#include "ipa-fnsummary.h"
#include "ipa-inline.h"
#include "tree-inline.h"
+#include "function.h"
+#include "cfg.h"
+#include "basic-block.h"
int ncalls_inlined;
int nfunctions_inlined;
@@ -276,7 +279,7 @@ mark_all_inlined_calls_cdtor (cgraph_node *node)
{
cs->in_polymorphic_cdtor = true;
if (!cs->inline_failed)
- mark_all_inlined_calls_cdtor (cs->callee);
+ mark_all_inlined_calls_cdtor (cs->callee);
}
for (cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
cs->in_polymorphic_cdtor = true;
@@ -661,7 +664,37 @@ inline_transform (struct cgraph_node *node)
timevar_push (TV_INTEGRATION);
if (node->callees && (opt_for_fn (node->decl, optimize) || has_inline))
- todo = optimize_inline_calls (current_function_decl);
+ {
+ profile_count num = node->count;
+ profile_count den = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
+ bool scale = num.initialized_p ()
+ && (den > 0 || num == profile_count::zero ())
+ && !(num == den);
+ if (scale)
+ {
+ if (dump_file)
+ {
+ fprintf (dump_file, "Applying count scale ");
+ num.dump (dump_file);
+ fprintf (dump_file, "/");
+ den.dump (dump_file);
+ fprintf (dump_file, "\n");
+ }
+
+ basic_block bb;
+ FOR_ALL_BB_FN (bb, cfun)
+ {
+ bb->count = bb->count.apply_scale (num, den);
+
+ edge e;
+ edge_iterator ei;
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ e->count = e->count.apply_scale (num, den);
+ }
+ ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = node->count;
+ }
+ todo = optimize_inline_calls (current_function_decl);
+ }
timevar_pop (TV_INTEGRATION);
cfun->always_inline_functions_inlined = true;