https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118662

--- Comment #10 from Uroš Bizjak <ubizjak at gmail dot com> ---
Before combine pass we have (_.297r.ud_dce):

(insn 7 4 9 2 (set (reg:V4QI 106 [ MEM <vector(4) signed char> [(type1
*)num_13(D)] ])
        (mem:V4QI (reg/v/f:DI 105 [ num ]) [0 MEM <vector(4) signed char>
[(type1 *)num_13(D)]+0 S4 A8])) "pr118662.c":9:39 1668 {*movv4qi_internal}
     (expr_list:REG_DEAD (reg/v/f:DI 105 [ num ])
        (nil)))
...
(insn 19 17 38 2 (set (reg:SI 116)
        (zero_extend:SI (vec_select:QI (reg:V4QI 106 [ MEM <vector(4) signed
char> [(type1 *)num_13(D)] ])
                (parallel [
                        (const_int 3 [0x3])
                    ])))) "pr118662.c":12:8 1990 {*pextrb_zext}
     (expr_list:REG_DEAD (reg:V4QI 106 [ MEM <vector(4) signed char> [(type1
*)num_13(D)] ])
        (nil)))

but combine changes this to (_.298r.combine):

(insn 9 7 10 2 (set (reg:V4SI 108 [ vect_patt_34.8_47 ])
        (sign_extend:V4SI (mem:V4QI (reg:DI 118) [0 MEM <vector(4) signed char>
[(type1 *)num_13(D)]+0 S4 A8]))) 7795 {*sse4_1_sign_extendv4qiv4si2_1}
     (expr_list:REG_DEAD (reg:DI 118)
        (nil)))
(insn 10 9 11 2 (set (reg:V4QI 106 [ MEM <vector(4) signed char> [(type1
*)num_13(D)] ])
        (subreg:V4QI (reg:V4SI 108 [ vect_patt_34.8_47 ]) 0)) 1668
{*movv4qi_internal}
     (nil))
...
(insn 19 17 38 2 (set (reg:SI 116)
        (zero_extend:SI (vec_select:QI (reg:V4QI 106 [ MEM <vector(4) signed
char> [(type1 *)num_13(D)] ])
                (parallel [
                        (const_int 3 [0x3])
                    ])))) "pr118662.c":12:8 1990 {*pextrb_zext}
     (expr_list:REG_DEAD (reg:V4QI 106 [ MEM <vector(4) signed char> [(type1
*)num_13(D)] ])
        (nil)))

It is not correct to make a V4QImode lowpart of V4SImode register that holds
SImode sign-extended original QImode values.

Reply via email to