https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99305
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- --- gcc/tree-ssa-phiopt.c.jj 2021-01-22 11:41:38.078708425 +0100 +++ gcc/tree-ssa-phiopt.c 2021-03-09 13:15:02.649094949 +0100 @@ -808,14 +808,14 @@ conditional_replacement (basic_block con nonzero_arg = arg0; else return false; - if (integer_all_onesp (nonzero_arg)) - neg = true; - else if (integer_pow2p (nonzero_arg)) + if (integer_pow2p (nonzero_arg)) { shift = tree_log2 (nonzero_arg); if (shift && POINTER_TYPE_P (TREE_TYPE (nonzero_arg))) return false; } + else if (integer_all_onesp (nonzero_arg)) + neg = true; else return false; should fix this I think. For bool, integer_all_onesp and integer_onep and integer_pow2p are all true... We shouldn't negate in that case.