[LLVMdev] Floating-point range checks

Sanjay Patel spatel at rotateright.com
Thu Jan 8 11:32:40 PST 2015


http://llvm.org/bugs/show_bug.cgi?id=17713 shows another case where some
kind of FP value tracking would be useful.

gcc can transform this division into multiplication by reciprocal:

	if (y == 2.0) return x/y;



On Thu, Jan 8, 2015 at 12:02 PM, Hal Finkel <hfinkel at anl.gov> wrote:

> ----- Original Message -----
> > From: "Arch Robison" <arch.robison at intel.com>
> > To: "Philip Reames" <listmail at philipreames.com>, llvmdev at cs.uiuc.edu
> > Sent: Thursday, January 8, 2015 12:54:32 PM
> > Subject: Re: [LLVMdev] Floating-point range checks
> >
> >
> > Thanks for the pointers. Looks like LazyValueInfo has the sort of
> > infrastructure I had in mind. LVILatticeVal could be extended to
> > floating point. (The comment “this can be made a lot more rich in
> > the future” is an invitation :-). I’m thinking a simple lattice
> > would address most cases of interest for floating-point checks. The
> > lattice points for floating-point could be all subsets of the
> > eight-element set:
> >
> > {-inf,<0,-0,+0,>0,+inf,-nan,+nan},
> >
> > where <0 and >0 denote finite negative/positive numbers respectively.
> >
>
> I'm not sure. Checks against 1.0 are also common. Why not just add a FP
> range class, like our constant range, and go from there?
>
>  -Hal
>
> >
> >
> > - Arch
> >
> >
> >
> >
> >
> > From: Philip Reames [mailto:listmail at philipreames.com]
> > Sent: Wednesday, January 7, 2015 6:03 PM
> > To: Robison, Arch; llvmdev at cs.uiuc.edu
> > Subject: Re: [LLVMdev] Floating-point range checks
> >
> >
> >
> > I don't believe we have much in this area currently.
> >
> > Generally, something like this would existing in InstCombine and
> > ValueTracking.
> >
> > Take a look at ComputeSignBit in ValueTracking.cpp. This doesn't
> > apply (?) to floating point numbers, but we'd need something
> > equivalent for them. It looks like there may already be a start in
> > the form of:
> > CannotBeNegativeZero
> >
> > Other places to look would be SimplifyFAdd and
> > InstCombine::visitFAdd.
> >
> > For this particular example, you're probably going to want a pattern
> > in SimplifyFCmp of the form:
> > matcher: sqrt_call( fadd(Value(X), SpecificValue(X)), fadd(Value(Y),
> > SpecificValue(Y)))
> > && CannotBeNegativeZero(X) && CannotBeNegativeZero(Y)
> >
> > You might also look at LazyValueInfo, but that's probably of
> > secondary interest. It's purely in terms of constant integer ranges
> > currently.
> >
> > Philip
> >
> >
> >
> >
> >
> > On 01/07/2015 02:13 PM, Robison, Arch wrote:
> >
> >
> >
> >
> > The Julia language implements sqrt(x) with conditional branch taken
> > if x<0. Alas this prevents vectorization of loops with sqrt. Often
> > the argument can be proven to be non-negative. E.g., sqrt(x*x+y*y).
> > Is there an existing LLVM pass or analysis that does floating-point
> > range propagation to eliminate such unnecessary checks?
> >
> >
> >
> >
> >
> > Arch D. Robison
> >
> >
> > Intel Corporation
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > _______________________________________________ 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
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150108/b512bb4b/attachment.html>


More information about the llvm-dev mailing list