re PR tree-optimization/59356 (ACATS C52102A and C52102C failures)
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 2 Dec 2013 11:20:14 +0000 (11:20 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Mon, 2 Dec 2013 11:20:14 +0000 (11:20 +0000)
PR tree-optimization/59356
* tree-dfa.h (get_addr_base_and_unit_offset_1) <case ARRAY_REF>: Do the
offset computation using the precision of the index type.

From-SVN: r205585

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt30.adb [new file with mode: 0644]
gcc/tree-dfa.h

index cb8edae..78554aa 100644 (file)
@@ -1,3 +1,9 @@
+2013-12-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/59356
+       * tree-dfa.h (get_addr_base_and_unit_offset_1) <case ARRAY_REF>: Do the
+       offset computation using the precision of the index type.
+
 2013-12-02  Yvan Roux  <yvan.roux@linaro.org>
 
        PR target/58785
index 01a160e..c688c80 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-02  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt30.adb: New test.
+
 2013-12-01  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/57354
diff --git a/gcc/testsuite/gnat.dg/opt30.adb b/gcc/testsuite/gnat.dg/opt30.adb
new file mode 100644 (file)
index 0000000..12139c5
--- /dev/null
@@ -0,0 +1,20 @@
+-- { dg-do run }
+-- { dg-options "-O" }
+
+procedure Opt30 is
+
+   function Id_I (I : Integer) return Integer is
+   begin
+      return I;
+   end;
+
+   A : array (Integer range -4..4) of Integer;
+
+begin
+   A := (-ID_I(4), -ID_I(3), -ID_I(2), -ID_I(1), ID_I(100),
+          ID_I(1), ID_I(2), ID_I(3), ID_I(4));
+   A(-4..0) := A(0..4);
+   if A /= (100, 1, 2, 3, 4, 1, 2, 3, 4) then
+      raise Program_Error;
+   end if;
+end;
index 7d0a470..71f2c21 100644 (file)
@@ -102,11 +102,11 @@ get_addr_base_and_unit_offset_1 (tree exp, HOST_WIDE_INT *poffset,
                && (unit_size = array_ref_element_size (exp),
                    TREE_CODE (unit_size) == INTEGER_CST))
              {
-               HOST_WIDE_INT hindex = TREE_INT_CST_LOW (index);
-
-               hindex -= TREE_INT_CST_LOW (low_bound);
-               hindex *= TREE_INT_CST_LOW (unit_size);
-               byte_offset += hindex;
+               double_int doffset
+                 = (TREE_INT_CST (index) - TREE_INT_CST (low_bound))
+                   .sext (TYPE_PRECISION (TREE_TYPE (index)));
+               doffset *= tree_to_double_int (unit_size);
+               byte_offset += doffset.to_shwi ();
              }
            else
              return NULL_TREE;