https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88156
Bug ID: 88156 Summary: ftree-vrp elides sign condition on mingw Product: gcc Version: 8.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: xantares09 at hotmail dot com Target Milestone: --- Using mingw/gcc 8.2.0, at O2 level, ftree-vrp seems to elide the if(h<0) condition in the following example: #include <iostream> int string_hash(const wchar_t* data) { int h = 0; if (!data){ return 0; } while (*data != 0) { h = (h * 7) ^ *data; ++data; } if (h < 0) { h = -h; } return h; } int main(int argc, char *argv[]) { int hash = string_hash(L"PROBABILIT"); std::cout << "hash= "<<hash<<std::endl; return 0; } $ x86_64-w64-mingw32-g++ -O2 main.cxx $ x86_64-w64-mingw32-wine ./a.exe hash= -730059684 If I disable ftree-vrp it goes fine: $ x86_64-w64-mingw32-g++ -O2 -fno-tree-vrp main.cxx $ x86_64-w64-mingw32-wine ./a.exe hash= 730059684 It's correct too on native gcc: $ g++ -O2 main.cxx $ ./a.out hash= 730059684 $ x86_64-w64-mingw32-g++ -v Using built-in specs. COLLECT_GCC=x86_64-w64-mingw32-g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/8.2.0/lto-wrapper Target: x86_64-w64-mingw32 Configured with: /home/xantares/.cache/aurman/mingw-w64-gcc/src/gcc/configure --prefix=/usr --libexecdir=/usr/lib --target=x86_64-w64-mingw32 --enable-languages=c,lto,c++,objc,obj-c++,fortran,ada --enable-shared --enable-static --enable-threads=posix --enable-fully-dynamic-string --enable-libstdcxx-time=yes --with-system-zlib --enable-cloog-backend=isl --enable-lto --disable-dw2-exceptions --enable-libgomp --disable-multilib --enable-checking=release Thread model: posix gcc version 8.2.0 (GCC)