[Bug target/126629] New: SVE rdffr instruction wrongly CSEd
"ktkachov at gcc dot gnu.org via Gcc-bugs" <[email protected]> Tue, 04 Aug 2026 05:58:57 +0000
| Newsgroups | gmane.comp.gcc.bugs |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D126629
Bug ID: 126629
Summary: SVE rdffr instruction wrongly CSEd
Product: gcc
Version: 17.0
Status: UNCONFIRMED
Keywords: aarch64-sve, wrong-code
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: ktkachov at gcc dot gnu.org
Target Milestone: ---
Target: aarch64
Consider:
#include <arm_sve.h>
void
two_scans (unsigned char *p, unsigned char *q, unsigned long *r1,
unsigned long *r2, unsigned char *o1, unsigned char *o2)
{
svbool_t pt =3D svptrue_b8 ();
svsetffr ();
svuint8_t a =3D svldff1_u8 (pt, p);
unsigned long n1 =3D svcntp_b8 (pt, svrdffr ());
svsetffr ();
svuint8_t b =3D svldff1_u8 (pt, q);
unsigned long n2 =3D svcntp_b8 (pt, svrdffr ());
svst1_u8 (pt, o1, a);
svst1_u8 (pt, o2, b);
*r1 =3D n1;
*r2 =3D n2;
}
at -O3 -march=3Darmv9-a GCC generates:
two_scans:
setffr
ptrue p7.b, all
ldff1b z31.b, p7/z, [x0]
rdffr p15.b
cntp x0, p7, p15.b
setffr
ldff1b z30.b, p7/z, [x1]
st1b z31.b, p7, [x4]
st1b z30.b, p7, [x5]
str x0, [x2]
str x0, [x3]
ret
The second rdffr is CSE'd away, which is wrong as it should read the ffr st=
ate
from the second ldff1b. Clang keeps it:
two_scans:
ptrue p0.b
setffr
ldff1b { z0.b }, p0/z, [x0]
rdffr p1.b, p0/z
setffr
ldff1b { z1.b }, p0/z, [x1]
cntp x8, p0, p1.b
rdffr p2.b, p0/z
str z0, [x4]
str z1, [x5]
cntp x9, p0, p2.b
str x8, [x2]
str x9, [x3]
ret=