https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105903

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Assignee|unassigned at gcc dot gnu.org      |pinskia at gcc dot 
gnu.org
             Status|NEW                         |ASSIGNED
         Depends on|                            |96923

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to luoxhu from comment #2)
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 4a570894b2e..f6b5415a351 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -5718,6 +5718,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>       (bit_xor (convert (rshift @0 {shifter;})) @1)
>       (bit_not (bit_xor (convert (rshift @0 {shifter;})) @1)))))))
> 
> +/* X >= Y ? X > Y : 0 into X > Y. */
> +(simplify
> +  (cond (ge @0 @1) (gt @0 @1) integer_zerop)
> +   (if (INTEGRAL_TYPE_P (type)
> +       && POINTER_TYPE_P (TREE_TYPE (@0))
> +       && POINTER_TYPE_P (TREE_TYPE (@1)))
> +    (gt @0 @1)))
> +
> +/* X < Y ? 0 : X > Y into X > Y.  */
> +(simplify
> +  (cond (lt @0 @1) integer_zerop (gt @0 @1))
> +   (if (INTEGRAL_TYPE_P (type)
> +       && POINTER_TYPE_P (TREE_TYPE (@0))
> +       && POINTER_TYPE_P (TREE_TYPE (@1)))
> +    (gt @0 @1)))
> +

Hmm, could be simplified to just:
+#if GIMPLE
+/* a ? b : c -> (a & b) | (!a & c) for truth (boolean) values
+   Only if either b or c are integer constants. */
+(simplify
+ (cond @0 truth_valued_p@1 truth_valued_p@2)
+ (if (TREE_CODE (@1) == INTEGER_CST
+      || TREE_CODE (@2) == INTEGER_CST)
+  (with {
+       tree booltrue = constant_boolean_node (true, type);
+     }
+   (bit_ior (bit_and (convert @0) @1) (bit_and (bit_xor (convert @0) {
booltrue; }) @2)))))
+#endif

Which is PR 96923 so mine.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96923
[Bug 96923] Failure to optimize a select-related bool pattern to or+not

Reply via email to