This fixes edge probabilities of loop guards the vectorizer inserts for prologue/epilogue peeling. Formerly we'd end up with
prolog_loop_niters.72_165 = D.2000_146 & 1; if (prolog_loop_niters.72_165 == 0) goto <bb 7>; else goto <bb 4>; # SUCC: 4 [100.0%] (false) 7 (true) which is bogus and yields a distorted basic-block ordering. The following changes it to prolog_loop_niters.72_165 = D.2000_146 & 1; if (prolog_loop_niters.72_165 == 0) goto <bb 7>; else goto <bb 4>; # SUCC: 4 [50.0%] (false) 7 [50.0%] (true) which in this case is perfectly reasonable (in the case of, say, D.2000_146 & 3 we could compute a more precise distribution, but at this point this information is not available). I'll give this a round of testing. Honza, does this look reasonable? Thanks, Richard. 2012-07-05 Richard Guenther <rguent...@suse.de> * tree-vect-loop-manip.c (slpeel_add_loop_guard): Update edge probabilities. Index: gcc/tree-vect-loop-manip.c =================================================================== *** gcc/tree-vect-loop-manip.c (revision 189284) --- gcc/tree-vect-loop-manip.c (working copy) *************** slpeel_add_loop_guard (basic_block guard *** 954,959 **** --- 954,962 ---- /* Add new edge to connect guard block to the merge/loop-exit block. */ new_e = make_edge (guard_bb, exit_bb, EDGE_TRUE_VALUE); set_immediate_dominator (CDI_DOMINATORS, exit_bb, dom_bb); + /* Mark the outcome of the guard as equally likely. */ + enter_e->probability = REG_BR_PROB_BASE / 2; + new_e->probability = REG_BR_PROB_BASE / 2; return new_e; }