utils.c (fold_convert_size): New function.
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 3 Dec 2019 10:12:17 +0000 (10:12 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 3 Dec 2019 10:12:17 +0000 (10:12 +0000)
* gcc-interface/utils.c (fold_convert_size): New function.
(fold_bit_position): Invoke it to do further folding.

From-SVN: r278929

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

index 487176d958af2f67ae68038ec873c5554f56c95a..f8b9f18c8c1ebad8ebafdb19ca62438c80a984af 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (fold_convert_size): New function.
+       (fold_bit_position): Invoke it to do further folding.
+
 2019-12-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_subprog_type): With the Copy-In/
index e14645ae2163bd12603d307de669990be49b1aee..80c0716299f5c65f4f6326bcae969c1a69593613 100644 (file)
@@ -2349,19 +2349,27 @@ merge_sizes (tree last_size, tree first_bit, tree size, bool special, bool max)
   return new_size;
 }
 
+/* Convert the size expression EXPR to TYPE and fold the result.  */
+
+static tree
+fold_convert_size (tree type, tree expr)
+{
+  /* We assume that size expressions do not wrap around.  */
+  if (TREE_CODE (expr) == MULT_EXPR || TREE_CODE (expr) == PLUS_EXPR)
+    return size_binop (TREE_CODE (expr),
+                      fold_convert_size (type, TREE_OPERAND (expr, 0)),
+                      fold_convert_size (type, TREE_OPERAND (expr, 1)));
+
+  return fold_convert (type, expr);
+}
+
 /* Return the bit position of FIELD, in bits from the start of the record,
    and fold it as much as possible.  This is a tree of type bitsizetype.  */
 
 static tree
 fold_bit_position (const_tree field)
 {
-  tree offset = DECL_FIELD_OFFSET (field);
-  if (TREE_CODE (offset) == MULT_EXPR || TREE_CODE (offset) == PLUS_EXPR)
-    offset = size_binop (TREE_CODE (offset),
-                        fold_convert (bitsizetype, TREE_OPERAND (offset, 0)),
-                        fold_convert (bitsizetype, TREE_OPERAND (offset, 1)));
-  else
-    offset = fold_convert (bitsizetype, offset);
+  tree offset = fold_convert_size (bitsizetype, DECL_FIELD_OFFSET (field));
   return size_binop (PLUS_EXPR, DECL_FIELD_BIT_OFFSET (field),
                     size_binop (MULT_EXPR, offset, bitsize_unit_node));
 }