decl.c (annotate_value): Really test the sign of the value when deciding to build...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 11 Oct 2019 08:57:18 +0000 (08:57 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 11 Oct 2019 08:57:18 +0000 (08:57 +0000)
* gcc-interface/decl.c (annotate_value) <INTEGER_CST>: Really test the
sign of the value when deciding to build a NEGATE_EXPR.
<PLUS_EXPR>: Remove redundant line.
<BIT_AND_EXPR>: Do the negation here.

From-SVN: r276866

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c

index 8e11108c4fc526423ec942b1660b7305eacd7505..792db56748130ef503318dcd422b97aeea81b148 100644 (file)
@@ -1,3 +1,10 @@
+2019-10-11  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/decl.c (annotate_value) <INTEGER_CST>: Really test the
+       sign of the value when deciding to build a NEGATE_EXPR.
+       <PLUS_EXPR>: Remove redundant line.
+       <BIT_AND_EXPR>: Do the negation here.
+
 2019-10-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (Gigi_Equivalent_Type) <E_Array_Subtype>: New
index 25298241ebacc7d30ef1da876483372526646074..2c5f5732f74cc8b0e5c35b54f11790ffedc8cf73 100644 (file)
@@ -8287,9 +8287,8 @@ annotate_value (tree gnu_size)
     {
     case INTEGER_CST:
       /* For negative values, build NEGATE_EXPR of the opposite.  Such values
-        can appear for discriminants in expressions for variants.  Note that,
-        sizetype being unsigned, we don't directly use tree_int_cst_sgn.  */
-      if (tree_int_cst_sign_bit (gnu_size))
+        can appear for discriminants in expressions for variants.  */
+      if (tree_int_cst_sgn (gnu_size) < 0)
        {
          tree t = wide_int_to_tree (sizetype, -wi::to_wide (gnu_size));
          tcode = Negate_Expr;
@@ -8367,9 +8366,8 @@ annotate_value (tree gnu_size)
          && tree_int_cst_sign_bit (TREE_OPERAND (gnu_size, 1)))
        {
          tcode = Minus_Expr;
-         ops[0] = annotate_value (TREE_OPERAND (gnu_size, 0));
-         wide_int op1 = -wi::to_wide (TREE_OPERAND (gnu_size, 1));
-         ops[1] = annotate_value (wide_int_to_tree (sizetype, op1));
+         wide_int wop1 = -wi::to_wide (TREE_OPERAND (gnu_size, 1));
+         ops[1] = annotate_value (wide_int_to_tree (sizetype, wop1));
          break;
        }
 
@@ -8410,9 +8408,9 @@ annotate_value (tree gnu_size)
         Such values can appear in expressions with aligning patterns.  */
       if (TREE_CODE (TREE_OPERAND (gnu_size, 1)) == INTEGER_CST)
        {
-         wide_int op1 = wi::sext (wi::to_wide (TREE_OPERAND (gnu_size, 1)),
-                                  TYPE_PRECISION (sizetype));
-         ops[1] = annotate_value (wide_int_to_tree (sizetype, op1));
+         wide_int wop1 = -wi::to_wide (TREE_OPERAND (gnu_size, 1));
+         tree op1 = wide_int_to_tree (sizetype, wop1);
+         ops[1] = annotate_value (build1 (NEGATE_EXPR, sizetype, op1));
        }
       break;