This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[GOOGLE] Refactor the profile propagation for AutoFDO
- From: Dehao Chen <dehao at google dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: David Li <davidxl at google dot com>, Diego Novillo <dnovillo at google dot com>
- Date: Mon, 25 Nov 2013 09:56:51 -0800
- Subject: [GOOGLE] Refactor the profile propagation for AutoFDO
- Authentication-results: sourceware.org; auth=none
afdo_propagate_multi_edge can do everything afdo_propagate_single_edge
does. So we refactor the code to keep only one afdo_propagate_edge
function.
Bootstrapped and passed all unittests and performance tests.
OK for googlge branch?
Thanks,
Dehao
Index: gcc/auto-profile.c
===================================================================
--- gcc/auto-profile.c (revision 205354)
+++ gcc/auto-profile.c (working copy)
@@ -1069,44 +1069,6 @@ afdo_find_equiv_class (void)
}
}
-/* If a baisk block only has one in/out edge, then the bb count and he
- edge count should be the same.
- IS_SUCC is true if the out edge of the basic block is examined.
- Return TRUE if any basic block/edge count is changed. */
-
-static bool
-afdo_propagate_single_edge (bool is_succ)
-{
- basic_block bb;
- bool changed = false;
-
- FOR_EACH_BB (bb)
- if (is_succ ? single_succ_p (bb) : single_pred_p (bb))
- {
- edge e = is_succ ? single_succ_edge (bb) : single_pred_edge (bb);
- if (((e->flags & EDGE_ANNOTATED) == 0)
- && ((bb->flags & BB_ANNOTATED) != 0))
- {
- e->count = bb->count;
- e->flags |= EDGE_ANNOTATED;
- changed = true;
- }
- else if (((e->flags & EDGE_ANNOTATED) != 0)
- && ((bb->flags & BB_ANNOTATED) == 0))
- {
- bb->count = e->count;
- bb->flags |= BB_ANNOTATED;
- changed = true;
- }
- else if (bb->count != e->count)
- {
- e->count = bb->count = MAX (bb->count, e->count);
- changed = true;
- }
- }
- return changed;
-}
-
/* If a basic block's count is known, and only one of its in/out edges' count
is unknown, its count can be calculated.
Meanwhile, if all of the in/out edges' counts are known, then the basic
@@ -1115,7 +1077,7 @@ afdo_find_equiv_class (void)
Return TRUE if any basic block/edge count is changed. */
static bool
-afdo_propagate_multi_edge (bool is_succ)
+afdo_propagate_edge (bool is_succ)
{
basic_block bb;
bool changed = false;
@@ -1281,14 +1243,10 @@ afdo_propagate (void)
{
changed = false;
- if (afdo_propagate_single_edge (true))
+ if (afdo_propagate_edge (true))
changed = true;
- if (afdo_propagate_single_edge (false))
+ if (afdo_propagate_edge (false))
changed = true;
- if (afdo_propagate_multi_edge (true))
- changed = true;
- if (afdo_propagate_multi_edge (false))
- changed = true;
afdo_propagate_circuit ();
}
}