Yet another compiler bug [?]

Revision en5, by Xiaohuba, 2024-09-18 18:04:57

UPD: I've reduced the code size.

I've recently found that the following code will generate wrong output.

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

Compiled with -O3 -mtune=skylake -march=skylake, the code outputs 0.

However if you simulate the code you will know that the correct answer should be 1.

Note that the compiler seems to generate wrong sse instruction.

Godbolt link

Again, I believe this code is ub-free, and has nothing to do with implementation-defined stuff.

Tags compiler bug

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en5 English Xiaohuba 2024-09-18 18:04:57 326
en4 English Xiaohuba 2024-09-18 11:15:23 2 Tiny change: 'on.\n\n[Goldbot link](ht' -> 'on.\n\n[Godbolt link](ht'
en3 English Xiaohuba 2024-09-18 11:13:49 0 (published)
en2 English Xiaohuba 2024-09-18 11:11:54 174
en1 English Xiaohuba 2024-09-18 11:10:09 847 Initial revision (saved to drafts)