https://gcc.gnu.org/g:e8f4e91989f0b57463f1b726f94344ddbe2bb128

commit r17-3173-ge8f4e91989f0b57463f1b726f94344ddbe2bb128
Author: Kael Andrew Alonzo Franco <[email protected]>
Date:   Sun Aug 9 21:47:58 2026 -0400

    match: 1 / X -> X == 1 for positive X. [PR125735]
    
    TYPE_UNSIGNED (type) doesn't cover positive signed types
    so use tree_expr_nonnegative_p ().
    
    Bootstrapped and tested on x86_64-pc-linux-gnu.
    
            PR tree-optimization/125735
    
    gcc/ChangeLog:
    
            * match.pd: 1 / X -> X == 1 for positive X.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/pr125735.c: New test.
    
    Signed-off-by: Kael Andrew Franco <[email protected]>

Diff:
---
 gcc/match.pd                    |  7 ++++---
 gcc/testsuite/gcc.dg/pr125735.c | 11 +++++++++++
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/gcc/match.pd b/gcc/match.pd
index efaf0026711c..cccb607a622c 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -628,8 +628,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        && TYPE_UNSIGNED (type))
    (trunc_divmod @0 @1))))
 
-/* 1 / X -> X == 1 for unsigned integer X.
-   1 / X -> X >= -1 && X <= 1 ? X : 0 for signed integer X.
+/* 1 / X -> X == 1 for positive integer X.
+   1 / X -> X >= -1 && X <= 1 ? X : 0 for when X could be negative.
    But not for 1 / 0 so that we can get proper warnings and errors,
    and not for 1-bit integers as they are edge cases better handled
    elsewhere.  Delay the conversion of the signed division until late
@@ -640,7 +640,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
       && TYPE_PRECISION (type) > 1
       && !integer_zerop (@1)
       && (!flag_non_call_exceptions || tree_expr_nonzero_p (@1)))
-  (if (TYPE_UNSIGNED (type))
+  (if (TYPE_UNSIGNED (type)
+       || tree_expr_nonnegative_p (@1))
    (convert (eq:boolean_type_node @1 @0))
    (if (fold_before_rtl_expansion_p ())
     (with { tree utype = unsigned_type_for (type); }
diff --git a/gcc/testsuite/gcc.dg/pr125735.c b/gcc/testsuite/gcc.dg/pr125735.c
new file mode 100644
index 000000000000..b94d95c0de76
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr125735.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+_Bool
+one_div_positive (int b)
+{
+  if (b < 1) return 0;
+  return (1 / b);
+}
+
+/* { dg-final { scan-tree-dump "b_\[0-9\]+.D. == 1" "optimized" } } */

Reply via email to