From: Jakub Jelinek Date: Wed, 3 Jun 2015 21:35:25 +0000 (+0200) Subject: backport: re PR middle-end/65680 (ICE at -O1 and above on x86_64-linux-gnu in expand_... X-Git-Tag: releases/gcc-4.8.5~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68a2ce3f40ce356b32780aa4a6508388cd2e6d6c;p=thirdparty%2Fgcc.git backport: re PR middle-end/65680 (ICE at -O1 and above on x86_64-linux-gnu in expand_assignment, at expr.c:4830) Backported from mainline 2015-04-07 Jakub Jelinek PR middle-end/65680 * expr.c (get_inner_reference): Handle bit_offset that doesn't fit into signed HOST_WIDE_INT the same as negative bit_offset. * gcc.c-torture/compile/pr65680.c: New test. From-SVN: r224104 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bce34d61075e..be581f6a5d29 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-04-07 Jakub Jelinek + + PR middle-end/65680 + * expr.c (get_inner_reference): Handle bit_offset that doesn't fit + into signed HOST_WIDE_INT the same as negative bit_offset. + 2015-03-10 Jakub Jelinek PR target/65368 diff --git a/gcc/expr.c b/gcc/expr.c index 777a191773e0..c8c4e949cd8b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6727,7 +6727,7 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize, if (offset) { /* Avoid returning a negative bitpos as this may wreak havoc later. */ - if (bit_offset.is_negative ()) + if (bit_offset.is_negative () || !bit_offset.fits_shwi ()) { double_int mask = double_int::mask (BITS_PER_UNIT == 8 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2f9244416790..432a5249ed92 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2015-06-03 Jakub Jelinek Backported from mainline + 2015-04-07 Jakub Jelinek + + PR middle-end/65680 + * gcc.c-torture/compile/pr65680.c: New test. + 2015-03-10 Jakub Jelinek PR target/65368 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr65680.c b/gcc/testsuite/gcc.c-torture/compile/pr65680.c new file mode 100644 index 000000000000..02f08cee26d5 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr65680.c @@ -0,0 +1,20 @@ +/* PR middle-end/65680 */ +/* { dg-do compile { target lp64 } } */ + +struct S +{ + int f : 1; +} a[100000000000000001][3]; + +void +foo (void) +{ + struct S b = { 0 }; + a[100000000000000000][0] = b; +} + +void +bar (void) +{ + a[100000000000000000][0].f = 1; +}