[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=