https://gcc.gnu.org/bugzilla/show_bug.cgi?id=127433
Bug ID: 127433
Summary: wrong aligned info with mutual alignment peeling
caused segfault
Product: gcc
Version: 16.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: linkw at gcc dot gnu.org
Target Milestone: ---
This is likely a regression from r16-1624-g6deab186535a5a
command: -O3 -march=znver1 on x86-64, segfault since doing aligned vector load
on unaligned address.
------ test case -------
#include <cstdint>
#include <cstdio>
#include <cstring>
__attribute__((noinline))
unsigned lzham_style_compare(const uint8_t* pDict, unsigned pos, unsigned
insert_pos, unsigned max_match_len) {
const uint8_t* pComp = &pDict[pos];
const uint8_t* pIns = &pDict[insert_pos];
const uint64_t* pComp_end = reinterpret_cast<const uint64_t*>(pComp +
max_match_len - 7);
const uint64_t* pComp_cur = reinterpret_cast<const uint64_t*>(pComp);
const uint64_t* pIns_cur = reinterpret_cast<const uint64_t*>(pIns);
while (pComp_cur < pComp_end) {
if (*pComp_cur != *pIns_cur)
break;
pComp_cur++;
pIns_cur++;
}
return static_cast<unsigned>(reinterpret_cast<const uint8_t*>(pComp_cur) -
pComp);
}
int main() {
static uint8_t buf[8192];
for (int i = 0; i < 8192; i++) buf[i] = static_cast<uint8_t>(i * 13 + 7);
memset(buf + 161, 0, 300);
memset(buf + 97, 0, 300);
printf("buf_addr_mod32=%lu pos97_mod32=%lu pos161_mod32=%lu\n",
(unsigned long)((uintptr_t)buf & 31), (unsigned
long)((uintptr_t)(buf+97) & 31),
(unsigned long)((uintptr_t)(buf+161) & 31));
unsigned r = lzham_style_compare(buf, 97, 161, 256);
printf("match_len=%u\n", r);
return 0;
}