https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90323
--- Comment #10 from Segher Boessenkool <segher at gcc dot gnu.org> --- You cannot fix a simplify-rtx problem in much earlier passes! It may be useful of course (I have no idea, I don't know gimple well enough), but it is no solution to the problem at all. The xor/and/xor thing should be simplified to something proper. ((A^B)&C)^A = (A&~C)^(B&C) = (A&~C)|(B&C) This should already be done by the expand pass. At gimple level the logical complement is counted as an operation, making the contorted xor/and/xor form the best form to use, but in a system that considers more than just operation counts (like in RTL) this is not the best form at all. But, anyway, RTL simplification should be able to do this. Similar problems happen all over the place, fwiw -- see the various rl* tests for rs6000, for example.