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;
}

Reply via email to