diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2016-07-12 15:00:28 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2016-07-12 15:00:28 +0000 |
commit | d6f7c125d85f7b2fb5f8625d4992fbe48f4547d4 (patch) | |
tree | 277c9334e6c15f3d94d37021a3b0b7007827c8eb /gcc | |
parent | 5548d9cd190fae2112e410b8ff91b09ec03f19e9 (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr71700.c | 19 |
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 509e855..ac411d5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7dd3c92..71b5227 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> diff --git a/gcc/testsuite/gcc.c-torture/execute/pr71700.c b/gcc/testsuite/gcc.c-torture/execute/pr71700.c new file mode 100644 index 0000000..80afd38 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr71700.c @@ -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; +} |