poly_int: expand_expr_real_2
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 3 Jan 2018 07:17:46 +0000 (07:17 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 3 Jan 2018 07:17:46 +0000 (07:17 +0000)
This patch makes expand_expr_real_2 cope with polynomial mode sizes
when handling conversions involving a union type.

2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

gcc/
* expr.c (expand_expr_real_2): When handling conversions involving
unions, apply tree_to_poly_uint64 to the TYPE_SIZE rather than
multiplying int_size_in_bytes by BITS_PER_UNIT.  Treat GET_MODE_BISIZE
as a poly_uint64 too.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r256151

gcc/ChangeLog
gcc/expr.c

index e7901e52116e6a0f95cf9eca0f6cdde6cc02ac0f..6cef62278cea152228c00d155177a6f35e06de29 100644 (file)
@@ -1,3 +1,12 @@
+2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * expr.c (expand_expr_real_2): When handling conversions involving
+       unions, apply tree_to_poly_uint64 to the TYPE_SIZE rather than
+       multiplying int_size_in_bytes by BITS_PER_UNIT.  Treat GET_MODE_BISIZE
+       as a poly_uint64 too.
+
 2018-01-03  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index ab49c559a2b0bc7ceb07a461aea2cc2fe25c48ee..abab83136d3b47574bf029803b52cf97c8fa06c3 100644 (file)
@@ -8424,11 +8424,14 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
                          && !TYPE_REVERSE_STORAGE_ORDER (type));
 
              /* Store this field into a union of the proper type.  */
+             poly_uint64 op0_size
+               = tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (treeop0)));
+             poly_uint64 union_size = GET_MODE_BITSIZE (mode);
              store_field (target,
-                          MIN ((int_size_in_bytes (TREE_TYPE
-                                                   (treeop0))
-                                * BITS_PER_UNIT),
-                               (HOST_WIDE_INT) GET_MODE_BITSIZE (mode)),
+                          /* The conversion must be constructed so that
+                             we know at compile time how many bits
+                             to preserve.  */
+                          ordered_min (op0_size, union_size),
                           0, 0, 0, TYPE_MODE (valtype), treeop0, 0,
                           false, false);
            }