[LLVMdev] Loop elimination with floating point counter.

Owen Anderson resistor at mac.com
Thu Jan 8 09:34:19 PST 2009


It's because with 1.0f, the loop index is simplified into an integer.   
With 1.2f, it isn't.  The loop deletion pass is dependent on the loop  
analyses being able to determine that the loop is finite, which they  
don't attempt to do for loops with floating point indices.  Attempting  
to do so would require additional reasoning about floating point  
precision issues.

--Owen

On Jan 8, 2009, at 9:22 AM, Syoyo Fujita wrote:

> Hi Devang,
>
> Thanks. Yes, in the case variable i incremented by 1.0f is optimized.
> I don't know why...
> Anyway, I've filed this problem into bugzilla(Bug 3299)
>
> --
> Syoyo
>
> On Fri, Jan 9, 2009 at 12:42 AM, Devang Patel <dpatel at apple.com>  
> wrote:
>>
>> On Jan 8, 2009, at 4:36 AM, Syoyo Fujita wrote:
>>
>>> Hi LLVM-ers,
>>>
>>> I'd like to eliminate dead loop with floating point counter using
>>> LLVM, but the following loop wasn't optimized by opt.
>>>
>>> void
>>> func() {
>>>   float i;
>>>   for (i = 0.0f; i < 1000.0f; i += 1.2f) {
>>>   }
>>> }
>>
>> FWIW, LLVM optimizer can eliminate this loop if i is incremented by  
>> 1.0f
>>
>> Pl. file a bugzilla report.
>> Thanks,
>> -
>> Devang
>>>
>>>
>>> $ clang -emit-llvm-bc floop.c
>>> $ opt -std-compile-opts floop.bc | llvm-dis
>>>
>>> define void @func(...) nounwind  {
>>> entry:
>>>      br label %forinc
>>>
>>> forinc:               ; preds = %forinc, %entry
>>>      %i.0.reg2mem.0 = phi float [ 0.000000e+00, %entry ], [ %add,  
>>> %forinc
>>> ]     ; <float> [#uses=1]
>>>      %add = add float %i.0.reg2mem.0,  
>>> 0x3FF3333340000000             ; <float>
>>> [#uses=2]
>>>      %cmp = fcmp olt float %add, 1.000000e+03                ;  
>>> <i1> [#uses=1]
>>>      br i1 %cmp, label %forinc, label %afterfor
>>>
>>> afterfor:             ; preds = %forinc
>>>      ret void
>>> }
>>>
>>> What I expected is just one instruction "ret void" in function  
>>> "func".
>>>
>>> Should I specify some specific optimizer pass for opt?
>>> If so, what is the right optimization pass to specify for opt to
>>> remove dead loop with floating point counter?
>>>
>>> I've tested some loop optimization pass, e.g. -licm, -loop-deletion,
>>> but nothing takes effect.
>>>
>>> FYI, gcc -O3 also can't optimize such a loop, but icc -O3 can.
>>>
>>> LLVM and clang used are recent version from svn.
>>>
>>> Thanks in advance.
>>>
>>> --
>>> Syoyo
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list