[LLVMdev] Convert fdiv - X/Y -> X*1/Y

Reed Kotler rkotler at mips.com
Thu Aug 8 14:35:44 PDT 2013


Seems incorrect but I forget the IEEE fp rules.

What if both x and y are infinity?

in that case x/y = NAN but you transformation will yield 0 as the result.

On 08/08/2013 09:25 AM, Chad Rosier wrote:
> I would like to transform X/Y -> X*1/Y.  Specifically, I would like to
> convert:
>
> define void @t1a(double %a, double %b, double %d) {
> entry:
>    %div = fdiv fast double %a, %d
>    %div1 = fdiv fast double %b, %d
>    %call = tail call i32 @foo(double %div, double %div1)
>    ret void
> }
>
> to:
>
> define void @t1b(double %a, double %b, double %d) {
> entry:
>    %div = fdiv fast double 1.000000e+00, %d
>    %mul = fmul fast double %div, %a
>    %mul1 = fmul fast double %div, %b
>    %call = tail call i32 @foo(double %mul, double %mul1)
>    ret void
> }
>
> Is such a transformation best done as a (target-specific) DAG combine?
>
> A similar instcombine already exists for the X/C->X*1/C case (see the
> CvtFDivConstToReciprocal function in InstCombineMlDivRem.cpp), but I
> don't believe the above can be done as an instcombine as it creates a
> new instruction (in addition to replacing the original).  Also, I only
> want to perform the transformation if there are multiple uses of 1/Y
> (like in my test case).  Otherwise, the transformation replaces a fdiv
> with a fdiv+fmul pair, which I doubt would be profitable.
>
> FWIW, I'm also pretty sure this combine requires -fast-math.
>
> Can someone point me in the right direction?
>
>   Thanks,
>    Chad
>
>
> _______________________________________________
> 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