From 97222f3fc11f4e19a16c6e2d2447e8d4dcb3bc92 Mon Sep 17 00:00:00 2001
From: Matteo Nicoli <matteo.nicoli001@gmail.com>
Date: Fri, 22 Aug 2025 20:42:12 +0200
Subject: [PATCH] tree-optimization/121595 - the optimization fabs(a+0.0) ->
 fabs(a) should apply only for non trapping case

  * added a match expression
    -  gcc/match.pd
  * added tests
    -  gcc/testsuite/gcc.dg/fabs-plus-zero-1.c
    -  gcc/testsuite/gcc.dg/fabs-plus-zero-2.c

Signed-off-by: Matteo Nicoli <matteo.nicoli001@gmail.com>
Reviewed-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
---
 gcc/match.pd                            |  7 +++++++
 gcc/testsuite/gcc.dg/fabs-plus-zero-1.c |  9 +++++++++
 gcc/testsuite/gcc.dg/fabs-plus-zero-2.c | 10 ++++++++++
 3 files changed, 26 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/fabs-plus-zero-1.c
 create mode 100644 gcc/testsuite/gcc.dg/fabs-plus-zero-2.c

diff --git a/gcc/match.pd b/gcc/match.pd
index b1d7a3a1b73..cd2ddf5ee6e 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2045,6 +2045,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
  (abs (negate @0))
  (abs @0))
 
+/* fabs(x + 0.0) -> fabs(x), safe even with signed zeros when -fno-trapping-math.  */
+(for op (plus minus)
+ (simplify
+  (abs (op @0 real_zerop@1))
+  (if (!flag_trapping_math)
+   (abs @0))))
+
 (simplify
  (absu (negate @0))
  (absu @0))
diff --git a/gcc/testsuite/gcc.dg/fabs-plus-zero-1.c b/gcc/testsuite/gcc.dg/fabs-plus-zero-1.c
new file mode 100644
index 00000000000..c4a5a298334
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/fabs-plus-zero-1.c
@@ -0,0 +1,9 @@
+/* With trapping-math enabled (default behavior), GCC must preserve the +0.0 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+double f(double a)
+{
+  return __builtin_fabs(a + 0.0);
+}
+/* { dg-final { scan-tree-dump-times "\\+ 0\\.0" 1 "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/fabs-plus-zero-2.c b/gcc/testsuite/gcc.dg/fabs-plus-zero-2.c
new file mode 100644
index 00000000000..c8f78dfbc1b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/fabs-plus-zero-2.c
@@ -0,0 +1,10 @@
+/* With -fno-trapping-math it is safe to fold away +0.0  */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-trapping-math -fdump-tree-optimized" } */
+
+double f1(double a) { return __builtin_fabs(a + 0.0); }
+double f2(double a) { return __builtin_fabs(a + -0.0); }
+double f3(double a) { return __builtin_fabs(a - 0.0); }
+double f4(double a) { return __builtin_fabs(a - -0.0); }
+
+/* { dg-final { scan-tree-dump-not "\\+ 0\\.0" "optimized" } } */
-- 
2.39.5 (Apple Git-154)

