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

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
This is the match.pd code:
(for bitop (bit_and bit_ior)
 (for cmp (tcc_comparison)
  (for ocmp (tcc_comparison)
   (for ncmp (tcc_comparison)
    (simplify
     (bitop (cmp:c @0 @1) (ocmp @0 @1))
     (with {
#if GIMPLE
        location_t loc = UNKNOWN_LOCATION;
#endif
        tree t = combine_comparisons (loc,
                                      bitop == BIT_IOR_EXPR
                                       ? TRUTH_ORIF_EXPR : TRUTH_ANDIF_EXPR,
                                      cmp, ocmp,
                                      type, @0, @1);
      }
      (switch
       (if (GENERIC && t)
        {t;})
       (if (t && CONSTANT_CLASS_P (t))
        {t;})
       (if (t && TREE_CODE (t) == ncmp
            /* Even though combine_comparisons should
               return this, this is to double check. */
            && operand_equal_p (TREE_OPERAND (t, 0), @0)
            && operand_equal_p (TREE_OPERAND (t, 1), @1))
        (ncmp @0 @1)
       )
      )
     )
    )
   )
  )
 )
)

I am not a fan of it though, I think we should change combine_comparisons to
return the comparison code or true/false or error out.
The loc is due to combine_comparisons building the tree rather than match. The
same is true of the whole checking of the result. I am going to test this fully
and see if there is anything I need to change (there might be some testcases
which need to be "improved").

Also the whole ncmp for loop is still another issue which is a genmatch change
to allow a non-name to be there but that is so so much harder to fix and there
is already a case like that too.

Reply via email to