https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119114
--- Comment #9 from Robin Dapp <rdapp at gcc dot gnu.org> --- I suspect the problem lies somewhere here: _11 = .VEC_EXTRACT (mask__83.22_110, 0); _23 = MEM[(short int *)&t + 20B]; _24 = _23 & _132; _25 = _24 != 0; _121 = (<signed-boolean:1>) _25; _157 = _11 ^ _121; For _121 = (<signed-boolean:1>) _25; we seem to be negating a 1 to a -1. Once the -1 is xor'ed with 1 the result is -2 instead of the expected 0. It's not the negation itself but rather the whole sequence leading to it.