]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/40071 (ICE (aliasing assert) in vectorizable_store at tree...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 9 Oct 2009 12:44:59 +0000 (12:44 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 9 Oct 2009 12:44:59 +0000 (12:44 +0000)
PR tree-optimization/40071
* tree-vect-data-refs.c (vect_create_data_ref_ptr): Build a ref-all
pointer if the original data reference doesn't conflict with the
created vector data reference.  Fix long line.

From-SVN: r152585

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt3.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt3_pkg.ads [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index b369f0b7d4ad06a1a10449686a78814d079536c9..5a28e87de37446005ff948b22865a618188869d0 100644 (file)
@@ -1,3 +1,10 @@
+2009-10-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR tree-optimization/40071
+       * tree-vect-data-refs.c (vect_create_data_ref_ptr): Build a ref-all
+       pointer if the original data reference doesn't conflict with the
+       created vector data reference.  Fix long line.
+
 2009-10-09  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (any_div): New code iterator.
index f7872c97995abf06c61709a54ac04aeec91c078c..c4c3da720aaa6c8ed54ac187ede0664d5a3887ce 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt3.adb: New test.
+       * gnat.dg/opt3_pkg.ads: New helper.
+
 2009-10-08  Doug Kwan  <dougkwan@google.com>
 
        PR rtl-optimization/41574
diff --git a/gcc/testsuite/gnat.dg/opt3.adb b/gcc/testsuite/gnat.dg/opt3.adb
new file mode 100644 (file)
index 0000000..b8ca2c7
--- /dev/null
@@ -0,0 +1,11 @@
+-- { dg-do compile }
+-- { dg-options "-O3" }
+
+with Opt3_Pkg; use Opt3_Pkg;
+
+procedure Opt3 is
+  type Buffer_Type is array (Integer range <> ) of Short_Integer;
+  B : Buffer_Type (1 .. 256) := (others => 0);
+begin
+  F (B(1));
+end;
diff --git a/gcc/testsuite/gnat.dg/opt3_pkg.ads b/gcc/testsuite/gnat.dg/opt3_pkg.ads
new file mode 100644 (file)
index 0000000..458a98b
--- /dev/null
@@ -0,0 +1,5 @@
+package Opt3_Pkg is
+
+  procedure F (I : Short_Integer);
+
+end Opt3_Pkg;
index bc18f0272f89fec440ce5640f01b57425f878508..c3570d31948ba6a1e99ec95fed28698d8f0aa10a 100644 (file)
@@ -2369,9 +2369,20 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
   vect_ptr_type = build_pointer_type (vectype);
   vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
                                     get_name (base_name));
-  /* If any of the data-references in the stmt group does not conflict
-     with the created vector data-reference use a ref-all pointer instead.  */
-  if (STMT_VINFO_DR_GROUP_SIZE (stmt_info) > 1)
+
+  /* Vector types inherit the alias set of their component type by default so
+     we need to use a ref-all pointer if the data reference does not conflict
+     with the created vector data reference because it is not addressable.  */
+  if (!alias_sets_conflict_p (get_deref_alias_set (vect_ptr),
+                             get_alias_set (DR_REF (dr))))
+    {
+      vect_ptr_type = build_pointer_type_for_mode (vectype, ptr_mode, true);
+      vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
+                                       get_name (base_name));
+    }
+
+  /* Likewise for any of the data references in the stmt group.  */
+  else if (STMT_VINFO_DR_GROUP_SIZE (stmt_info) > 1)
     {
       gimple orig_stmt = STMT_VINFO_DR_GROUP_FIRST_DR (stmt_info);
       do
@@ -2380,10 +2391,11 @@ vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
          if (!alias_sets_conflict_p (get_deref_alias_set (vect_ptr),
                                      get_alias_set (lhs)))
            {
-             vect_ptr_type = build_pointer_type_for_mode (vectype,
-                                                          ptr_mode, true);
-             vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
-                                               get_name (base_name));
+             vect_ptr_type
+               = build_pointer_type_for_mode (vectype, ptr_mode, true);
+             vect_ptr
+               = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
+                                        get_name (base_name));
              break;
            }