From: Richard Biener Date: Fri, 16 Jun 2023 09:47:45 +0000 (+0200) Subject: tree-optimization/110278 - uns < (typeof uns)(uns != 0) is always false X-Git-Tag: basepoints/gcc-15~8256 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=69b04fe7445c88edafd6983e28353a158e4314b5;p=thirdparty%2Fgcc.git 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. --- 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