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