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.

Reply via email to