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

            Bug ID: 124072
           Summary: [16 Regression] AArch64 armv9-a+sve: wrong code at -O3
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: xxs_chy at outlook dot com
  Target Milestone: ---

Reproducer: https://godbolt.org/z/bMYY43z54
Testcase:
#include <stdint.h>
#include <stdio.h>
#define BS_VEC(type, num) type __attribute__((vector_size(num * sizeof(type))))
uint64_t BS_CHECKSUM;
void backsmith_checksum_4(uint64_t BS_ARG_5)
{
    uint8_t arr1[72] = {};
    BS_VEC(uint16_t, 2) arr2[20] = {};
    for (uint32_t i = 0; i < 63; i += 1)
    {
        uint8_t a = arr1[arr1[i] < 72 ? arr1[i] : 0];
        BS_VEC(uint16_t, 2)
        b = __builtin_convertvector((BS_VEC(uint32_t, 2)){ i },
                                    BS_VEC(uint16_t, 2));
        BS_VEC(uint16_t, 2)
        c = __builtin_convertvector((BS_VEC(uint64_t, 2)){ BS_ARG_5 },
                                    BS_VEC(uint16_t, 2));
        BS_VEC(uint16_t, 2) d = 0 < (BS_VEC(uint16_t, 2)){ c[0], b[1] ?: c[1]
};
        BS_VEC(uint16_t, 2) e = { a, a };
        BS_VEC(uint16_t, 2) f = { d[0], d[1] };
        BS_VEC(uint16_t, 2) g = { e[0] ? f[0] : 7, e[1] ? f[1] : 0 };
        arr2[i / 32] -= (BS_VEC(uint16_t, 2)){ g[0] ?: b[0], g[1] };
    }
    BS_CHECKSUM = arr2[0][0];
}
int main()
{
    backsmith_checksum_4(0);
    printf("BackSmith Checksum = 0x%016llx\n", BS_CHECKSUM);
}

Commands:
> aarch64-unknown-linux-musl-gcc -O3 -march=armv9-a+sve -static a.c && 
> qemu-aarch64
> BackSmith Checksum = 0x000000000000fe10

> aarch64-unknown-linux-musl-gcc -O0 -march=armv9-a+sve -static a.c && 
> qemu-aarch64
> BackSmith Checksum = 0x000000000000ff20

Reply via email to