https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91882
--- Comment #1 from SztfG at yandex dot ru --- Similar problem with other tautology: unsigned int impl_bit(unsigned int a, unsigned int b) // bitwise implication { return (~a | b); } unsigned int eq_bit(unsigned int a, unsigned int b) // bitwise equivalence { return (~a ^ b); } // good optimisation - "return 1;" unsigned int always_true(unsigned int a, unsigned int b) { return eq_bit(impl_bit(a,b), impl_bit(b,a)) == eq_bit(a, b); // ( (a -> b) = (b -> a) ) = (a = b) tautology } bool impl_bool(bool a, bool b { return (!a || b); } // bad optimisation bool always_true(bool a, bool b) { return (impl(a,b) == impl(b,a)) == (a == b); // ( (a -> b) = (b -> a) ) = (a = b) tautology }