https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81423
Bug ID: 81423 Summary: Wrong code at -O2 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, rev250140, x86_64. Test case has no undefined behavior, but -O2 produces incorrect result. > cat f.cpp #include <iostream> unsigned long long int ll = 0; unsigned long long int ull1 = 1ULL; unsigned long long int ull2 = 12008284144813806346ULL; unsigned long long int ull3; void foo() { ll = -5597998501375493990LL; ll = unsigned(5677365550390624949L - ll) - (ull1 > 0); ull3 = unsigned(2067854353L << (((ll + -2129105131L) ^ 10280750144413668236ULL) - 10280750143997242009ULL)) >> ((2873442921854271231ULL | ull2) - 12098357307243495419ULL); } int main() { foo(); std::cout << ull3 << " (expected 3998784)\n"; return 0; } > g++ f.cpp -O0 -o out; ./out 3998784 (expected 3998784) > g++ f.cpp -O2 -o out; ./out 3493659712 (expected 3998784)