https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116765
Bug ID: 116765 Summary: gcc generate wrong code with -O3 -march=skylake Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: xiaohuba2021 at 163 dot com Target Milestone: --- The following code is miscompiled with -O3 -march=skylake: ``` #include <bitset> #include <iostream> const int N = 105; std::bitset<N> ok[N][N]; int n = 5; int main() { ok[2][2].set(2); for (int i = n; i; i--) for (int j = i; j <= n; j++) { ok[i][j] = ok[i][j] | ok[i + 1][j] | ok[i][j - 1]; } std::cout << ok[2][5][2] << '\n'; return 0; } ``` It outputs 0, however (obviously) the correct answer should be 1. Turning off O3 or march=skylake gives the right output. gcc version: ``` COLLECT_GCC=/opt/compiler-explorer/gcc-snapshot/bin/g++ Target: x86_64-linux-gnu Configured with: ../gcc-trunk-20240918/configure --prefix=/opt/compiler-explorer/gcc-build/staging --enable-libstdcxx-backtrace=yes --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-bootstrap --enable-multiarch --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --enable-clocale=gnu --enable-languages=c,c++,fortran,ada,objc,obj-c++,go,d,rust,m2 --enable-ld=yes --enable-gold=yes --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-linker-build-id --enable-lto --enable-plugins --enable-threads=posix --with-pkgversion=Compiler-Explorer-Build-gcc-38b5a568f8738c16baa978a62a9e983a85b4c6f0-binutils-2.42 Thread model: posix Supported LTO compression algorithms: zlib gcc version 15.0.0 20240918 (experimental) (Compiler-Explorer-Build-gcc-38b5a568f8738c16baa978a62a9e983a85b4c6f0-binutils-2.42) ```