Hi,
here are few minor issues I run across while auditing the profile updating code.
The function.c changes solve some misupdates in jump threading.
tree-inline and except can be seen with -fprofile-feedback.
Bootstrapped/regtested x86_64-linux, will commit it shortly.
Honza
* tree-inline.c (tree_function_versioning): Set counts of split
functions.
* function.c (dup_block_and_redirect): Update the whole path through
epilogue.
(convert_jumps_to_returns): Update profile after redirection.
* cfgexpand.c (expand_gimple_tailcall): Initialize new edge.
* except.c (dw2_build_landing_pads, sjlj_emit_dispatch_table,
sjlj_emit_dispatch_table): Initialize profile of newly created
basic blocks
Index: tree-inline.c
===================================================================
*** tree-inline.c (revision 192080)
--- tree-inline.c (working copy)
*************** tree_function_versioning (tree old_decl,
*** 5251,5256 ****
--- 5251,5258 ----
if (new_entry)
{
struct cgraph_edge *e;
+ ENTRY_BLOCK_PTR->count = new_entry->count;
+ EXIT_BLOCK_PTR->count = new_entry->count;
rebuild_frequencies ();
new_version_node->count = ENTRY_BLOCK_PTR->count;
Index: function.c
===================================================================
*** function.c (revision 192080)
--- function.c (working copy)
*************** dup_block_and_redirect (basic_block bb,
*** 5670,5683 ****
{
int freq = EDGE_FREQUENCY (e);
copy_bb->count += e->count;
! copy_bb->frequency += EDGE_FREQUENCY (e);
! e->dest->count -= e->count;
! if (e->dest->count < 0)
! e->dest->count = 0;
! e->dest->frequency -= freq;
! if (e->dest->frequency < 0)
! e->dest->frequency = 0;
! redirect_edge_and_branch_force (e, copy_bb);
continue;
}
else
--- 5670,5690 ----
{
int freq = EDGE_FREQUENCY (e);
copy_bb->count += e->count;
! copy_bb->frequency += freq;
! while (bb != EXIT_BLOCK_PTR)
! {
! edge se;
! bb->count -= e->count;
! if (bb->count < 0)
! bb->count = 0;
! bb->frequency -= freq;
! if (bb->frequency < 0)
! bb->frequency = 0;
! se = single_succ_edge (bb);
! se->count -= e->count;
! bb = se->dest;
! }
! redirect_edge_and_branch_force (e, copy_bb);
continue;
}
else
*************** convert_jumps_to_returns (basic_block la
*** 5797,5802 ****
--- 5804,5815 ----
}
/* Fix up the CFG for the successful change we just made. */
+ e->dest->count -= e->count;
+ if (e->dest->count < 0)
+ e->dest->count = 0;
+ e->dest->frequency -= EDGE_FREQUENCY (e);
+ if (e->dest->frequency < 0)
+ e->dest->frequency = 0;
redirect_edge_succ (e, EXIT_BLOCK_PTR);
e->flags &= ~EDGE_CROSSING;
}
*************** epilogue_done:
*** 6581,6587 ****
emit_barrier_after (start);
*pdest_bb = bb;
! make_edge (bb, EXIT_BLOCK_PTR, 0);
}
redirect_edge_and_branch_force (e, *pdest_bb);
}
--- 6599,6607 ----
emit_barrier_after (start);
*pdest_bb = bb;
! se = make_edge (bb, EXIT_BLOCK_PTR, 0);
! se->count = e->count;;
! se->probability = REG_BR_PROB_BASE;
}
redirect_edge_and_branch_force (e, *pdest_bb);
}
Index: cfgexpand.c
===================================================================
*** cfgexpand.c (revision 192080)
--- cfgexpand.c (working copy)
*************** expand_gimple_tailcall (basic_block bb,
*** 2313,2320 ****
}
e = make_edge (bb, EXIT_BLOCK_PTR, EDGE_ABNORMAL | EDGE_SIBCALL);
! e->probability += probability;
! e->count += count;
BB_END (bb) = last;
update_bb_for_insn (bb);
--- 2313,2320 ----
}
e = make_edge (bb, EXIT_BLOCK_PTR, EDGE_ABNORMAL | EDGE_SIBCALL);
! e->probability = probability;
! e->count = count;
BB_END (bb) = last;
update_bb_for_insn (bb);
Index: except.c
===================================================================
*** except.c (revision 192080)
--- except.c (working copy)
*************** dw2_build_landing_pads (void)
*** 988,993 ****
--- 988,995 ----
bb = emit_to_new_bb_before (seq, label_rtx (lp->post_landing_pad));
e = make_edge (bb, bb->next_bb, e_flags);
+ bb->count = bb->next_bb->count;
+ bb->frequency = bb->next_bb->frequency;
e->count = bb->count;
e->probability = REG_BR_PROB_BASE;
if (current_loops)
*************** sjlj_emit_dispatch_table (rtx dispatch_l
*** 1332,1337 ****
--- 1334,1341 ----
before = label_rtx (lp->post_landing_pad);
bb = emit_to_new_bb_before (seq2, before);
+ bb->count = bb->next_bb->count;
+ bb->frequency = bb->next_bb->frequency;
e = make_edge (bb, bb->next_bb, EDGE_FALLTHRU);
e->count = bb->count;
e->probability = REG_BR_PROB_BASE;
*************** sjlj_emit_dispatch_table (rtx dispatch_l
*** 1373,1378 ****
--- 1377,1384 ----
end_sequence ();
bb = emit_to_new_bb_before (seq, first_reachable_label);
+ bb->count = bb->next_bb->count;
+ bb->frequency = bb->next_bb->frequency;
if (num_dispatch == 1)
{
e = make_edge (bb, bb->next_bb, EDGE_FALLTHRU);