[llvm-dev] Default FPENV state
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Wed Jun 14 08:18:05 PDT 2017
On 06/14/2017 10:08 AM, Sanjay Patel wrote:
> Let's make sure we're looking at the same example. The x86 instruction
> that I think we're discussing is cmpps/cmppd with constant predicate
> TRUE_UQ (0xF), FALSE_OQ (0xB), etc.
>
> The expected output for cases including NaN inputs is shown by the
> program in PR28110:
> https://bugs.llvm.org/show_bug.cgi?id=28110
>
> Based on the Intel documentation and the experimental data, the output
> value (ignoring exceptions) is never affected by the input value. It
> doesn't matter if we have NaN input, we should still produce a
> constant with -1 elements, so I don't think we need any relaxed-mode
> FP flags for this transform.
Sounds good. In that case, I agree.
-Hal
>
> Here's a simpler test program:
>
> #include <immintrin.h>
> #include <math.h>
> #include <stdio.h>
> #include <string.h>
>
> __m128 get_all_ones(__m128 a, __m128 b) {
> return _mm_cmp_ps(a, b, 15);
> }
>
> int main() {
> int elts[4];
>
> __m128 nan = (__m128) _mm_set1_ps(nanf(""));
> memcpy(elts, &nan, 16);
> printf("4 nans as hex: %x %x %x %x\n", elts[0], elts[1], elts[2],
> elts[3]);
>
> // The params to cmpps with pred #15 should not matter - it always
> returns all ones.
> // In this case one param is a nan.
> __m128 ones = get_all_ones(nan, _mm_set1_ps(42.0));
> memcpy(elts, &ones, 16);
> printf("expecting 4 all ones: %x %x %x %x\n", elts[0], elts[1],
> elts[2], elts[3]);
>
> // The params to cmpps with pred #15 should not matter - it always
> returns all ones.
> // In this case both params are nan.
> __m128 more_ones = get_all_ones(nan, nan);
> memcpy(elts, &more_ones, 16);
> printf("expecting 4 all ones: %x %x %x %x\n", elts[0], elts[1],
> elts[2], elts[3]);
> return 0;
> }
>
> $ clang cmptrue.c -mavx -O1
> $ ./a.out
> 4 nans as hex: 7fc00000 7fc00000 7fc00000 7fc00000
> expecting 4 all ones: ffffffff ffffffff ffffffff ffffffff
> expecting 4 all ones: ffffffff ffffffff ffffffff ffffffff
>
>
> On Wed, Jun 14, 2017 at 7:34 AM, Hal Finkel <hfinkel at anl.gov
> <mailto:hfinkel at anl.gov>> wrote:
>
> Hi, Dinar,
>
> You should assume that FPU exceptions are not enabled. LLVM does
> not (currently) support them. That having been said, in this
> particular case, the output is also different if a NaN is produced
> (i.e. it produces a NaN and not a -1), and so I'd think you can
> only do this transformations when the call has the nnan flag (e.g.
> because the code was compiled with -ffinite-math-only).
>
> -Hal
>
>
> On 06/14/2017 05:06 AM, Dinar Temirbulatov wrote:
>
> Hi,
> We are interesting in expanding some vector operations
> directly in the
> IR form as constants https://reviews.llvm.org/D33406
> <https://reviews.llvm.org/D33406>,
> for example: _mm256_cmp_ps("any input", "any input", _CMP_TRUE_UQ)
> should produce -1, -1, -1, ... vector, but for some values for
> example
> "1.00 -nan" if FPU exceptions were enabled this operation
> triggers the
> exception. Here is the question: Should we assume that FPENV was
> initialized with FE_ALL_EXCEPT by default or we could rely for
> example
> on "-fno-trapping-math" flag or we could completely ignore the FPU
> exception issue(see https://bugs.llvm.org/show_bug.cgi?id=6050
> <https://bugs.llvm.org/show_bug.cgi?id=6050>)?
>
> Thanks, Dinar.
>
>
> --
> Hal Finkel
> Lead, Compiler Technology and Programming Languages
> Leadership Computing Facility
> Argonne National Laboratory
>
>
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170614/3c7075fa/attachment.html>
More information about the llvm-dev
mailing list