]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR middle-end/65680 (ICE at -O1 and above on x86_64-linux-gnu in expand_...
authorJakub Jelinek <jakub@redhat.com>
Wed, 3 Jun 2015 21:35:25 +0000 (23:35 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 3 Jun 2015 21:35:25 +0000 (23:35 +0200)
Backported from mainline
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.

* gcc.c-torture/compile/pr65680.c: New test.

From-SVN: r224104

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr65680.c [new file with mode: 0644]

index bce34d61075ed7c811afa5c03e7dc15348a46f01..be581f6a5d29022eda2011658a38e5e729bf3243 100644 (file)
@@ -1,6 +1,12 @@
 2015-06-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-03-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/65368
index 777a191773e0c87ec1c8ad6fda1bdf45e45daca8..c8c4e949cd8b2dc4aa9774e551519471e5193d4e 100644 (file)
@@ -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
index 2f9244416790b4d5f88a02bd5f3691d98392b965..432a5249ed922281aef3c26a977df4c9e68e9795 100644 (file)
@@ -1,6 +1,11 @@
 2015-06-03  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2015-04-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/65680
+       * gcc.c-torture/compile/pr65680.c: New test.
+
        2015-03-10  Jakub Jelinek  <jakub@redhat.com>
 
        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 (file)
index 0000000..02f08ce
--- /dev/null
@@ -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;
+}