> 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