https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106327
Bug ID: 106327
Summary: side-effect-free _x variance not optimized to
unpredicated instruction
Product: gcc
Version: 12.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: yyc1992 at gmail dot com
Target Milestone: ---
Related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106326 .
According to the Arm C Language Extension for SVE, when the _x predicate is
used,
> The compiler can then pick whichever form of instruction seems to give the
> best code. This includes using unpredicated instructions, where available and
> suitable
Because of this, I'm expecting the following to be optimized to a single add
instruction, as if a `svptrue_b64()` predicate is used.
```
svfloat64_t add(svfloat64_t a, svfloat64_t b)
{
auto und_ok = svcmpge(svptrue_b64(), a, b);
return svadd_x(und_ok, a, b);
}
```
However, gcc compiles this as _m and generates
```
ptrue p0.b, all
fcmge p0.d, p0/z, z0.d, z1.d
fadd z0.d, p0/m, z0.d, z1.d
```
In general, is there any reason not to treat an `add_x` (also other
side-effect-free functions) with an unknown predicate as unpredicated one?