On Wed, Jul 8, 2015 at 12:01 PM, Bin.Cheng <[email protected]> wrote:
> On Wed, Jul 8, 2015 at 5:58 PM, Bin.Cheng <[email protected]> wrote:
>> On Wed, Jul 8, 2015 at 5:51 PM, Richard Biener
>> <[email protected]> wrote:
>>> On Wed, Jul 8, 2015 at 8:52 AM, Bin.Cheng <[email protected]> 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