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

--- Comment #16 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
;; _302 = .VEC_EXTRACT (mask__87.22_296, 0);

(insn 198 197 199 (set (reg:DI 332)
        (unspec:DI [
                (const_int 16 [0x10])
            ] UNSPEC_VLMAX)) -1
     (nil))

(insn 199 198 200 (set (reg:RVVMF2QI 331)
        (if_then_else:RVVMF2QI (unspec:RVVMF16BI [
                    (const_vector:RVVMF16BI [
                            (const_int 1 [0x1]) repeated x8
                        ])
                    (reg:DI 332)
                    (const_int 2 [0x2]) repeated x2
                    (const_int 1 [0x1])
                    (reg:SI 66 vl)
                    (reg:SI 67 vtype)
                ] UNSPEC_VPREDICATE)
            (const_vector:RVVMF2QI [
                    (const_int 0 [0]) repeated x8
                ])
            (unspec:RVVMF2QI [
                    (reg:DI 0 zero)
                ] UNSPEC_VUNDEF))) -1
     (expr_list:REG_EQUAL (const_vector:RVVMF2QI [
                (const_int 0 [0]) repeated x8
            ])
        (nil)))

// 0/undef

(insn 200 199 201 (set (reg:DI 333)
        (unspec:DI [
                (const_int 16 [0x10])
            ] UNSPEC_VLMAX)) -1
     (nil))

(insn 201 200 202 (set (reg:RVVMF2QI 331)
        (if_then_else:RVVMF2QI (unspec:RVVMF16BI [
                    (reg:DI 333)
                    (const_int 2 [0x2])
                    (const_int 1 [0x1])
                    (reg:SI 66 vl)
                    (reg:SI 67 vtype)
                ] UNSPEC_VPREDICATE)
            (vec_merge:RVVMF2QI (const_vector:RVVMF2QI [
                        (const_int 1 [0x1]) repeated x8
                    ])
                (reg:RVVMF2QI 331)
                (reg:RVVMF16BI 192 [ mask__87.22D.2859 ]))
            (unspec:RVVMF2QI [
                    (reg:DI 0 zero)
                ] UNSPEC_VUNDEF))) -1
     (nil))

// 1/merged in from the above
But that is wrong since we need -1/0.

(insn 202 201 203 (set (reg:QI 330)
        (unspec:QI [
                (vec_select:QI (reg:RVVMF2QI 331)
                    (parallel [
                            (const_int 0 [0])
                        ]))
                (reg:SI 67 vtype)
            ] UNSPEC_VPREDICATE)) -1
     (nil))
// And this is just a select.

(insn 203 202 0 (set (reg:DI 194 [ _302 ])
        (sign_extend:DI (reg:QI 330))) -1
     (nil))
// This sign extends from QI to DI so still 0/1.

So yes this is incorrect.
I still suspect vec_extract<mode>bi needs to extract to a sign extended to QI.
Or better yet leave it in bi mode somehow.

Reply via email to