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