[LLVMdev] how to eliminate dead infinite loops?

Chris Lattner clattner at apple.com
Sun Nov 28 12:12:21 PST 2010


On Nov 24, 2010, at 3:58 PM, Owen Anderson wrote:

> 
> On Nov 24, 2010, at 1:23 PM, Andrew Clinton wrote:
>> 
>> FYI, removing the ScalarEvolution conditional in the LoopDeletion code 
>> (and copying the algorithm to my own loop deletion pass) seems to 
>> correctly handle the elimination of infinite loops.  However I'd still 
>> like to find a way to do this with standard passes if possible.
> 
> There is no way to do this with the standard pass set, because removing an infinite loop is
> an invalid transformation.  John Regehr wrote a pretty good exposé about why it's illegal
> here: http://blog.regehr.org/archives/140

FWIW, this is currently a discussion in the C++ and C committees, and my understanding is that this has changed (or is changing soon) in the C'1x draft.  Assuming it happens, it will make it valid to assume that loops always terminate unless they are written with a condition that is an integer constant expression that folds to 1.

In addition to being able to delete noop loops that traverse over pointer-based data structures, this will also solve the:

  for (unsigned i = 0; i <= N; ++i)

class of problems.  I'm obviously strongly in favor of this, and I also think we should apply it to all C languages.  I don't see any reason for people to write infinite loops with non-trivial conditions.

-Chris



More information about the llvm-dev mailing list