This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] [RFC] Fix PR 37385 - ICE in set_mem_alias_set with the vectorizer
- From: "Richard Guenther" <richard dot guenther at gmail dot com>
- To: "Ira Rosen" <IRAR at il dot ibm dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 9 Sep 2008 11:14:53 +0200
- Subject: Re: [patch] [RFC] Fix PR 37385 - ICE in set_mem_alias_set with the vectorizer
- References: <OF85DCE5C7.F401A3C3-ONC22574BF.002A3505-C22574BF.002DC96C@il.ibm.com>
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" } } */
>
>