https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81162
Bug ID: 81162 Summary: UBSAN switch triggers incorrect optimization Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: babokin at gmail dot com Target Milestone: --- gcc trunk rev249427, x86_64 In presence of -fsanitize=undefined optimisations (-O2) produce wrong code. > cat f.cpp #include <stdio.h> short s; int i1 = 1; int i2 = 1; unsigned char uc = 147; int main() { s = (-uc + 2147483647) << 0; if (9031239389974324562ULL >= (-((i1 && i2) + uc) ^ -21096) ) { printf("OK\n"); } else { printf("FAIL\n"); } return 0; } > g++ -std=c++11 -fsanitize=undefined -O0 f.cpp -o out > ./out OK > g++ -std=c++11 -fsanitize=undefined -O2 f.cpp -o out > ./out FAIL