From: Richard Guenther Date: Thu, 8 Jul 2010 10:51:46 +0000 (+0000) Subject: re PR tree-optimization/44861 (internal compiler error: in vectorizable_load, at... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=20ede5c64d71cb0fb25a445f93752c7e6e861dba;p=gcc.git re PR tree-optimization/44861 (internal compiler error: in vectorizable_load, at tree-vect-stmts.c:3812) 2010-07-08 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ee67172176..0d84f29d587 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-07-08 Richard Guenther + + 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 * config/sol2-c.c: Do not include diagnostic-core.h. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 42cfe0e1334..d332dc4a960 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-08 Richard Guenther + + PR tree-optimization/44861 + * g++.dg/vect/pr44861.cc: New testcase. + 2010-07-07 Peter Bergner 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 00000000000..07c59a1382d --- /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 b8908aafa14..efd95a78acb 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 bf631616f77..bf9ae73a30b 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 ();