https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98956
Navid Rahimi <navidrahimi at microsoft dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |navidrahimi at microsoft dot com --- Comment #3 from Navid Rahimi <navidrahimi at microsoft dot com> --- I am sending a patch for this: /* cmp : ==, != */ /* ((B0 << CST) cmp 0) -> B0 cmp 0 */ (for cmp (eq ne) (simplify (cmp (lshift (convert @0) INTEGER_CST@1) integer_zerop@2) (if (TREE_CODE (TREE_TYPE (@0)) == BOOLEAN_TYPE) (cmp @0 @2)))) This does not apply to other arithmetic operations (at least it is not verifiable). and for cases that it does apply to other arithmetic operators, GCC already produces optimized code. You can play with the codegen I link below: Codegen: https://compiler-explorer.com/z/nj4PTrecW Proof: https://alive2.llvm.org/ce/z/jyJAoS