aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2016-07-12 15:00:28 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2016-07-12 15:00:28 +0000
commitd6f7c125d85f7b2fb5f8625d4992fbe48f4547d4 (patch)
tree277c9334e6c15f3d94d37021a3b0b7007827c8eb /gcc/expr.c
parent5548d9cd190fae2112e410b8ff91b09ec03f19e9 (diff)
downloadgcc-d6f7c125d85f7b2fb5f8625d4992fbe48f4547d4.zip
gcc-d6f7c125d85f7b2fb5f8625d4992fbe48f4547d4.tar.gz
gcc-d6f7c125d85f7b2fb5f8625d4992fbe48f4547d4.tar.bz2
[expr.c] PR middle-end/71700: zero-extend sub-word value when widening constructor element
PR middle-end/71700 * expr.c (store_constructor): Mask sign-extended bits when widening sub-word constructor element at the start of a word. * gcc.c-torture/execute/pr71700.c: New test. From-SVN: r238248
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index fbc91ad..4073a98 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6281,6 +6281,13 @@ store_constructor (tree exp, rtx target, int cleared, HOST_WIDE_INT size,
type = lang_hooks.types.type_for_mode
(word_mode, TYPE_UNSIGNED (type));
value = fold_convert (type, value);
+ /* Make sure the bits beyond the original bitsize are zero
+ so that we can correctly avoid extra zeroing stores in
+ later constructor elements. */
+ tree bitsize_mask
+ = wide_int_to_tree (type, wi::mask (bitsize, false,
+ BITS_PER_WORD));
+ value = fold_build2 (BIT_AND_EXPR, type, value, bitsize_mask);
}
if (BYTES_BIG_ENDIAN)