From dcc72b9e73852d9e3b5f40c6dc51da12c444d699 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 7 Apr 2015 16:34:06 +0200 Subject: [PATCH] re PR middle-end/65680 (ICE at -O1 and above on x86_64-linux-gnu in expand_assignment, at expr.c:4830) 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: r221899 --- gcc/ChangeLog | 6 ++++++ gcc/expr.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr65680.c | 20 +++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr65680.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b977dd8933..dcb7e99bd7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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-04-07 Ilya Enkovich * ipa-comdats.c (ipa_comdats): Visit all thunks diff --git a/gcc/expr.c b/gcc/expr.c index dc13a14f4e7..5c095507f4a 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6941,7 +6941,7 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize, if (offset) { /* Avoid returning a negative bitpos as this may wreak havoc later. */ - if (wi::neg_p (bit_offset)) + if (wi::neg_p (bit_offset) || !wi::fits_shwi_p (bit_offset)) { offset_int mask = wi::mask (LOG2_BITS_PER_UNIT, false); offset_int tem = bit_offset.and_not (mask); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 34d12535e02..933da2cac14 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-04-07 Jakub Jelinek + + PR middle-end/65680 + * gcc.c-torture/compile/pr65680.c: New test. + 2015-04-07 Andre Vehreschild PR fortran/65548 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 00000000000..02f08cee26d --- /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; +} -- 2.30.2