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 ...

Reply via email to