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 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. > Thanks, > bin