On Wed, Jul 8, 2015 at 12:01 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Wed, Jul 8, 2015 at 5:58 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: >> On Wed, Jul 8, 2015 at 5:51 PM, Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Wed, Jul 8, 2015 at 8:52 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: >>>> Hi, >>>> Function fill_always_executed_in_1 computes basic blocks' always >>>> executed information, and it has below code and comment: >>>> >>>> /* In a loop that is always entered we may proceed anyway. >>>> But record that we entered it and stop once we leave it. */ >>>> inn_loop = bb->loop_father; >>>> >>>> Then in following iterations, it breaks the loop if basic block not >>>> belonging to the inner loop is encountered. This means basic blocks >>>> after inner loop won't have always executed information computed, even >>>> they dominates the original loop's latch. >>>> >>>> Am I missing something? Why is that? >>> >>> To improve here it would need to verify that all exits of the inner loop >>> exit to the same BB of the outer loop and that no exit skips any blocks >>> in the outer loop. Like for >> But we are working on dominating tree anyway. Won't dominating latch be >> enough?
Hmm, yes. >> Thanks, >> bin >>> >>> for (;;) >>> { >>> for (;;) { if (x) goto skip; if (y) break } >>> foo(); >>> skip: >>> } >>> >>> so it is just a simple and conservative algorithm it seems. It's also >>> quadratic in the number of BBs of the outermost loop. > What we need to do is check if inner loop's exit goes to basic block > not belonging to outer loop? Doesn't FOR_EACH_EDGE (e, ei, bb->succs) if (!flow_bb_inside_loop_p (loop, e->dest)) break; if (e) break; catch this? Richard. > Thanks, > bin