aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2015-03-16 10:26:28 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2015-03-16 10:26:28 +0000
commit9e25209f3a29dd1c8ee33c848a6a2b66e4c06d48 (patch)
tree74360d68ac8e131f8a56766c8bda7af6b7cf6beb /gcc/expr.c
parent2aab918dacb5a7dc51a4a33db785f2840a093d9d (diff)
downloadgcc-9e25209f3a29dd1c8ee33c848a6a2b66e4c06d48.zip
gcc-9e25209f3a29dd1c8ee33c848a6a2b66e4c06d48.tar.gz
gcc-9e25209f3a29dd1c8ee33c848a6a2b66e4c06d48.tar.bz2
re PR middle-end/65409 (ICE in store_field)
PR middle-end/65409 * expr.c (store_field): Do not do a direct block copy if the source is a PARALLEL with BLKmode. From-SVN: r221453
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 89ca129..dc13a14 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6645,11 +6645,12 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
&& mode != TYPE_MODE (TREE_TYPE (exp)))
temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
- /* If the modes of TEMP and TARGET are both BLKmode, both
- must be in memory and BITPOS must be aligned on a byte
- boundary. If so, we simply do a block copy. Likewise
- for a BLKmode-like TARGET. */
- if (GET_MODE (temp) == BLKmode
+ /* If TEMP is not a PARALLEL (see below) and its mode and that of TARGET
+ are both BLKmode, both must be in memory and BITPOS must be aligned
+ on a byte boundary. If so, we simply do a block copy. Likewise for
+ a BLKmode-like TARGET. */
+ if (GET_CODE (temp) != PARALLEL
+ && GET_MODE (temp) == BLKmode
&& (GET_MODE (target) == BLKmode
|| (MEM_P (target)
&& GET_MODE_CLASS (GET_MODE (target)) == MODE_INT