re PR c/82765 (ICE at -Os on valid code on x86_64-linux-gnu: in tree_to_shwi, at...
authorRichard Biener <rguenther@suse.de>
Thu, 2 Nov 2017 08:28:18 +0000 (08:28 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 2 Nov 2017 08:28:18 +0000 (08:28 +0000)
2017-11-02  Richard Biener  <rguenther@suse.de>

PR middle-end/82765
* varasm.c (decode_addr_const): Make offset HOST_WIDE_INT.
Truncate ARRAY_REF index and element size.

* gcc.dg/pr82765.c: New testcase.

From-SVN: r254337

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr82765.c [new file with mode: 0644]
gcc/varasm.c

index 40267c3f398ca289b60c3fea9b06a5fd5e97722a..fc871f8be9f14824c6b38c03ca1493aad60c29ab 100644 (file)
@@ -1,3 +1,9 @@
+2017-11-02  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/82765
+       * varasm.c (decode_addr_const): Make offset HOST_WIDE_INT.
+       Truncate ARRAY_REF index and element size.
+
 2017-11-01  Palmer Dabbelt  <palmer@dabbelt.com>
 
        * doc/invoke.texi (RISC-V Options): Use "@minus{}2 GB", not "-2 GB".
index 8046bb17f9f12cb98757a23c051ed9eb4411bb5f..3556b869226c73c76b1df6e829967d5e116bf250 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-02  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/82765
+       * gcc.dg/pr82765.c: New testcase.
+
 2017-11-02  Tom de Vries  <tom@codesourcery.com>
 
        * gfortran.dg/implied_do_io_1.f90: Fix scan-tree-dump-times pattern.
diff --git a/gcc/testsuite/gcc.dg/pr82765.c b/gcc/testsuite/gcc.dg/pr82765.c
new file mode 100644 (file)
index 0000000..dde0aeb
--- /dev/null
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -w" } */
+
+int a[1][1];
+int main() { int *b[] = {a, a[1820408606019012862278468], a, a, a}; }
index 655324e23e2868b953eb83d53a9a0b5f4437ac6a..1b35a99d6887758f8505d5f8261c6db77a6f66d3 100644 (file)
@@ -2879,7 +2879,7 @@ static void
 decode_addr_const (tree exp, struct addr_const *value)
 {
   tree target = TREE_OPERAND (exp, 0);
-  int offset = 0;
+  HOST_WIDE_INT offset = 0;
   rtx x;
 
   while (1)
@@ -2893,8 +2893,9 @@ decode_addr_const (tree exp, struct addr_const *value)
       else if (TREE_CODE (target) == ARRAY_REF
               || TREE_CODE (target) == ARRAY_RANGE_REF)
        {
-         offset += (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (target)))
-                    * tree_to_shwi (TREE_OPERAND (target, 1)));
+         /* Truncate big offset.  */
+         offset += (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (target)))
+                    * TREE_INT_CST_LOW (TREE_OPERAND (target, 1)));
          target = TREE_OPERAND (target, 0);
        }
       else if (TREE_CODE (target) == MEM_REF