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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
           Assignee|unassigned at gcc dot gnu.org      |pinskia at gcc dot 
gnu.org
   Last reconfirmed|                            |2023-12-25
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Actually the following list is correct:
signed
X s< ~X   -->     X s< 0
X s<= ~X  -->     X s< ~X  --> X s< 0

X s> ~X   -->     X s> 0
X s>= ~X  -->     X s> ~X  --> X s> 0

unsigned:
X u< ~X   -->                  X u> SIGNBIT_OF(X)
X u<= ~X  -->     X u< ~X  --> X u> SIGNBIT_OF(X)

X u> ~X   -->                  X u< SIGNBIT_OF(X)
X u>= ~X  -->    ~X u> X   --> X u< SIGNBIT_OF(X)

So the correct idea is this:
(for (cmp  lt le gt ge)
     (rcmp gt gt lt lt)
 (simplify
  (cmp @0 @1)
  (with { bool wascmp; }
   (if (bitwise_inverted_equal_p (@0, @1, wascmp)
        && (!wascmp || element_precision (type) == 1))
   (with {
     tree inner_type = TREE_TYPE (@0);
     int precision = TYPE_PRECISION (inner_type);
     // the min value here is in the opposite signedness.
     auto ncst = wi::min_value (precision, TYPE_UNSIGNED (inner_type) ? SIGNED
: UNSIGNED);
    }
    (rcmp @0 { wide_int_to_tree (inner_type, ncst); })
  )
 )
)

Reply via email to