aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/vect/pr44861.cc34
-rw-r--r--gcc/tree-vect-data-refs.c5
-rw-r--r--gcc/tree-vect-stmts.c25
5 files changed, 71 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ee6717..0d84f29 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 42cfe0e..d332dc4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..07c59a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr44861.cc
@@ -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" } }
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index b8908aa..efd95a7 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -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);
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index bf63161..bf9ae73 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -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 ();