On Thu, Aug 3, 2023 at 4:58 AM Mikael Morin <morin-mik...@orange.fr> wrote:
>
> Hello,
>
> Le 31/07/2023 à 19:07, Andrew Pinski via Gcc-patches a écrit :
> > diff --git a/gcc/generic-match-head.cc b/gcc/generic-match-head.cc
> > index a71c0727b0b..ddaf22f2179 100644
> > --- a/gcc/generic-match-head.cc
> > +++ b/gcc/generic-match-head.cc
> > @@ -121,3 +121,45 @@ bitwise_equal_p (tree expr1, tree expr2)
> >       return wi::to_wide (expr1) == wi::to_wide (expr2);
> >     return operand_equal_p (expr1, expr2, 0);
> >   }
> > +
> > +/* Return true if EXPR1 and EXPR2 have the bitwise opposite value,
> > +   but not necessarily same type.
> > +   The types can differ through nop conversions.  */
> > +
> > +static inline bool
> > +bitwise_inverted_equal_p (tree expr1, tree expr2)
> > +{
> > +  STRIP_NOPS (expr1);
> > +  STRIP_NOPS (expr2);
> > +  if (expr1 == expr2)
> > +    return false;
> > +  if (!tree_nop_conversion_p (TREE_TYPE (expr1), TREE_TYPE (expr2)))
> > +    return false;
> > +  if (TREE_CODE (expr1) == INTEGER_CST && TREE_CODE (expr2) == INTEGER_CST)
> > +    return wi::to_wide (expr1) == ~wi::to_wide (expr2);
> > +  if (operand_equal_p (expr1, expr2, 0))
> > +    return false;
> > +  if (TREE_CODE (expr1) == BIT_NOT_EXPR
> > +      && bitwise_equal_p (TREE_OPERAND (expr1, 0), expr2))
> > +    return true;
> > +  if (TREE_CODE (expr2) == BIT_NOT_EXPR
> > +      && bitwise_equal_p (expr1, TREE_OPERAND (expr2, 0)))
> > +    return true;
> > +  if (COMPARISON_CLASS_P (expr1)
> > +      && COMPARISON_CLASS_P (expr2))
> > +    {
> > +      tree op10 = TREE_OPERAND (expr1, 0);
> > +      tree op20 = TREE_OPERAND (expr2, 0);
> > +      if (!operand_equal_p (op10, op20))
> > +     return false;
> > +      tree op11 = TREE_OPERAND (expr1, 1);
> > +      tree op21 = TREE_OPERAND (expr2, 1);
> > +      if (!operand_equal_p (op11, op21))
> > +     return false;
> > +      if (invert_tree_comparison (TREE_CODE (expr1),
> > +                               HONOR_NANS (op10))
> > +       == TREE_CODE (expr2))
> > +     return true;
>
> So this is trying to match a == b against a != b, or a < b against a >=
> b, or similar; correct?
> Shouldn't this be completed with "crossed" checks, that is match a == b
> against b != a, or a < b against b <= a, etc?  Or is there some
> canonicalization making that redundant?

There is some canonicalization that does happen so you don't need to
do the cross checking.
tree_swap_operands_p defines that order .
In that the lower ssa names are always first operands and constants
are always last.

Thanks,
Andrew


>
> I have given up determining whether these cases were already covered by
> the test or not.
>
> Mikael
>
>

Reply via email to