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]

Re: [patch] [RFC] Fix PR 37385 - ICE in set_mem_alias_set with the vectorizer


On Tue, Sep 9, 2008 at 10:20 AM, Ira Rosen <IRAR@il.ibm.com> wrote:
>
> The fix of PR 36493
> (http://gcc.gnu.org/ml/gcc-patches/2008-06/msg01023.html) verifies that the
> accesses through the vector pointer and the original scalar memory
> reference alias. In addition before that patch, the type of vector store
> statement was determined by the RHS of the scalar statement, and now it is
> determined by the type of LHS, which seems to cause the ICE in
> set_mem_alias_set, at emit-rtl.c:1789.
>
> The attached patch reverts the second part of the PR 36493 patch. This
> fixes the problem (without hurting PR 36493). I am not sure that the fix is
> correct, since the types of RHS and LHS are compatible anyway.
> I am bootstrapping and testing the patch on x86_64-linux now.

I think it's reasonable.  This may be papering over a real problem somewhere
else as we are not actually verifying if the types in our statements
are correct.

Richard.

> Thanks,
> Ira
>
> ChangeLog:
>
>      PR tree-optimization/37385
>      * tree-vect-transform.c (vect_create_data_ref_ptr): Add a
>      new argument, and use it as a vector type if not NULL.
>      (vectorizable_store): Call vect_create_data_ref_ptr with
>      the type of vectorized rhs.
>      (vect_setup_realignment): Call vect_create_data_ref_ptr with
>      additional argument.
>      (vectorizable_load): Likewise.
>
> testsuite/ChangeLog:
>
>      PR tree-optimization/37385
>      * gcc.dg/vect/pr37385.c: New test.
>
> Index: tree-vect-transform.c
> ===================================================================
> --- tree-vect-transform.c       (revision 140137)
> +++ tree-vect-transform.c       (working copy)
> @@ -50,7 +50,7 @@ static bool vect_transform_stmt (gimple,
>                                 slp_tree, slp_instance);,
>  static tree vect_create_destination_var (tree, tree);
>  static tree vect_create_data_ref_ptr
> -  (gimple, struct loop*, tree, tree *, gimple *, bool, bool *);
> +  (gimple, struct loop*, tree, tree *, gimple *, bool, bool *, tree);
>  static tree vect_create_addr_base_for_vector_ref
>   (gimple, gimple_seq *, tree, struct loop *);
>  static tree vect_get_new_vect_var (tree, enum vect_var_kind, const char
> *);
> @@ -981,6 +981,7 @@ vect_create_addr_base_for_vector_ref (gi,
>         by the data-ref in STMT.
>    4. ONLY_INIT: indicate if vp is to be updated in the loop, or remain
>         pointing to the initial address.
> +   5. TYPE: if not NULL indicates the required type of the data-ref.
>
>    Output::
>    1. Declare a new ptr to vector_type, and have it point to the base of
> the
> @@ -1010,7 +1011,7 @@ vect_create_addr_base_for_vector_ref (gi
>  static tree
>  vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop,
>                          tree offset, tree *initial_address, gimple
> *ptr_incr,
> -                         bool only_init, bool *inv_p)
> +                         bool only_init, bool *inv_p, tree type)
>  {
>   tree base_name;
>   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> @@ -1069,7 +1070,10 @@ vect_create_data_ref_ptr (gimple stmt, s
>     }
>
>   /** (1) Create the new vector-pointer variable:  **/
> -  vect_ptr_type = build_pointer_type (vectype);
> +  if (type)
> +    vect_ptr_type = build_pointer_type (type);;
> +  else
> +    vect_ptr_type = build_pointer_type (vectype);
>
>   vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
>                                     get_name (base_name));
> @@ -5372,7 +5376,7 @@ vectorizable_store (gimple stmt, gimple_
>
>          dataref_ptr = vect_create_data_ref_ptr (first_stmt, NULL,
> NULL_TREE,,
>                                                  &dummy, &ptr_incr, false,
> -                                                 &inv_p);
> +                                                 &inv_p, TREE_TYPE
> (vec_oprnd));
>          gcc_assert (!inv_p);
>        }
>       else
> @@ -5610,7 +5614,7 @@ vect_setup_realignment (gimple stmt, gim
>       pe = loop_preheader_edge (loop_for_initial_load);
>       vec_dest = vect_create_destination_var (scalar_dest, vectype);
>       ptr = vect_create_data_ref_ptr (stmt, loop_for_initial_load,
> NULL_TREE,));
> -                                     &init_addr, &inc, true, &inv_p);
> +                                 &init_addr, &inc, true, &inv_p,
> NULL_TREE);,));
>       data_ref = build1 (ALIGN_INDIRECT_REF, vectype, ptr);
>       new_stmt = gimple_build_assign (vec_dest, data_ref);;
>       new_temp = make_ssa_name (vec_dest, new_stmt);
> @@ -6578,7 +6582,7 @@ vectorizable_load (gimple stmt, gimple_s
>         dataref_ptr = vect_create_data_ref_ptr (first_stmt,
>                                                at_loop, offset,,
>                                                &dummy, &ptr_incr, false,
> -                                               &inv_p);
> +                                               &inv_p, NULL_TREE);
>       else
>         dataref_ptr =
>                bump_vector_ptr (dataref_ptr, ptr_incr, gsi, stmt,
> NULL_TREE);));
> Index: testsuite/gcc.dg/vect/pr37385.c
> ===================================================================
> --- testsuite/gcc.dg/vect/pr37385.c     (revision 0)
> +++ testsuite/gcc.dg/vect/pr37385.c     (revision 0)
> @@ -0,0 +1,20 @@
> +/* Testcase by Martin Michlmayr <tbm@cyrius.com> */
> +/* { dg-do compile } */
> +/* { dg-require-effective-target vect_int } */
> +
> +typedef int int_t;
> +typedef void (*fun_t) (int);
> +fun_t fun_tab[400] __attribute__ ((__aligned__(16)));
> +
> +void foo (int_t a);
> +
> +void
> +bar ()
> +{
> +  int i;
> +
> +  for (i = 0; i < 400; i++)
> +      fun_tab[i] = 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]