[LLVMdev] how to eliminate dead infinite loops?

Duncan Sands baldrick at free.fr
Mon Nov 29 00:30:55 PST 2010


Hi Chris,

>>> 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.

the C++/C standards are not relevant to other languages, such as Ada.

> 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.

Also not relevant to Ada!

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.

Do you have a suggestion for how best to enable this optimization for some
languages and disable it for others?

Ciao,

Duncan.



More information about the llvm-dev mailing list