> I don't see how it is safe in a late pass when it is not safe in an

> earlier one.  Optimization is imperfect - we could fail to remove
> an "obvious" never taken exit and still have a loop that appears to be
> finite according to our definition.

Yes. it is. This is somewhat similar to strict-alias option/loop dep pragma.
Compiler tries to do something based on hint you tell it, but does not ensure 
correctness.

> The only way
> to define it would be if there was, at any point, an exit from the
> loop (and there it _may_ be exclude EH edges) then
> the loop is assumed to be finite.

No catch your point. If we treat an infinite loop as finite, it's bad because 
the loop might be removed.

Suppose we have a function:

    void foo(int bound)
     { for (int i = 0; i <= bound; i++); }

 In an early CD-DCE pass, "bound" is represented as a variable, and loop has a 
exit, so it is assumed to finite, and is removed.

But in a late pass, this function is inlined into another one, and "bound" has 
value of INT_MAX, this loop is infinite, and here we can know it should not be 
removed.

This is why I suggest doing the optimization as late as possible.

Feng

Reply via email to