From 69b04fe7445c88edafd6983e28353a158e4314b5 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 16 Jun 2023 11:47:45 +0200 Subject: [PATCH] tree-optimization/110278 - uns < (typeof uns)(uns != 0) is always false The following adds two patterns simplifying comparisons, uns < (typeof uns)(uns != 0) is always false and x != (typeof x)(x == 0) is always true. PR tree-optimization/110278 * match.pd (uns < (typeof uns)(uns != 0) -> false): New. (x != (typeof x)(x == 0) -> true): Likewise. --- gcc/match.pd | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gcc/match.pd b/gcc/match.pd index b7baad6bf1bd..2dd238260346 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6410,6 +6410,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (cmp == GT_EXPR) (lt (view_convert:st @0) { build_zero_cst (st); }))))))))))) +/* unsigned < (typeof unsigned)(unsigned != 0) is always false. */ +(simplify + (lt:c @0 (convert (ne @0 integer_zerop))) + (if (TYPE_UNSIGNED (TREE_TYPE (@0))) + { constant_boolean_node (false, type); })) + +/* x != (typeof x)(x == 0) is always true. */ +(simplify + (ne:c @0 (convert (eq @0 integer_zerop))) + { constant_boolean_node (true, type); }) + (for cmp (unordered ordered unlt unle ungt unge uneq ltgt) /* If the second operand is NaN, the result is constant. */ (simplify -- 2.47.2