From
0d094722ecdb86aa8373134a36392c60e6bb2b69 Mon Sep 17 00:00:00 2001
From: Kael Andrew Alonzo Franco <kaelfandrew@gmail.com>
Date: Sat, 13 Jun 2026 08:56:34 -0400
Subject: [PATCH] match: For nonnegative X, relax condition on X < (typeof X)(X != 0) to false [PR125756]
tree_expr_nonnegative_p covers both TYPE_UNSIGNED (type) or when X is known to be nonnegative.
Bootstrapped and tested on x86_64-pc-linux-gnu
PR tree-optimization/125756
gcc/ChangeLog:
* match.pd: Use tree_expr_nonnegative_p for X < (typeof X)(X != 0) to false.
gcc/testsuite/ChangeLog:
* gcc.dg/pr125756.c: New test.
(if (cmp == GT_EXPR)
(lt (view_convert:st @0) { build_zero_cst (st); })))))))))))
-/* unsigned < (typeof unsigned)(unsigned != 0) is always false. */
+/* For nonnegative x, x < (typeof x)(x != 0) is always false. */
(simplify
- (lt:c @0 (convert (ne @0 integer_zerop)))
- (if (TYPE_UNSIGNED (TREE_TYPE (@0)))
- { constant_boolean_node (false, type); }))
+ (lt:c @0 (convert (ne tree_expr_nonnegative_p@0 integer_zerop)))
+ { constant_boolean_node (false, type); })
/* x != (typeof x)(x == CST) -> CST == 0 ? 1 : (CST == 1 ? (x!=0&&x!=1) : x != 0) */
/* x != (typeof x)(x != CST) -> CST == 1 ? 1 : (CST == 0 ? (x!=0&&x!=1) : x != 1) */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+bool
+f1 (unsigned short aa)
+{
+ int a = aa;
+ bool t = a != 0;
+ int tu = t;
+ return a < tu;
+}
+
+bool
+f2 (unsigned short a)
+{
+ bool t = a != 0;
+ unsigned short tu = t;
+ return a < tu;
+}
+
+/* { dg-final { scan-tree-dump-times "return 0;" 2 "optimized" } } */