re PR tree-optimization/44861 (internal compiler error: in vectorizable_load, at...
authorRichard Guenther <rguenther@suse.de>
Thu, 8 Jul 2010 10:51:46 +0000 (10:51 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 8 Jul 2010 10:51:46 +0000 (10:51 +0000)
2010-07-08  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/44861
* tree-vect-stmts.c (vectorizable_store): Preserve TBAA
information when building MEM_REFs.
(vectorizable_load): Likewise.
* tree-vect-data-refs.c (vect_setup_realignment): Likewise.

* g++.dg/vect/pr44861.cc: New testcase.

From-SVN: r161949

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr44861.cc [new file with mode: 0644]
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c

index 8ee67172176029d9ff997c1a73dfcaccd7e6c09a..0d84f29d58795699c19c3a0c1a1a33cc2eba3298 100644 (file)
@@ -1,3 +1,11 @@
+2010-07-08  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/44861
+       * tree-vect-stmts.c (vectorizable_store): Preserve TBAA
+       information when building MEM_REFs.
+       (vectorizable_load): Likewise.
+       * tree-vect-data-refs.c (vect_setup_realignment): Likewise.
+
 2010-07-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sol2-c.c: Do not include diagnostic-core.h.
index 42cfe0e1334465a4e3ece7e5b5f204f0471ec37b..d332dc4a9605fb40146f7019272877f15b1b03c5 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-08  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/44861
+       * g++.dg/vect/pr44861.cc: New testcase.
+
 2010-07-07  Peter Bergner  <bergner@vnet.ibm.com>
 
        PR middle-end/44828
diff --git a/gcc/testsuite/g++.dg/vect/pr44861.cc b/gcc/testsuite/g++.dg/vect/pr44861.cc
new file mode 100644 (file)
index 0000000..07c59a1
--- /dev/null
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+bool f();
+
+struct counted_base {
+    virtual void destroy() { }
+    void release() { if (f()) destroy(); }
+};
+
+struct shared_count {
+    shared_count() { }
+    ~shared_count() { if (pi) pi->release(); }
+    shared_count(shared_count& r) : pi(r.pi) { if (pi) pi->release(); }
+    counted_base* pi;
+};
+
+struct Foo;
+
+struct shared_ptr  {
+    Foo& operator*() { return *ptr; }
+    Foo* ptr;
+    shared_count refcount;
+};
+
+struct Bar {
+    Bar(Foo&, shared_ptr);
+};
+
+void g() {
+    shared_ptr foo;
+    new Bar(*foo, foo);
+}
+
+// { dg-final { cleanup-tree-dump "vect" } }
index b8908aafa14569f4fc618a4d3ae5b896bd67089a..efd95a78acb75626bb38e6eef74b7000d5788a30 100644 (file)
@@ -3466,6 +3466,7 @@ vect_setup_realignment (gimple stmt, gimple_stmt_iterator *gsi,
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
   tree vectype = STMT_VINFO_VECTYPE (stmt_info);
   loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
+  struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
   edge pe;
   tree scalar_dest = gimple_assign_lhs (stmt);
@@ -3574,7 +3575,9 @@ vect_setup_realignment (gimple stmt, gimple_stmt_iterator *gsi,
       gimple_assign_set_lhs (new_stmt, new_temp);
       new_bb = gsi_insert_on_edge_immediate (pe, new_stmt);
       gcc_assert (!new_bb);
-      data_ref = build_simple_mem_ref (new_temp);
+      data_ref
+       = build2 (MEM_REF, TREE_TYPE (vec_dest), new_temp,
+                 build_int_cst (reference_alias_ptr_type (DR_REF (dr)), 0));
       new_stmt = gimple_build_assign (vec_dest, data_ref);
       new_temp = make_ssa_name (vec_dest, new_stmt);
       gimple_assign_set_lhs (new_stmt, new_temp);
index bf631616f77a4f0363992854a19d92a73d726249..bf9ae73a30be8dfd51aedbcd07ea9a84f474c094 100644 (file)
@@ -3360,7 +3360,10 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
            vec_oprnd = VEC_index (tree, result_chain, i);
 
           if (aligned_access_p (first_dr))
-           data_ref = build_simple_mem_ref (dataref_ptr);
+           data_ref
+             = build2 (MEM_REF, TREE_TYPE (vec_oprnd), dataref_ptr,
+                       build_int_cst (reference_alias_ptr_type
+                                        (DR_REF (first_dr)), 0));
           else
           {
             int mis = DR_MISALIGNMENT (first_dr);
@@ -3738,7 +3741,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
            {
            case dr_aligned:
              gcc_assert (aligned_access_p (first_dr));
-             data_ref = build_simple_mem_ref (dataref_ptr);
+             data_ref
+               = build2 (MEM_REF, vectype, dataref_ptr,
+                         build_int_cst (reference_alias_ptr_type
+                                          (DR_REF (first_dr)), 0));
              break;
            case dr_unaligned_supported:
              {
@@ -3769,7 +3775,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
                ptr = make_ssa_name (SSA_NAME_VAR (dataref_ptr), new_stmt);
                gimple_assign_set_lhs (new_stmt, ptr);
                vect_finish_stmt_generation (stmt, new_stmt, gsi);
-               data_ref = build_simple_mem_ref (ptr);
+               data_ref
+                 = build2 (MEM_REF, vectype, ptr,
+                           build_int_cst (reference_alias_ptr_type
+                                            (DR_REF (first_dr)), 0));
                vec_dest = vect_create_destination_var (scalar_dest, vectype);
                new_stmt = gimple_build_assign (vec_dest, data_ref);
                new_temp = make_ssa_name (vec_dest, new_stmt);
@@ -3790,7 +3799,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
                ptr = make_ssa_name (SSA_NAME_VAR (dataref_ptr), new_stmt);
                gimple_assign_set_lhs (new_stmt, ptr);
                vect_finish_stmt_generation (stmt, new_stmt, gsi);
-               data_ref = build_simple_mem_ref (ptr);
+               data_ref
+                 = build2 (MEM_REF, vectype, ptr,
+                           build_int_cst (reference_alias_ptr_type
+                                            (DR_REF (first_dr)), 0));
                break;
              }
            case dr_explicit_realign_optimized:
@@ -3802,7 +3814,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
              new_temp = make_ssa_name (SSA_NAME_VAR (dataref_ptr), new_stmt);
              gimple_assign_set_lhs (new_stmt, new_temp);
              vect_finish_stmt_generation (stmt, new_stmt, gsi);
-             data_ref = build_simple_mem_ref (new_temp);
+             data_ref
+               = build2 (MEM_REF, vectype, new_temp,
+                         build_int_cst (reference_alias_ptr_type
+                                          (DR_REF (first_dr)), 0));
              break;
            default:
              gcc_unreachable ();