Message ID | 20170913150021.GA23582@arm.com |
---|---|
State | New |
Headers | show |
Series | [AArch64] Restrict lrint inlining on ILP32. | expand |
Ping?
Ping. Any objections to the patch?
On Wed, Sep 13, 2017 at 04:00:24PM +0100, Tamar Christina wrote: > Hi All, > > The inlining of lrint isn't valid in all cases on ILP32 when > -fno-math-errno is used because an inexact exception is raised in > certain circumstances. > > Instead the restriction is placed such that the integer mode has to > be larger or equal to the float mode in addition to either inexacts being > allowed or not caring about trapping math. > > This prevents the overflow, and the inexact errors that may arise. > > Unfortunately I can't create a test for this as there is a bug where > the pattern is always passed DI as the smallest mode, > and later takes a sub-reg of it to SI. This would prevent an overflow > where one was expected. > > This fixed PR/81800. > > Regtested on aarch64-none-linux-gnu and no regressions. > > Ok for trunk? OK. Reviewed By James Greenhalgh <james.greenhalgh@arm.com> Thanks, James > > Thanks, > > PR target/81800 > * config/aarch64/aarch64.md (lrint<GPF:mode><GPI:mode>2): Add flag_trapping_math > and flag_fp_int_builtin_inexact. > > gcc/testsuite/ > 2017-09-13 Tamar Christina <tamar.christina@arm.com> > > * gcc.target/aarch64/inline-lrint_2.c (dg-options): Add -fno-trapping-math. > > --
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 64b60a903ed7c0090298989333894442a277ccd4..1efc56dd40de8ab1f6ee1b743b804f0c3ed887b2 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -5122,7 +5122,9 @@ (define_expand "lrint<GPF:mode><GPI:mode>2" [(match_operand:GPI 0 "register_operand") (match_operand:GPF 1 "register_operand")] - "TARGET_FLOAT" + "TARGET_FLOAT + && ((GET_MODE_SIZE (<GPF:MODE>mode) <= GET_MODE_SIZE (<GPI:MODE>mode)) + || !flag_trapping_math || flag_fp_int_builtin_inexact)" { rtx cvt = gen_reg_rtx (<GPF:MODE>mode); emit_insn (gen_rint<GPF:mode>2 (cvt, operands[1])); diff --git a/gcc/testsuite/gcc.target/aarch64/inline-lrint_2.c b/gcc/testsuite/gcc.target/aarch64/inline-lrint_2.c index 6080e186d8f0c6f5ede81c6438e059e8b976378f..bd0c73c8d34a2cb52d0a453a175bedd59bba5457 100644 --- a/gcc/testsuite/gcc.target/aarch64/inline-lrint_2.c +++ b/gcc/testsuite/gcc.target/aarch64/inline-lrint_2.c @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-effective-target ilp32 } */ -/* { dg-options "-O3 -fno-math-errno" } */ +/* { dg-options "-O3 -fno-math-errno -fno-trapping-math" } */ #include "lrint-matherr.h"