mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-24 07:10:27 +08:00
re PR tree-optimization/44861 (internal compiler error: in vectorizable_load, at tree-vect-stmts.c:3812)
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
This commit is contained in:
parent
80edb36cfd
commit
20ede5c64d
gcc
@ -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.
|
||||
|
@ -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
|
||||
|
34
gcc/testsuite/g++.dg/vect/pr44861.cc
Normal file
34
gcc/testsuite/g++.dg/vect/pr44861.cc
Normal file
@ -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" } }
|
@ -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);
|
||||
|
@ -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 ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user