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

Jeffrey A. Law <law at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
           Assignee|rdapp.gcc at gmail dot com         |law at gcc dot gnu.org
                 CC|                            |majin at gcc dot gnu.org
   Last reconfirmed|                            |2025-07-07

--- Comment #1 from Jeffrey A. Law <law at gcc dot gnu.org> ---
So if I'm reading everything correctly, xtheadvector can't take a constant avl.
 We had this:

(set (reg:RVVM1DI 148)
    (unspec:RVVM1DI [
            (unspec:RVVMF64BI [
                    (const_vector:RVVMF64BI [
                            (const_int 1 [0x1]) repeated x2
                        ])
                    (reg:DI 149)
                    (const_int 2 [0x2]) repeated x2
                    (const_int 1 [0x1])
                    (reg:SI 66 vl)
                    (reg:SI 67 vtype)
                ] UNSPEC_VPREDICATE)
            (unspec:RVVM1DI [
                    (reg:DI 0 zero)
                ] UNSPEC_VUNDEF)
            (subreg:RVVM1DI (reg:RVVM1SI 144 [ _6 ]) 0)
            (reg:DI 150)
        ] UNSPEC_VSLIDEDOWN))

And we wanted to replace (reg:DI 149) with (const_int 2) resulting in:

(set (reg:RVVM1DI 148)
    (unspec:RVVM1DI [
            (unspec:RVVMF64BI [
                    (const_vector:RVVMF64BI [
                            (const_int 1 [0x1]) repeated x2
                        ])
                    (const_int 2 [0x2]) repeated x3
                    (const_int 1 [0x1])
                    (reg:SI 66 vl)
                    (reg:SI 67 vtype)
                ] UNSPEC_VPREDICATE)
            (unspec:RVVM1DI [
                    (reg:DI 0 zero)
                ] UNSPEC_VUNDEF)
            (subreg:RVVM1DI (reg:RVVM1SI 144 [ _6 ]) 0)
            (reg:DI 150)
        ] UNSPEC_VSLIDEDOWN))

Which doesn't match because the vector_length_operand predicate rejects nonzero
constants for XTHEADVECTOR.

I think the right fix here is to just guard the transformation in AVL
propagation like this:

```
diff --git a/gcc/config/riscv/riscv-avlprop.cc
b/gcc/config/riscv/riscv-avlprop.cc
index bb4aceb75064..3031c29ae63c 100644
--- a/gcc/config/riscv/riscv-avlprop.cc
+++ b/gcc/config/riscv/riscv-avlprop.cc
@@ -508,7 +508,7 @@ pass_avlprop::execute (function *fn)
       simplify_replace_vlmax_avl (rinsn, prop.second);
     }

-  if (rvv_vector_bits == RVV_VECTOR_BITS_ZVL)
+  if (rvv_vector_bits == RVV_VECTOR_BITS_ZVL && !TARGET_XTHEADVECTOR)
     {
       /* Simplify VLMAX AVL into immediate AVL.
         E.g. Simplify this following case:


```

But I've never really worked on theadvector.

Jin Ma -- any thoughts here?

Reply via email to