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