aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-03 07:17:46 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-03 07:17:46 +0000
commit0fd03b44ab4d77f8b8c09e5bbc2def4eeb855053 (patch)
tree5f58c996d3a8817c759a79fa3b3051a610740ca7
parentc3266d10a4e9446d98f6c262d315e0227bf281af (diff)
downloadgcc-0fd03b44ab4d77f8b8c09e5bbc2def4eeb855053.zip
gcc-0fd03b44ab4d77f8b8c09e5bbc2def4eeb855053.tar.gz
gcc-0fd03b44ab4d77f8b8c09e5bbc2def4eeb855053.tar.bz2
poly_int: expand_expr_real_2
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/expr.c11
2 files changed, 16 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e7901e5..6cef622 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,15 @@
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>
+
* rtlanal.c (subreg_get_info): Handle polynomial mode sizes.
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
diff --git a/gcc/expr.c b/gcc/expr.c
index ab49c55..abab831 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);
}