re PR middle-end/79536 (ICE in fold_binary_loc, at fold-const.c:9060)
authorMarek Polacek <polacek@redhat.com>
Fri, 17 Feb 2017 09:51:38 +0000 (09:51 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 17 Feb 2017 09:51:38 +0000 (09:51 +0000)
PR middle-end/79536
* fold-const.c (fold_negate_expr_1): Renamed from fold_negate_expr.
(fold_negate_expr): New wrapper.

* gcc.dg/torture/pr79536.c: New test.

From-SVN: r245526

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr79536.c [new file with mode: 0644]

index dd08b7d3f4c472bf99454fd17f88fea189aad172..b7d0d8ed436f8e6f5983cf29451124ceaaa16460 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-17  Marek Polacek  <polacek@redhat.com>
+
+       PR middle-end/79536
+       * fold-const.c (fold_negate_expr_1): Renamed from fold_negate_expr.
+       (fold_negate_expr): New wrapper.
+
 2017-02-16  Sandra Loosemore  <sandra@codesourcery.com>
 
        * doc/invoke.texi (C++ Dialect Options) [-Wno-non-template-friend]: 
index a8bb8af45c3aedce5cfb98873e1e6548bf953d20..ad4770b43d2ae344930339bd65f09af592765329 100644 (file)
@@ -139,6 +139,7 @@ static tree fold_relational_const (enum tree_code, tree, tree, tree);
 static tree fold_convert_const (enum tree_code, tree, tree);
 static tree fold_view_convert_expr (tree, tree);
 static bool vec_cst_ctor_to_array (tree, tree *);
+static tree fold_negate_expr (location_t, tree);
 
 
 /* Return EXPR_LOCATION of T if it is not UNKNOWN_LOCATION.
@@ -522,7 +523,7 @@ negate_expr_p (tree t)
    returned.  */
 
 static tree
-fold_negate_expr (location_t loc, tree t)
+fold_negate_expr_1 (location_t loc, tree t)
 {
   tree type = TREE_TYPE (t);
   tree tem;
@@ -533,7 +534,7 @@ fold_negate_expr (location_t loc, tree t)
     case BIT_NOT_EXPR:
       if (INTEGRAL_TYPE_P (type))
         return fold_build2_loc (loc, PLUS_EXPR, type, TREE_OPERAND (t, 0),
-                            build_one_cst (type));
+                               build_one_cst (type));
       break;
 
     case INTEGER_CST:
@@ -581,14 +582,14 @@ fold_negate_expr (location_t loc, tree t)
     case COMPLEX_EXPR:
       if (negate_expr_p (t))
        return fold_build2_loc (loc, COMPLEX_EXPR, type,
-                           fold_negate_expr (loc, TREE_OPERAND (t, 0)),
-                           fold_negate_expr (loc, TREE_OPERAND (t, 1)));
+                               fold_negate_expr (loc, TREE_OPERAND (t, 0)),
+                               fold_negate_expr (loc, TREE_OPERAND (t, 1)));
       break;
 
     case CONJ_EXPR:
       if (negate_expr_p (t))
        return fold_build1_loc (loc, CONJ_EXPR, type,
-                           fold_negate_expr (loc, TREE_OPERAND (t, 0)));
+                               fold_negate_expr (loc, TREE_OPERAND (t, 0)));
       break;
 
     case NEGATE_EXPR:
@@ -605,7 +606,7 @@ fold_negate_expr (location_t loc, tree t)
            {
              tem = negate_expr (TREE_OPERAND (t, 1));
              return fold_build2_loc (loc, MINUS_EXPR, type,
-                                 tem, TREE_OPERAND (t, 0));
+                                     tem, TREE_OPERAND (t, 0));
            }
 
          /* -(A + B) -> (-A) - B.  */
@@ -613,7 +614,7 @@ fold_negate_expr (location_t loc, tree t)
            {
              tem = negate_expr (TREE_OPERAND (t, 0));
              return fold_build2_loc (loc, MINUS_EXPR, type,
-                                 tem, TREE_OPERAND (t, 1));
+                                     tem, TREE_OPERAND (t, 1));
            }
        }
       break;
@@ -623,7 +624,7 @@ fold_negate_expr (location_t loc, tree t)
       if (!HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
          && !HONOR_SIGNED_ZEROS (element_mode (type)))
        return fold_build2_loc (loc, MINUS_EXPR, type,
-                           TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
+                               TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));
       break;
 
     case MULT_EXPR:
@@ -638,11 +639,11 @@ fold_negate_expr (location_t loc, tree t)
          tem = TREE_OPERAND (t, 1);
          if (negate_expr_p (tem))
            return fold_build2_loc (loc, TREE_CODE (t), type,
-                               TREE_OPERAND (t, 0), negate_expr (tem));
+                                   TREE_OPERAND (t, 0), negate_expr (tem));
          tem = TREE_OPERAND (t, 0);
          if (negate_expr_p (tem))
            return fold_build2_loc (loc, TREE_CODE (t), type,
-                               negate_expr (tem), TREE_OPERAND (t, 1));
+                                   negate_expr (tem), TREE_OPERAND (t, 1));
        }
       break;
 
@@ -715,6 +716,19 @@ fold_negate_expr (location_t loc, tree t)
   return NULL_TREE;
 }
 
+/* A wrapper for fold_negate_expr_1.  */
+
+static tree
+fold_negate_expr (location_t loc, tree t)
+{
+  tree type = TREE_TYPE (t);
+  STRIP_SIGN_NOPS (t);
+  tree tem = fold_negate_expr_1 (loc, t);
+  if (tem == NULL_TREE)
+    return NULL_TREE;
+  return fold_convert_loc (loc, type, tem);
+}
+
 /* Like fold_negate_expr, but return a NEGATE_EXPR tree, if T can not be
    negated in a simpler way.  Also allow for T to be NULL_TREE, in which case
    return NULL_TREE. */
index f7b64e30c2d78202730317e9cac9ee5832ad5178..abd9308a80a761a857a5d1f606baa84d2e00d3c9 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-17  Marek Polacek  <polacek@redhat.com>
+
+       PR middle-end/79536
+       * gcc.dg/torture/pr79536.c: New test.
+
 2017-02-16  Alan Modra  <amodra@gmail.com>
 
        * gcc.c-torture/execute/pr79286.c: New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr79536.c b/gcc/testsuite/gcc.dg/torture/pr79536.c
new file mode 100644 (file)
index 0000000..6f05ca7
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+
+typedef int A;
+int
+fn1 (A x, A y)
+{
+  if ((x + (x - y) * 1i) != -(-x + (y - x) * 1i))
+    return 1;
+  return 0;
+}