https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112740
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|target |middle-end --- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Oh it is not the ~ but rather `_3 = {_16};` which produces the wrong code: // <signed-boolean:128> _16; // vector(1) <signed-boolean:128> _3; ;; _3 = {_16}; (insn 36 35 37 (set (reg:TI 114) (reg:TI 102 [ _16 ])) "/app/example.cpp":15:6 -1 (nil)) (insn 37 36 38 (set (subreg:DI (reg:TI 113) 0) (and:DI (subreg:DI (reg:TI 114) 0) (const_int 1 [0x1]))) "/app/example.cpp":15:6 -1 (nil)) (insn 38 37 39 (set (reg:DI 115) (const_int 0 [0])) "/app/example.cpp":15:6 -1 (nil)) (insn 39 38 40 (set (subreg:DI (reg:TI 113) 8) (and:DI (subreg:DI (reg:TI 114) 8) (reg:DI 115))) "/app/example.cpp":15:6 -1 (nil)) (insn 40 39 0 (set (reg:TI 94 [ _3 ]) (reg:TI 113)) "/app/example.cpp":15:6 -1 (nil)) That is wrong. that is producing 1 in _3 when it should have been -1 . That is it is doing `r94 = r102 & 0x1` which is totally wrong/broken ...