tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to get_ref_base_and...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 16 Dec 2010 22:35:35 +0000 (22:35 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 16 Dec 2010 22:35:35 +0000 (22:35 +0000)
* tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to
get_ref_base_and_extent returns -1 as the max size.

From-SVN: r167958

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt13.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt13_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt13_pkg.ads [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index f0dfc4bb6c7eaba644f50a1e9d90ef3176113663..476d31ed83ad8106c9922deabf35e18842d58b7a 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to
+       get_ref_base_and_extent returns -1 as the max size.
+
 2010-12-16  Konrad Eisele  <konrad@gaisler.com>
             Eric Botcazou  <ebotcazou@adacore.com>
 
index b5c1508e5d76ca1f7e8f60d10f317c85eeee3059..78ed8c6a589f0cf0ed4f758447cd179e243a742f 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt13.adb: New test.
+       * gnat.dg/opt13_pkg.ad[sb]: New helper.
+
 2010-12-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/43655
diff --git a/gcc/testsuite/gnat.dg/opt13.adb b/gcc/testsuite/gnat.dg/opt13.adb
new file mode 100644 (file)
index 0000000..9e47957
--- /dev/null
@@ -0,0 +1,13 @@
+-- { dg-do run }
+-- { dg-options "-O" }
+
+with Opt13_Pkg; use Opt13_Pkg;
+
+procedure Opt13 is
+  T : My_Type;
+begin
+  Allocate (T);
+  if N /= 1 then
+    raise Program_Error;
+  end if;
+end;
diff --git a/gcc/testsuite/gnat.dg/opt13_pkg.adb b/gcc/testsuite/gnat.dg/opt13_pkg.adb
new file mode 100644 (file)
index 0000000..b596a5c
--- /dev/null
@@ -0,0 +1,31 @@
+package body Opt13_Pkg is\r
+\r
+  subtype Index_Type is Natural range 0 .. 16;\r
+\r
+  type Arr is array (Index_Type range <>) of Integer;\r
+\r
+  type Rec is record\r
+    F1, F2, F3 : Float;\r
+    N : Natural;\r
+    B1, B2 : Boolean;\r
+    F4 : Float;\r
+  end record;\r
+\r
+  type Data (D : Index_Type) is record\r
+    A : Arr (1 .. D);\r
+    R : Rec;\r
+  end record;\r
+\r
+  Zero : constant Rec := (0.0, 0.0, 0.0, 0, False, False, 0.0);\r
+\r
+  procedure Allocate (T : out My_Type) is\r
+  begin\r
+    T := new Data (Index_Type'last);\r
+    T.R := Zero;\r
+\r
+    for I in 1 .. T.A'last loop\r
+      N := 1;\r
+    end loop;\r
+  end;\r
+\r
+end Opt13_Pkg;\r
diff --git a/gcc/testsuite/gnat.dg/opt13_pkg.ads b/gcc/testsuite/gnat.dg/opt13_pkg.ads
new file mode 100644 (file)
index 0000000..39567f6
--- /dev/null
@@ -0,0 +1,15 @@
+package Opt13_Pkg is\r
+\r
+    N : Natural := 0;\r
+\r
+    type My_Type is private;\r
+\r
+    procedure Allocate (T : out My_Type);\r
+\r
+private\r
+\r
+    type Data;\r
+\r
+    type My_Type is access Data;\r
+\r
+end Opt13_Pkg;\r
index 6efb2453d3a577afbbc843d62c471a2860d15246..970f2c0276a1ef6fcf7c8dd0f278927b146b787a 100644 (file)
@@ -1339,6 +1339,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
       size2 = TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) * 8;
       if ((unsigned HOST_WIDE_INT)size2 / 8
          == TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2))
+         && maxsize2 != -1
          && operand_equal_p (base, base2, 0)
          && offset2 <= offset
          && offset2 + size2 >= offset + maxsize)
@@ -1362,7 +1363,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
       HOST_WIDE_INT offset2, size2, maxsize2;
       base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt),
                                       &offset2, &size2, &maxsize2);
-      if (operand_equal_p (base, base2, 0)
+      if (maxsize2 != -1
+         && operand_equal_p (base, base2, 0)
          && offset2 <= offset
          && offset2 + size2 >= offset + maxsize)
        {
@@ -1383,7 +1385,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
               || handled_component_p (gimple_assign_rhs1 (def_stmt))))
     {
       tree base2;
-      HOST_WIDE_INT offset2, size2;
+      HOST_WIDE_INT offset2, size2, maxsize2;
       int i, j;
       VEC (vn_reference_op_s, heap) *rhs = NULL;
       vn_reference_op_t vro;
@@ -1396,8 +1398,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
       base2 = ao_ref_base (&lhs_ref);
       offset2 = lhs_ref.offset;
       size2 = lhs_ref.size;
-      if ((base != base2
-          && !operand_equal_p (base, base2, 0))
+      maxsize2 = lhs_ref.max_size;
+      if (maxsize2 == -1
+         || (base != base2 && !operand_equal_p (base, base2, 0))
          || offset2 > offset
          || offset2 + size2 < offset + maxsize)
        return (void *)-1;