Bug 115347 - [12/13/14/15 Regression] wrong code at -O3 on x86_64-linux-gnu since r12-2097
Summary: [12/13/14/15 Regression] wrong code at -O3 on x86_64-linux-gnu since r12-2097
Status: ASSIGNED
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 14.1.1
: P2 normal
Target Milestone: 12.5
Assignee: Richard Biener
URL:
Keywords: wrong-code
Depends on:
Blocks:
 
Reported: 2024-06-04 19:13 UTC by Zhendong Su
Modified: 2024-11-04 09:01 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2024-11-03 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Zhendong Su 2024-06-04 19:13:21 UTC
It appears to be a regression from 11.*, affecting 12.* and later.

Compiler Explorer: https://godbolt.org/z/PY985hnff

[510] % gcctk -v
Using built-in specs.
COLLECT_GCC=gcctk
COLLECT_LTO_WRAPPER=/local/suz-local/software/local/gcc-trunk/libexec/gcc/x86_64-pc-linux-gnu/15.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++ --disable-werror --enable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 15.0.0 20240604 (experimental) (GCC) 
[511] % 
[511] % gcctk -O2 small.c; ./a.out
[512] % gcctk -O3 small.c
[513] % ./a.out
Aborted
[514] % cat small.c
struct a {
  int b;
  int c;
} d, e[2];
int f, g, h;
int main() {
  for (; f < 1; f++) {
    for (h = 0; h < 2; h++) {
      d = e[f];
      g = e[1].c;
      e[f].c = 1;
    }
  }
  if (d.c != 1)
    __builtin_abort();
  return 0;
}
Comment 1 Andrew Pinski 2024-06-04 20:09:06 UTC
Confirmed.
Comment 2 Richard Biener 2024-06-05 07:06:48 UTC
it's loop distribution doing

t2.c:7:12: optimized: Loop nest 1 distributed: split to 2 loops and 0 library calls.

We get

  for (; f < 1; f++) {
    for (h = 0; h < 2; h++) {
      d = e[f];
    }
  }
  for (; f < 1; f++) {
    for (h = 0; h < 2; h++) {
      g = e[1].c;
      e[f].c = 1;
    }
  }

I think this is similar to the other still open issue where zero-distance
inner loop dependences (&e[f].c doesnt't vary in the inner loop) cause
issues with the interpretation of classical dependence analysis.

I'm somewhat lost there.  PR112859.
Comment 3 Jakub Jelinek 2024-06-17 11:36:39 UTC
Started with r12-2097-g9f34b780b0461ec7b2b2defe96e44ab616ea2aa3
Comment 4 Richard Biener 2024-06-20 09:15:45 UTC
GCC 12.4 is being released, retargeting bugs to GCC 12.5.
Comment 5 Richard Biener 2024-09-19 13:22:13 UTC
So this maybe needs "add_inner_distances" as we have add_outer_distances?  We
still get only ( 0 0 ) as zero distance.
Comment 6 Richard Biener 2024-11-04 09:01:55 UTC
As the "duplicate" is mine, so is this.  But don't hold your breath - I do not actually understand how dependence analysis should work here.