This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR44861


When building vectorized stores/loads we need to preserve TBAA
information, which we now can easily do with MEM_REFs (thus, the
problem is latent until I finally remove MISALIGNED_INDIRECT_REFs, too).

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

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.

Index: gcc/tree-vect-stmts.c
===================================================================
*** gcc/tree-vect-stmts.c	(revision 161946)
--- gcc/tree-vect-stmts.c	(working copy)
*************** vectorizable_store (gimple stmt, gimple_
*** 3360,3366 ****
  	    vec_oprnd = VEC_index (tree, result_chain, i);
  
            if (aligned_access_p (first_dr))
! 	    data_ref = build_simple_mem_ref (dataref_ptr);
            else
            {
              int mis = DR_MISALIGNMENT (first_dr);
--- 3360,3369 ----
  	    vec_oprnd = VEC_index (tree, result_chain, i);
  
            if (aligned_access_p (first_dr))
! 	    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);
*************** vectorizable_load (gimple stmt, gimple_s
*** 3738,3744 ****
  	    {
  	    case dr_aligned:
  	      gcc_assert (aligned_access_p (first_dr));
! 	      data_ref = build_simple_mem_ref (dataref_ptr);
  	      break;
  	    case dr_unaligned_supported:
  	      {
--- 3741,3750 ----
  	    {
  	    case dr_aligned:
  	      gcc_assert (aligned_access_p (first_dr));
! 	      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:
  	      {
*************** vectorizable_load (gimple stmt, gimple_s
*** 3769,3775 ****
  		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);
  		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);
--- 3775,3784 ----
  		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
! 		  = 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);
*************** vectorizable_load (gimple stmt, gimple_s
*** 3790,3796 ****
  		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);
  	        break;
  	      }
  	    case dr_explicit_realign_optimized:
--- 3799,3808 ----
  		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
! 		  = build2 (MEM_REF, vectype, ptr,
! 			    build_int_cst (reference_alias_ptr_type
! 					     (DR_REF (first_dr)), 0));
  	        break;
  	      }
  	    case dr_explicit_realign_optimized:
*************** vectorizable_load (gimple stmt, gimple_s
*** 3802,3808 ****
  	      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);
  	      break;
  	    default:
  	      gcc_unreachable ();
--- 3814,3823 ----
  	      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
! 		= build2 (MEM_REF, vectype, new_temp,
! 			  build_int_cst (reference_alias_ptr_type
! 					   (DR_REF (first_dr)), 0));
  	      break;
  	    default:
  	      gcc_unreachable ();
Index: gcc/tree-vect-data-refs.c
===================================================================
*** gcc/tree-vect-data-refs.c	(revision 161946)
--- gcc/tree-vect-data-refs.c	(working copy)
*************** vect_setup_realignment (gimple stmt, gim
*** 3466,3471 ****
--- 3466,3472 ----
    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);
*************** vect_setup_realignment (gimple stmt, gim
*** 3574,3580 ****
        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);
        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);
--- 3575,3583 ----
        gimple_assign_set_lhs (new_stmt, new_temp);
        new_bb = gsi_insert_on_edge_immediate (pe, new_stmt);
        gcc_assert (!new_bb);
!       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: gcc/testsuite/g++.dg/vect/pr44861.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/pr44861.cc	(revision 0)
--- gcc/testsuite/g++.dg/vect/pr44861.cc	(revision 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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]