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

            Bug ID: 113613
           Summary: [14 Regression] Missing ldp/stp optimization sometimes
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pinskia at gcc dot gnu.org
                CC: acoplan at gcc dot gnu.org
  Target Milestone: ---
            Target: aarch64-*-*

Take:
```
typedef float __attribute__((vector_size(8))) v2sf;
v2sf a[4];
v2sf b[4];
void f()
{
  b[0] += a[0];
  b[1] += a[1];
}

```

With -O3 on the trunk we get:
```
f:
        adrp    x1, .LANCHOR0
        add     x0, x1, :lo12:.LANCHOR0
        ldr     d31, [x1, #:lo12:.LANCHOR0]
        ldr     d30, [x0, 32]
        fadd    v30.2s, v31.2s, v30.2s
        ldr     d31, [x0, 8]
        str     d30, [x1, #:lo12:.LANCHOR0]
        ldr     d30, [x0, 40]
        fadd    v30.2s, v31.2s, v30.2s
        str     d30, [x0, 8]
        ret
```

But in GCC 13 we got:
```
f:
        adrp    x1, .LANCHOR0
        add     x0, x1, :lo12:.LANCHOR0
        ldp     d1, d0, [x0]
        ldp     d3, d2, [x0, 32]
        fadd    v1.2s, v1.2s, v3.2s
        fadd    v0.2s, v0.2s, v2.2s
        stp     d1, d0, [x0]
        ret
```

Reply via email to