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

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Oh, and there is another case I'm worried about.  While match.pd has the
/* X == C (or X & Z == Y | C) is impossible if ~nonzero(X) & C != 0.  */
(for cmp (eq ne)
 (simplify
  (cmp:c (with_possible_nonzero_bits2 @0) (with_certain_nonzero_bits2 @1))
  (if (wi::bit_and_not (wi::to_wide (@1), get_nonzero_bits (@0)) != 0)
   { constant_boolean_node (cmp == NE_EXPR, type); })))
optimization, not sure if we can rely on that one happening always before this
one, and if it doesn't, e.g.
((x & 6) == 5) & ((x & 15) == 13)
where the precondition ((6 & 15) & 5) == ((6 & 15) & 13) is true we would
incorrectly transform it into (x & 15) == 13, even when it should be false.
So, shouldn't the precondition be (N&M)&CST1 == (N&M)&CST2 && (CST1&~N) == 0 &&
(CST2&~M) == 0?
Especially when get_nonzero_bits will not really do anything until ccp or other
optimization determines those.

Reply via email to