Issue 145206
Summary program generates incorrect outputs at -O2 -ftree-vectorize -mhvx -mv60
Labels new issue
Assignees
Reporter androm3da
    This C++ program below gets the wrong results when built with `-mhvx -mv60 -static -ftree-vectorize -O2`.  The expected result is `checksum = FEFB7E9` but we see `checksum = 22C90031` instead.

```
$ ~/src/toolchain_for_hexagon/clang+llvm-20.1.5-cross-hexagon-unknown-linux-musl/x86_64-linux-gnu/bin/hexagon-unknown-linux-musl-clang++ -mhvx -mv60 -static -ftree-vectorize -O2 -o prog ./cs_prog.ii -w

$ ~/src/toolchain_for_hexagon/clang+llvm-20.1.5-cross-hexagon-unknown-linux-musl/x86_64-linux-gnu/bin/qemu-hexagon ./prog
checksum = 22C90031

$ clang++ -O2 -o prog -ftree-vectorize -mavx2 -msse4 cs_prog.ii
cs_prog.ii:2:42: warning: ISO C++11 does not allow conversion from string literal to 'char *' [-Wwritable-strings]
void platform_main_end(int crc) { printf("checksum = %X\n", crc); }
 ^
cs_prog.ii:4:21: warning: implicit conversion from 'long' to 'int' changes value from 4294967295 to -1 [-Wconstant-conversion]
int crc32_context = 4294967295, main_i, main_j;
 ~~~~~~~~~~~~~   ^~~~~~~~~~
2 warnings generated.

$ ./prog
checksum = FEFB7E9

```
 
```
$ cat cs_prog.ii
extern "C" int printf(char *...);
void platform_main_end(int crc) { printf("checksum = %X\n", crc); }
int crc32_tab[256];
int crc32_context = 4294967295, main_i, main_j;
void crc32_byte(char b) {
  crc32_context =
      crc32_context >> 8 & 16777215 ^ crc32_tab[(crc32_context ^ b) & 255];
}
void transparent_crc(long val) {
  {
    crc32_context =
        crc32_context >> 8 & 16777215 ^ crc32_tab[(crc32_context ^ val) & 255];
  }
  crc32_byte(val >> 8);
 crc32_byte(val >> 16);
  crc32_byte(val >> 24);
  {
    crc32_context =
 crc32_context >> 8 & 16777215 ^ crc32_tab[crc32_context & 255];
 crc32_context =
        crc32_context >> 8 & 16777215 ^ crc32_tab[crc32_context & 255];
    crc32_context =
        crc32_context >> 8 & 16777215 ^ crc32_tab[crc32_context & 255];
    crc32_context =
 crc32_context >> 8 & 16777215 ^ crc32_tab[crc32_context & 255];
 }
}
unsigned main_crc;
int main() {
  main_i = 0;
  for (; main_i < 256; main_i++) {
    main_crc = main_i;
    main_j = 8;
    for (; main_j; main_j--)
      if (main_crc & 1)
        main_crc = main_crc >> 1 ^ 3988292384;
      else
        main_crc >>= 1;
    crc32_tab[main_i] = main_crc;
  }
  transparent_crc(1);
  transparent_crc(4172852816);
 transparent_crc(65535);
  transparent_crc(264466405);
 platform_main_end(crc32_context ^ 4294967295);
}

```


_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to