https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122431
--- Comment #7 from Segher Boessenkool <segher at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #4)
> On the gimple the Canonical form is:
> ```
> _6 = b_2(D) ^ c_3(D);
> _7 = a_1(D) & _6;
> _4 = c_3(D) ^ _7;
> ```
>
> Isel or some other method should turn it into:
> ```
> _6 = a_1(D) & b_2(D);
> _7 = .BIT_ANDN (c_3(D), a_1(D));
> _t = _6 | _7;
> ```
>
> When BIT_ANDN optab exists.
Yes. But in RTL
(ior (and (reg) (ci))
(not (and (reg) (ci))))
is the canonical form (it is simpler) (never mind that it also makes sense
at all, where the xor thing doesn't.
So it should have been fixed during expand.