diff --git a/gcc/common.opt b/gcc/common.opt index 7fc075d354ae0d8a66156bbc190f4f4e0a8c9eab..a462330066a5cce7c47a92440e21e7a7072a7626 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2861,6 +2861,10 @@ ftree-loop-im Common Report Var(flag_tree_loop_im) Init(1) Optimization Enable loop invariant motion on trees. +flim-count-check +Common Report Var(flag_lim_count_check) Init(0) Optimization +Check bb count for not hoisting cold code to hotter bbs. + ftree-loop-linear Common Alias(floop-nest-optimize) Enable loop nest transforms. Same as -floop-nest-optimize. diff --git a/gcc/loop-invariant.c b/gcc/loop-invariant.c index 37ae6549e56fc2f898d85e2b0dea445567cbc539..613a41f5c53251f94260f28ac7d6f90164ffff77 100644 --- a/gcc/loop-invariant.c +++ b/gcc/loop-invariant.c @@ -1184,10 +1184,18 @@ find_invariants_insn (rtx_insn *insn, bool always_reached, bool always_executed) call. */ static void -find_invariants_bb (basic_block bb, bool always_reached, bool always_executed) +find_invariants_bb (struct loop *loop, basic_block bb, bool always_reached, + bool always_executed) { rtx_insn *insn; + basic_block preheader = loop_preheader_edge (loop)->src; + + if (flag_lim_count_check && preheader->count > bb->count) + { + return; + } + FOR_BB_INSNS (bb, insn) { if (!NONDEBUG_INSN_P (insn)) @@ -1215,7 +1223,7 @@ find_invariants_body (class loop *loop, basic_block *body, unsigned i; for (i = 0; i < loop->num_nodes; i++) - find_invariants_bb (body[i], + find_invariants_bb (loop, body[i], bitmap_bit_p (always_reached, i), bitmap_bit_p (always_executed, i)); }