https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95906
--- Comment #10 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #8) > cmp_8 = -_2; > _3 = cmp_8 & a_6(D); > We convert that into: > _2 * a_6(D); > > And then have: > _11 = _2 + -1; > _5 = b_7(D) & _11; > > This could be convert into: > (_11 ^ 1) * b_7(D) > > ``` > (simplify > (bit_and:c (convert? (plus zero_one_valued_p@0 integer_all_onesp)) @1) > (if (INTEGRAL_TYPE_P (type) > && INTEGRAL_TYPE_P (TREE_TYPE (@0)) > && TREE_CODE (TREE_TYPE (@0)) != BOOLEAN_TYPE > /* Sign extending of the neg or a truncation of the neg > is needed. */ > && (!TYPE_UNSIGNED (TREE_TYPE (@0)) > || TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (@0)))) > (mult (convert (bit_xor @0 { build_one_cst (TREE_TYPE (@0)); })) @1)) > ``` Which is what PR 110949 is asking for.