[LLVMdev] [RFC][Float2Int] Converting (fcmp Pred, x * F, y) to (ICmp ...)

Silviu Baranga Silviu.Baranga at arm.com
Wed Apr 29 10:06:43 PDT 2015


Hi,

 

I'm trying expand the Float2Int pass in order to make it able to optimize

expressions like f * x  > y, where x and y are integers (we'll assume
unsigned for

simplicity) and f is a floating point constant. The optimization would
convert

the expression to something like:

 

  (a * x)/b > y

 

where a and b are integers guessed by the compiler (currently using
continued

fractions, but some other method could also be used). The exact expression

would depend on the comparison type and on the type of input integers.

 

Note that dividing by an integer constant should be a cheap operation

compared to FP multiplication and comparison as this would get lowered to a

multiply+subtract+shift sequence (and should certainly be true on cores with
no

FP unit)

 

The change will add some machinery to Float2Int in order to be able to

match certain known patterns. All patterns will have exactly representable

inputs and outputs. In this case, the FCMP will have two inputs, x and y and

one output (the result of the comparison). This allows us to use the
existing

Float2Int infrastructure to track the integer length that would be required

for the conversion.

 

The main difficulty I can see with this is validating the transformation.
Ideally

the property that we want to prove for the guessed integers a and b would be

that (a*x)/b == round_to_zero(f * to_float(x)), for every integer x in a
given

range. The problem with this is that we would need to come up with a
reasonably

quick method of proving this.

 

My best guess (still need to work out the exact details) would be that we
only

need to check the first and last b numbers of the range. A hand-wavy
argument

for this would be that since errors increase on the extremities of the
range, so if

an error appears anywhere it must also appear  at the edges of the range.

I still need to prove this. If there are any floating-point experts that can
help

with this, I would greatly appreciate it.

 

Any other comments about the overall merits of the idea and the approach are

of course also welcome!

 

Thanks,

Silviu

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150429/dbf6769e/attachment.html>


More information about the llvm-dev mailing list