diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2018-01-03 07:17:46 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2018-01-03 07:17:46 +0000 |
commit | 0fd03b44ab4d77f8b8c09e5bbc2def4eeb855053 (patch) | |
tree | 5f58c996d3a8817c759a79fa3b3051a610740ca7 /gcc/expr.c | |
parent | c3266d10a4e9446d98f6c262d315e0227bf281af (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -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); } |