aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-02-05 10:52:19 +0100
committerJakub Jelinek <jakub@redhat.com>2022-02-05 10:53:54 +0100
commitb3763384a1f696260f3ee7bda8c0e7e4ad732ad9 (patch)
treefebcce6fffe8b8fa9fac9d643ba784416217f0b9
parentaffdeda16ef7fbd34f850443fe63bb407714297e (diff)
downloadgcc-b3763384a1f696260f3ee7bda8c0e7e4ad732ad9.zip
gcc-b3763384a1f696260f3ee7bda8c0e7e4ad732ad9.tar.gz
gcc-b3763384a1f696260f3ee7bda8c0e7e4ad732ad9.tar.bz2
match.pd: Fix x * 0.0 -> 0.0 folding [PR104389]
The recent PR95115 change to punt in const_binop on folding operation with non-NaN operands into NaN if flag_trapping_math broke the following testcase, because the x * 0.0 simplification punts just if x maybe a NaN (because NaN * 0.0 is NaN not 0.0) or if one of the operands could be negative zero. But Inf * 0.0 or -Inf * 0.0 is also NaN, not 0.0, so when NaNs are honored we need to punt for possible infinities too. 2022-02-05 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/104389 * match.pd (x * 0 -> 0): Punt if x maybe infinite and NaNs are honored. * gcc.dg/pr104389.c: New test.
-rw-r--r--gcc/match.pd4
-rw-r--r--gcc/testsuite/gcc.dg/pr104389.c26
2 files changed, 29 insertions, 1 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 10ff867..7bbb801 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -256,10 +256,12 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
/* Maybe fold x * 0 to 0. The expressions aren't the same
when x is NaN, since x * 0 is also NaN. Nor are they the
same in modes with signed zeros, since multiplying a
- negative value by 0 gives -0, not +0. */
+ negative value by 0 gives -0, not +0. Nor when x is +-Inf,
+ since x * 0 is NaN. */
(simplify
(mult @0 real_zerop@1)
(if (!tree_expr_maybe_nan_p (@0)
+ && (!HONOR_NANS (type) || !tree_expr_maybe_infinite_p (@0))
&& !tree_expr_maybe_real_minus_zero_p (@0)
&& !tree_expr_maybe_real_minus_zero_p (@1))
@1))
diff --git a/gcc/testsuite/gcc.dg/pr104389.c b/gcc/testsuite/gcc.dg/pr104389.c
new file mode 100644
index 0000000..0c6c85a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr104389.c
@@ -0,0 +1,26 @@
+/* PR tree-optimization/104389 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-add-options ieee } */
+/* { dg-require-effective-target inf } */
+
+__attribute__((noipa)) double
+foo (void)
+{
+ double a = __builtin_huge_val ();
+ return a * 0.0;
+}
+
+__attribute__((noipa)) long double
+bar (void)
+{
+ return __builtin_huge_vall () * 0.0L;
+}
+
+int
+main ()
+{
+ if (!__builtin_isnan (foo ()) || !__builtin_isnanl (bar ()))
+ __builtin_abort ();
+ return 0;
+}