OSDN Git Service

PR middle-end/32461
[pf3gnuchains/gcc-fork.git] / gcc / fold-const.c
index cd8d386..e2d57c9 100644 (file)
@@ -9260,21 +9260,31 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
 
          /* ~X + X is -1.  */
          if (TREE_CODE (arg0) == BIT_NOT_EXPR
-             && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
              && !TYPE_OVERFLOW_TRAPS (type))
            {
-             t1 = build_int_cst_type (type, -1);
-             return omit_one_operand (type, t1, arg1);
+             tree tem = TREE_OPERAND (arg0, 0);
+
+             STRIP_NOPS (tem);
+             if (operand_equal_p (tem, arg1, 0))
+               {
+                 t1 = build_int_cst_type (type, -1);
+                 return omit_one_operand (type, t1, arg1);
+               }
            }
 
          /* X + ~X is -1.  */
          if (TREE_CODE (arg1) == BIT_NOT_EXPR
-             && operand_equal_p (arg0, TREE_OPERAND (arg1, 0), 0)
              && !TYPE_OVERFLOW_TRAPS (type))
            {
-             t1 = build_int_cst_type (type, -1);
-             return omit_one_operand (type, t1, arg0);
-         }
+             tree tem = TREE_OPERAND (arg1, 0);
+
+             STRIP_NOPS (tem);
+             if (operand_equal_p (arg0, tem, 0))
+               {
+                 t1 = build_int_cst_type (type, -1);
+                 return omit_one_operand (type, t1, arg0);
+               }
+           }
 
          /* If we are adding two BIT_AND_EXPR's, both of which are and'ing
             with a constant, and the two constants have no bits in common,