From c11cc6a24a1f3e134126dc8bfff4bbff50a268bf Mon Sep 17 00:00:00 2001 From: benniaobufeijiushiji Date: Sun, 12 Jun 2022 23:12:07 +0800 Subject: [PATCH] [LIM] Optimize for loop invariant motion Don't move cold bb instructions to preheader in RTL reference [https://gcc.gnu.org/pipermail/gcc-patches/2021-December/586372.html] --- gcc/common.opt | 4 ++++ gcc/loop-invariant.c | 12 ++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index 7fc075d354a..a462330066a 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 37ae6549e56..613a41f5c53 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)); } -- Gitee