aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-04-07 16:34:06 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2015-04-07 16:34:06 +0200
commitdcc72b9e73852d9e3b5f40c6dc51da12c444d699 (patch)
treef42a807458e5c2d2ddd09d1038d0bf44d207f68c /gcc
parent440f9408ea950a29ef7606b6114d84d1a5b53c90 (diff)
downloadgcc-dcc72b9e73852d9e3b5f40c6dc51da12c444d699.zip
gcc-dcc72b9e73852d9e3b5f40c6dc51da12c444d699.tar.gz
gcc-dcc72b9e73852d9e3b5f40c6dc51da12c444d699.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr65680.c20
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7b977dd..dcb7e99 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ 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 <ilya.enkovich@intel.com>
* ipa-comdats.c (ipa_comdats): Visit all thunks
diff --git a/gcc/expr.c b/gcc/expr.c
index dc13a14..5c09550 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 <offset_int> (LOG2_BITS_PER_UNIT, false);
offset_int tem = bit_offset.and_not (mask);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 34d1253..933da2c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/65680
+ * gcc.c-torture/compile/pr65680.c: New test.
+
2015-04-07 Andre Vehreschild <vehre@gmx.de>
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 0000000..02f08ce
--- /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;
+}