[PATCH] D19178: Broaden FoldItoFPtoI to try and establish whether the integer value fits into the float type
Carlos Liam via llvm-commits
llvm-commits at lists.llvm.org
Sun May 22 16:18:41 PDT 2016
aarzee 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) {
----------------
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).
http://reviews.llvm.org/D19178
More information about the llvm-commits
mailing list