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

--- Comment #18 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Robin Dapp from comment #17)
> > No you got it wrong.
> > _121 will either be -1 or 0. _11 should be -1 or 0 too.
> > So the question is what was the VEC_EXTRACT doing the right thing? Is it
> > 0/-1 or 0/1? 
> 
> I literally mentioned VEC_EXTRACT in the message directly below as well as
> specified that it's the sequence, not the negate...  But thanks for
> confirming.
> 
> And we are creating the vector to extract from directly in the expander so a
> sign extend won't help.  We'd need to
> 
>   rtx ones = gen_const_vec_duplicate (qimode, GEN_INT (-1));
> 
> in the BI expander.  But that breaks pr114668.c.  Need to think about it
> some more.

This is why I mentioned that maybe vec_extract<mode>bi's setting operand maybe
should be a BI subreg of QI. So you still get 0/1 in the QI and then that will
be sign extended (or zero extended) by the middle-end.

Something like:
```
diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md
index 92e6942b523..c484e9f3c70 100644
--- a/gcc/config/riscv/autovec.md
+++ b/gcc/config/riscv/autovec.md
@@ -1451,14 +1451,16 @@ (define_expand "vec_extract<mode>qi"

 ;; Same for a BImode but still return a QImode.
 (define_expand "vec_extract<mode>bi"
-  [(set (match_operand:QI        0 "register_operand")
-     (vec_select:QI
+  [(set (match_operand:BI        0 "register_operand")
+     (vec_select:BI
        (match_operand:VB_VLS     1 "register_operand")
        (parallel
         [(match_operand          2 "nonmemory_operand")])))]
   "TARGET_VECTOR"
 {
-  emit_insn (gen_vec_extract<mode>qi (operands[0], operands[1], operands[2]));
+  rtl qir = gen_reg (QImode);
+  emit_insn (gen_vec_extract<mode>qi (qir, operands[1], operands[2]));
+  emit_move_insn (operands[0], gen_lowpart (BImode, qir));
   DONE;
 })

```

Note I didn't try this at all and I am not 100% sure BImode will work as a
subreg of QImode though.

Reply via email to