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

Hal Finkel hfinkel at anl.gov
Thu Aug 8 09:49:17 PDT 2013


----- Original Message -----
> 
> 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?

Perhaps only partially relevant, but I have a fast-math-only target-specific DAG combine in the PowerPC backend which replaces X/Y -> X*1/Y because we can use the fast reciprocal estimate + newton iteration for 1/Y instead of a full divide.

 -Hal

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

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-dev mailing list