diff options
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 24b06b9..6add040 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -6390,9 +6390,9 @@ bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region) */ bool -gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNUSED, - basic_block *region ATTRIBUTE_UNUSED, unsigned n_region ATTRIBUTE_UNUSED, - basic_block *region_copy ATTRIBUTE_UNUSED) +gimple_duplicate_sese_tail (edge entry, edge exit, + basic_block *region, unsigned n_region, + basic_block *region_copy) { unsigned i; bool free_region_copy = false; @@ -6502,7 +6502,12 @@ gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNU sorig = single_succ_edge (switch_bb); sorig->flags = exits[1]->flags; + sorig->probability = exits[1]->probability; + sorig->count = exits[1]->count; snew = make_edge (switch_bb, nentry_bb, exits[0]->flags); + snew->probability = exits[0]->probability; + snew->count = exits[1]->count; + /* Register the new edge from SWITCH_BB in loop exit lists. */ rescan_loop_exit (snew, true, false); @@ -8704,9 +8709,11 @@ make_pass_split_crit_edges (gcc::context *ctxt) /* Insert COND expression which is GIMPLE_COND after STMT in basic block BB with appropriate basic block split and creation of a new conditionally executed basic block. + Update profile so the new bb is visited with probability PROB. Return created basic block. */ basic_block -insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond) +insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond, + profile_probability prob) { edge fall = split_block (bb, stmt); gimple_stmt_iterator iter = gsi_last_bb (bb); @@ -8721,11 +8728,17 @@ insert_cond_bb (basic_block bb, gimple *stmt, gimple *cond) /* Create conditionally executed block. */ new_bb = create_empty_bb (bb); - make_edge (bb, new_bb, EDGE_TRUE_VALUE); + edge e = make_edge (bb, new_bb, EDGE_TRUE_VALUE); + e->probability = prob; + e->count = bb->count.apply_probability (prob); + new_bb->count = e->count; + new_bb->frequency = prob.apply (bb->frequency); make_single_succ_edge (new_bb, fall->dest, EDGE_FALLTHRU); /* Fix edge for split bb. */ fall->flags = EDGE_FALSE_VALUE; + fall->count -= e->count; + fall->probability -= e->probability; /* Update dominance info. */ if (dom_info_available_p (CDI_DOMINATORS)) |