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

            Bug ID: 127070
           Summary: wrong code at -O3 on x86_64-linux-gnu (generated code
                    hangs)
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhendong.su at inf dot ethz.ch
  Target Milestone: ---

Compiler Explorer: https://godbolt.org/z/149fG7szr

Note:
- fails: 16.2 and trunk
- works: 16.1 and earlier

[621] % gcctk -v
Using built-in specs.
COLLECT_GCC=gcctk
COLLECT_LTO_WRAPPER=/local/home/suz/suz-local/software/local/gcc-trunk/bin/../libexec/gcc/x86_64-pc-linux-gnu/17.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-trunk/configure --disable-bootstrap
--enable-checking=yes --prefix=/local/suz-local/software/local/gcc-trunk
--enable-sanitizers --enable-languages=c,c++,lto --disable-werror
--disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 17.0.0 20260825 (experimental) [master r17-1628-gd1c12591336] (GCC) 
[622] % 
[622] % gcctk -O2 small.c; ./a.out
[623] % 
[623] % gcctk -O3 small.c
[624] % timeout -s 9 5 ./a.out
Killed
[625] % cat small.c
int k, u, x = -56, aa, ab, ac, ad;
long o, r, s, t, w, ae, af;
short p, q, v, *ag;
__attribute__((noinline)) int al(int am, int an) {
  static int f[256];
  for (int g = 0; g < 256; ++g) {
    unsigned c = g;
    for (int h = 0; h < 8; ++h)
      c = c & 1 ? c >> 1 ^ 3988292384 : c >> 1;
    f[g] = c;
  }
  unsigned i = am;
  int j = an;
  for (int b = 0; b < 4; ++b) {
    char a = j;
    j >>= 8;
    i = i >> 8 ^ f[(i ^ a) & 255];
  }
  return i;
}
__attribute__((noinline)) int ao(long p1, long p2, short p3, int p4, long p5) {
  al(0, 0);
  return 0;
}
int ap(int, short);
int aq(signed char, short, signed char, signed char, short);
void ar(long am, int an) {
  char z, d = 81;
  z = 4;
  short *e;
  long l = 0;
  int m, n;
  e = &v;
  if (an)
  ah:
    goto ai;
ai:
  s = s % 3037000493;
  l = l % 3037000493 * s % 3037000493 * q % 3037000493 + t;
  ao(l, p, 0, 0, 0);
  v = p;
  if (*e <= 0)
    goto aj;
  goto ak;
aj:
  m = (long)d << 44 >> 44;
  u = 1 ^ m;
  n = 81 ^ m;
  u = u & n;
  ap(u, 0);
  if (o) {
  ak:
    r = 7 * an;
    z = v;
    *e = 2047;
    d = -v;
    if (am)
      goto ah;
    p = v;
  }
  al(0, d);
  al(0, z);
  al(0, 0);
}
__attribute__((noinline)) int ap(int am, short p) {
  short y, as;
  while (1) {
    y = am ^ x;
    as = -56 ^ y;
    x = aq(-128, as, -111, 15, -1408) - 765563752;
    if (536870884 - 536870941 + ~x == -2)
      break;
  }
  return 0;
}
int aq(signed char am, short an, signed char at, signed char au, short av) {
  short aw, ax, ay;
  ax = 0;
  while (1) {
    ag = &aw;
    *ag = 17279 - (32767 | ax);
    af = -536854912 + ((long)((unsigned long)aw << 48) >> 48);
    if (0 < ax)
      break;
    ae = -1641331 + aw;
    ax = aw - 16559;
    for (int g = 0; g < 4; ++g)
      k |= (1616 >> g * 8 & 255) << (3 - g) * 8;
  }
  aa = k + 1;
  ab = al(0, (long)((unsigned long)aw << 48) >> 48);
  ab = al(ab, 0);
  ab = al(ab, ax);
  ab = al(ab, af);
  ab = al(ab, ae);
  ab = al(ab, aa);
  ab = al(ab, (long)((unsigned long)am << 56) >> 56);
  ab = al(ab, an);
  ab = al(ab, (long)((unsigned long)at << 56) >> 56);
  ab = al(ab, au);
  ab = al(ab, (long)((unsigned long)av << 52) >> 52);
  ay = *ag;
  ab = al(ab, (long)((unsigned long)ay << 48) >> 48);
  ab = al(ab, 0);
  return ab;
}
int main() {
  ad = al(ad, w);
  int az = ac + 80309;
  ar(0, az);
  return 0;
}

Reply via email to