[LLVMdev] how to eliminate dead infinite loops?

Andrew Clinton andrew at sidefx.com
Thu Nov 25 09:59:23 PST 2010


On 11/24/2010 06:55 PM, Owen Anderson wrote:
> On Nov 23, 2010, at 9:22 AM, Andrew Clinton wrote:
>
>    
>> Most of my programs contain loops that the LoopDeletion pass is unable
>> to remove.  It appears that the following code in LoopDeletion.cpp:152
>> is the culprit:
>>
>>    ScalarEvolution&  SE = getAnalysis<ScalarEvolution>();
>>    const SCEV *S = SE.getMaxBackedgeTakenCount(L);
>>    if (isa<SCEVCouldNotCompute>(S))
>>      return Changed;
>>
>> So, LoopDeletion thinks my loops might be infinite so it does not delete
>> them - even if they do not write to any of the function return values.
>> Is there a way to flag a loop as non-infinite?  Or will I need to create
>> my own modified loop deletion pass that can eliminate potentially
>> infinite loops.  Is it correct just to remove the above code to allow
>> deletion of infinite loops?
>>      
> No.  Removing an infinite loop changes the semantics of the source program.
>
> The question you should be asking is: why can't ScalarEvolution determine that your loops are finite?
>
> --Owen
>    

That's a good question.  I think the reason that ScalarEvolution doesn't 
know the loop is finite is that the loop conditional depends on values 
that are only known at runtime, since I'm using external unbound 
functions as input to the loop's conditional branch.

So given that eliminating infinite loops is incorrect, I guess my 
question now would be what is the best way to let LLVM know that my loop 
is finite.  In this case, I think I have more information than LLVM - 
the functions that evaluate at runtime to determine the loop iteration 
count will eventually cause the loop to terminate, but I don't see any 
way to indicate to the optimizer that this is the case.

Andrew



More information about the llvm-dev mailing list