[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
This commit is contained in:
Kyrylo Tkachov 2016-07-12 15:00:28 +00:00 committed by Kyrylo Tkachov
parent 5548d9cd19
commit d6f7c125d8
4 changed files with 37 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2016-07-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR middle-end/71700
* expr.c (store_constructor): Mask sign-extended bits when widening
sub-word constructor element at the start of a word.
2016-07-12 Martin Liska <mliska@suse.cz>
* ira-build.c (mark_loops_for_removal): Properly iterate

View File

@ -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)

View File

@ -1,3 +1,8 @@
2016-07-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR middle-end/71700
* gcc.c-torture/execute/pr71700.c: New test.
2016-07-12 Steven Bosscher <steven@gcc.gnu.org>
Richard Biener <rguenther@suse.de>

View File

@ -0,0 +1,19 @@
struct S
{
signed f0 : 16;
unsigned f1 : 1;
};
int b;
static struct S c[] = {{-1, 0}, {-1, 0}};
struct S d;
int
main ()
{
struct S e = c[0];
d = e;
if (d.f1 != 0)
__builtin_abort ();
return 0;
}