On Mon, 13 Sep 2021, Xionghu Luo wrote: > > > On 2021/9/10 21:54, Xionghu Luo via Gcc-patches wrote: > > > > > > On 2021/9/9 18:55, Richard Biener wrote: > >> diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c > >> index 5d6845478e7..4b187c2cdaf 100644 > >> --- a/gcc/tree-ssa-loop-im.c > >> +++ b/gcc/tree-ssa-loop-im.c > >> @@ -3074,15 +3074,13 @@ fill_always_executed_in_1 (class loop *loop, > >> sbitmap contains_call) > >> break; > >> if (bb->loop_father->header == bb) > >> - { > >> - if (!dominated_by_p (CDI_DOMINATORS, loop->latch, bb)) > >> - break; > >> - > >> - /* In a loop that is always entered we may proceed anyway. > >> - But record that we entered it and stop once we leave it > >> - since it might not be finite. */ > >> - inn_loop = bb->loop_father; > >> - } > >> + /* Record that we enter into a subloop since it might not > >> + be finite. */ > >> + /* ??? Entering into a not always executed subloop makes > >> + fill_always_executed_in quadratic in loop depth since > >> + we walk those loops N times. This is not a problem > >> + in practice though, see PR102253 for a worst-case testcase. */ > >> + inn_loop = bb->loop_father; > > > > > > Yes your two patches extracted the get_loop_body_in_dom_order out and > > removed > > the inn_loop break logic when it doesn't dominate outer loop. Confirmed the > > replacement > > could improve for saving ~10% build time due to not full DOM walker and > > marked the previously > > ignored ALWAYS_EXECUTED bbs. > > But if we don't break for inner loop again, why still keep the *inn_loop* > > variable? > > It seems unnecessary and confusing, could we just remove it and restore the > > original > > infinte loop check in bb->succs for better understanding? > > > What's more, the refine of this fix is incorrect for PR78185. > > > commit 483e400870601f650c80f867ec781cd5f83507d6 > Author: Richard Biener <rguent...@suse.de> > Date: Thu Sep 2 10:47:35 2021 +0200 > > Refine fix for PR78185, improve LIM for code after inner loops > > This refines the fix for PR78185 after understanding that the code > regarding to the comment 'In a loop that is always entered we may > proceed anyway. But record that we entered it and stop once we leave > it.' was supposed to protect us from leaving possibly infinite inner > loops. The simpler fix of moving the misplaced stopping code > can then be refined to continue processing when the exited inner > loop is finite, improving invariant motion for cases like in the > added testcase. > > 2021-09-02 Richard Biener <rguent...@suse.de> > > * tree-ssa-loop-im.c (fill_always_executed_in_1): Refine > fix for PR78185 and continue processing when leaving > finite inner loops. > > * gcc.dg/tree-ssa/ssa-lim-16.c: New testcase. > > > 3<------- > | | > 6<--- | > | \ | | > | \ | | > 4 8 | > |--- | > | | | > 5 7------ > | > 1 > > loop 2 is an infinite loop, it is only ALWAYS_EXECUTED for loop 2, > but r12-3313-g483e40087 sets it ALWAYS_EXECUTED for loop 1. > We need to restore it like this: > https://gcc.gnu.org/pipermail/gcc-patches/2021-September/579195.html
I don't understand - BB6 is the header block of loop 2 which is always entered and thus BB6 is always executed at least once. The important part is that BB4 which follows the inner loop is _not_ always executed because we don't know if we will exit the inner loop. What am I missing? Richard.