]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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:39:15 +0000 (22:39 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 16 Dec 2010 22:39:15 +0000 (22:39 +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: r167959

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 d2eeb4db425e8a143250790a6edc67e2edadea7d..0d70a33e23c88cd30b3c777848e196048591246b 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  Richard Guenther  <rguenther@suse.de>
 
        * DEV-PHASE: Set back to prerelease.
index 686eda1fb27ec051acc7b9db5a9c4fa0f3005411..0d5e25526c59f5dcbd5b6f7e311ae67c0b2d9b59 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  Release Manager
 
        * GCC 4.5.2 released.
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 de2f777156ae706b88927dba18b468162f6df02b..9b2638f109049cfa98de76f057ca0db9a909d942 100644 (file)
@@ -1063,6 +1063,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)
@@ -1086,7 +1087,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)
        {
@@ -1116,7 +1118,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_)
       /* See if the assignment kills REF.  */
       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)
        return (void *)-1;