tree-ssa-pre.c (create_component_ref_by_pieces_1): Drop a zero minimum index only...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 31 Mar 2011 20:52:41 +0000 (20:52 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 31 Mar 2011 20:52:41 +0000 (20:52 +0000)
* tree-ssa-pre.c (create_component_ref_by_pieces_1) <ARRAY_REF>: Drop
a zero minimum index only if it is redundant.

From-SVN: r171800

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt16.adb [new file with mode: 0644]
gcc/tree-ssa-pre.c

index 3fe316c943d50e183503747f352bcbec48821c52..045f18fec4471dfecb39c5a4b1772e4db8d20859 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-ssa-pre.c (create_component_ref_by_pieces_1) <ARRAY_REF>: Drop
+       a zero minimum index only if it is redundant.
+
 2011-03-31  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/48381
index 81f9bb2ed9252b9aa18b6da24c5a94936e5b99d3..b9c24411bc5c314504c88e85aa0d363357b49700 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt16.adb: New test.
+
 2011-03-31  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/defaulted24.C: New.
diff --git a/gcc/testsuite/gnat.dg/opt16.adb b/gcc/testsuite/gnat.dg/opt16.adb
new file mode 100644 (file)
index 0000000..d8e93bd
--- /dev/null
@@ -0,0 +1,33 @@
+-- { dg-do compile }
+-- { dg-options "-O2 -gnatws" }
+
+procedure Opt16 is
+
+   generic
+      type T (<>) is private;
+      V, V1 : T;
+      with function F1 (X : T) return T;
+   package GP is
+      R : Boolean := F1 (V) = V1;
+   end GP;
+
+   type AB is array (Boolean range <>) of Boolean;
+
+begin
+   for I1 in Boolean loop
+      for I2 in Boolean loop
+         declare
+            B1 : Boolean := I1;
+            B2 : Boolean := I2;
+            AB1 : AB (Boolean) := (I1, I2);
+            T : AB (B1 .. B2) := (B1 .. B2 => True);
+            F : AB (B1 .. B2) := (B1 .. B2 => False);
+
+            package P is new GP (AB, AB1, NOT AB1, "NOT");
+
+         begin
+            null;
+         end;
+      end loop;
+   end loop;
+end;
index 0a6fa9455debecd56a0aa4258550e84a7be8352c..e59a598348b580bb91e2648230bacc18c16fd9ed 100644 (file)
@@ -2874,8 +2874,11 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref,
          return NULL_TREE;
        if (genop2)
          {
-           /* Drop zero minimum index.  */
-           if (tree_int_cst_equal (genop2, integer_zero_node))
+           tree domain_type = TYPE_DOMAIN (TREE_TYPE (genop0));
+           /* Drop zero minimum index if redundant.  */
+           if (integer_zerop (genop2)
+               && (!domain_type
+                   || integer_zerop (TYPE_MIN_VALUE (domain_type))))
              genop2 = NULL_TREE;
            else
              {