[PATCH] D19178: Broaden FoldItoFPtoI to try and establish whether the integer value fits into the float type
Steve Canon via llvm-commits
llvm-commits at lists.llvm.org
Mon May 23 07:38:43 PDT 2016
scanon added inline comments.
================
Comment at: lib/Transforms/InstCombine/InstCombineCasts.cpp:1426
@@ -1424,1 +1425,3 @@
+// least significant set bits of abs(X) fits into the mantissa, and that the
+// number of trailing zeros fits into the exponent.
Instruction *InstCombiner::FoldItoFPtoI(Instruction &FI) {
----------------
aarzee wrote:
> scanon wrote:
> > A few things:
> >
> > 1. This:
> >
> > > and that the number of trailing zeros fits into the exponent
> >
> > is really confused. That's not how it [floating-point encoding] works at all. A correct algorithm for determining if an integer n can be exactly represented is (pseudocode):
> > ```
> > m = absoluteValue(n)
> > i = mostSignificantNonzeroBit(m)
> > j = leastSignificantNonzeroBit(m)
> > if (i - j < numberOfSignificandBits) {
> > // significand is representable, check exponent
> > if (i <= greatestFiniteExponent) {
> > // number can be exactly represented
> > }
> > }
> > // number cannot be exactly represented
> > ```
> > In particular, if we look at your example, `(2 ** 24 - 1) << 10`, this number absolutely is exactly representable in single-precision. We have:
> > ```
> > m = 2**24-1 << 10
> > i = 33
> > j = 10
> > i-j = 23 < numberOfSignificandBits = 24
> > i = 33 <= greatestFiniteExponent = 127.
> > ```
> >
> > 2. Please don't use the term "mantissa". It is frequently used, even in the LLVM sources, but it is subtly wrong (https://en.wikipedia.org/wiki/Significand#Use_of_.22mantissa.22). The correct term is "significand"; any new written code should use that instead.
> Shouldn't it be `j <= greatestFiniteExponent`? (I'm clearly not an expert here, so I just wanted to check).
No, it should be `i`. Normal binary floating-point numbers have the form +/- significand * 2^exponent, where significand is a number in [1,2). Thus, the MSB a representable integer is always 2^exponent.
http://reviews.llvm.org/D19178
More information about the llvm-commits
mailing list