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

            Bug ID: 128332
           Summary: Neon-sve conversions for bool registers are not
                    optimized
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: denis.yaroshevskij at gmail dot com
  Target Milestone: ---

We can convert 16 byte registers between neon/sve but not booleans.

This code:

```
inline svbool_t   neon2sve(uint8x16_t m) { return
svcmpne(svptrue_pat_b8(SV_VL16), svset_neonq(svundef_u8(), m), 0); }

svbool_t roundtrip(svbool_t p) { return neon2sve(sve2neon(p)); }

svbool_t expected(svbool_t p)  { return svand_z(svptrue_pat_b8(SV_VL16), p, p);
}
```

Compiles to:

```
roundtrip(__SVBool_t):
        mov     z31.b, p0/z, #-1
        ptrue   p0.b, vl16
        cmpne   p0.b, p0/z, z31.b, #0
        ret
expected(__SVBool_t):
        ptrue   p3.b, vl16
        and     p0.b, p0/z, p3.b, p3.b
        ret
```

https://godbolt.org/z/515Kh5fEd

Reply via email to