This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix edge probabilities of loop guards
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jan Hubicka <jh at suse dot de>
- Date: Thu, 5 Jul 2012 13:17:04 +0200 (CEST)
- Subject: [PATCH] Fix edge probabilities of loop guards
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 <rguenther@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;
}