https://gcc.gnu.org/g:9e24eda38e9a6a6c64f80dd56737224bfd4619de

commit r17-384-g9e24eda38e9a6a6c64f80dd56737224bfd4619de
Author: Pengxuan Zheng <[email protected]>
Date:   Thu May 7 09:18:02 2026 -0700

    match: Restrict "min|max(a+|-c,b+|-c)" folding to integral types [PR125214]
    
    The original patch adding the "min|max(a+|-c,b+|-c) -> min|max(a,b)+|-c" 
pattern
    missed integral type checks and caused some powerpc tests to fail.
    
            PR tree-optimization/125214
    
    gcc/ChangeLog:
    
            * match.pd (min|max(a+|-c,b+|-c)): Add integral type check.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/tree-ssa/pr125214.c: New test.
    
    Signed-off-by: Pengxuan Zheng <[email protected]>

Diff:
---
 gcc/match.pd                             |  6 ++++--
 gcc/testsuite/gcc.dg/tree-ssa/pr125214.c | 13 +++++++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index 1a7d820779f4..04faffb760d1 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5010,7 +5010,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (for minmax (min max)
  (simplify
   (minmax:c (plus:cs @0 @2) (plus:s @1 @2))
-   (if (TYPE_OVERFLOW_UNDEFINED (type)
+   (if (INTEGRAL_TYPE_P (type)
+       && TYPE_OVERFLOW_UNDEFINED (type)
        && !TYPE_OVERFLOW_SANITIZED (type))
     (plus (minmax @0 @1) @2))))
 
@@ -5018,7 +5019,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (for minmax (min max)
  (simplify
   (minmax:c (minus:s @0 @2) (minus:s @1 @2))
-   (if (TYPE_OVERFLOW_UNDEFINED (type)
+   (if (INTEGRAL_TYPE_P (type)
+       && TYPE_OVERFLOW_UNDEFINED (type)
        && !TYPE_OVERFLOW_SANITIZED (type))
     (minus (minmax @0 @1) @2))))
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr125214.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr125214.c
new file mode 100644
index 000000000000..8101f70ea855
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr125214.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast -fdump-tree-forwprop1-raw" } */
+
+/* "min|max(a+|-c,b+|-c) -> min|max(a,b)+|-c" folding should NOT happen for
+   non-integral types.  */
+
+double
+f (double a, double b, double c)
+{
+  return __builtin_fmax (a + c, b + c);
+}
+
+/* { dg-final { scan-tree-dump-times "plus_expr" 2 "forwprop1" } } */

Reply via email to