From: Richard Guenther <richard.guenther@gmail.com>
To: gcc-patches@gcc.gnu.org, patches@linaro.org,
richard.sandiford@linaro.org
Subject: Re: [1/9] Generalise vect_create_data_ref_ptr
Date: Tue, 12 Apr 2011 13:30:00 -0000 [thread overview]
Message-ID: <BANLkTimBU0f9Y8rioqP1GQ8D8R2jCintGA@mail.gmail.com> (raw)
In-Reply-To: <g4lizffvq4.fsf@linaro.org>
On Tue, Apr 12, 2011 at 3:24 PM, Richard Sandiford
<richard.sandiford@linaro.org> wrote:
> This first patch generalises vect_create_data_ref_ptr & bump_data_ref_ptr
> so that they can handle array as well as vector types. The two cases are
> so similar that it's mostly a renaming exercise.
>
> Tested on x86_64-linux-gnu and arm-linux-gnueabi. OK to install?
Ok.
Thanks,
Richard.
> Richard
>
>
> gcc/
> * tree-vectorizer.h (vect_create_data_ref_ptr): Add an extra
> type parameter.
> * tree-vect-data-refs.c (vect_create_data_ref_ptr): Add an aggr_type
> parameter. Generalise code to handle arrays as well as vectors.
> (vect_setup_realignment): Update accordingly.
> * tree-vect-stmts.c (vectorizable_store): Likewise.
> (vectorizable_load): Likewise.
>
> Index: gcc/tree-vectorizer.h
> ===================================================================
> --- gcc/tree-vectorizer.h 2011-04-12 11:53:54.000000000 +0100
> +++ gcc/tree-vectorizer.h 2011-04-12 11:55:07.000000000 +0100
> @@ -823,9 +823,9 @@ extern bool vect_verify_datarefs_alignme
> extern bool vect_analyze_data_ref_accesses (loop_vec_info, bb_vec_info);
> extern bool vect_prune_runtime_alias_test_list (loop_vec_info);
> extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *);
> -extern tree vect_create_data_ref_ptr (gimple, struct loop *, tree, tree *,
> - gimple_stmt_iterator *, gimple *,
> - bool, bool *);
> +extern tree vect_create_data_ref_ptr (gimple, tree, struct loop *, tree,
> + tree *, gimple_stmt_iterator *,
> + gimple *, bool, bool *);
> extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree);
> extern tree vect_create_destination_var (tree, tree);
> extern bool vect_strided_store_supported (tree);
> Index: gcc/tree-vect-data-refs.c
> ===================================================================
> --- gcc/tree-vect-data-refs.c 2011-04-12 11:53:54.000000000 +0100
> +++ gcc/tree-vect-data-refs.c 2011-04-12 11:55:07.000000000 +0100
> @@ -2911,32 +2911,33 @@ vect_create_addr_base_for_vector_ref (gi
>
> /* Function vect_create_data_ref_ptr.
>
> - Create a new pointer to vector type (vp), that points to the first location
> - accessed in the loop by STMT, along with the def-use update chain to
> - appropriately advance the pointer through the loop iterations. Also set
> - aliasing information for the pointer. This vector pointer is used by the
> - callers to this function to create a memory reference expression for vector
> - load/store access.
> + Create a new pointer-to-TYPE variable (ap), that points to the first
> + location accessed in the loop by STMT, along with the def-use update
> + chain to appropriately advance the pointer through the loop iterations.
> + Also set aliasing information for the pointer. This pointer is used by
> + the callers to this function to create a memory reference expression for
> + vector load/store access.
>
> Input:
> 1. STMT: a stmt that references memory. Expected to be of the form
> GIMPLE_ASSIGN <name, data-ref> or
> GIMPLE_ASSIGN <data-ref, name>.
> - 2. AT_LOOP: the loop where the vector memref is to be created.
> - 3. OFFSET (optional): an offset to be added to the initial address accessed
> + 2. AGGR_TYPE: the type of the reference, which should be either a vector
> + or an array.
> + 3. AT_LOOP: the loop where the vector memref is to be created.
> + 4. OFFSET (optional): an offset to be added to the initial address accessed
> by the data-ref in STMT.
> - 4. BSI: location where the new stmts are to be placed if there is no loop
> - 5. ONLY_INIT: indicate if vp is to be updated in the loop, or remain
> + 5. BSI: location where the new stmts are to be placed if there is no loop
> + 6. ONLY_INIT: indicate if ap is to be updated in the loop, or remain
> pointing to the initial address.
> - 6. 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
> data reference (initial addressed accessed by the data reference).
> For example, for vector of type V8HI, the following code is generated:
>
> - v8hi *vp;
> - vp = (v8hi *)initial_address;
> + v8hi *ap;
> + ap = (v8hi *)initial_address;
>
> if OFFSET is not supplied:
> initial_address = &a[init];
> @@ -2956,9 +2957,10 @@ vect_create_addr_base_for_vector_ref (gi
> 4. Return the pointer. */
>
> tree
> -vect_create_data_ref_ptr (gimple stmt, struct loop *at_loop, tree offset,
> - tree *initial_address, gimple_stmt_iterator *gsi,
> - gimple *ptr_incr, bool only_init, bool *inv_p)
> +vect_create_data_ref_ptr (gimple stmt, tree aggr_type, struct loop *at_loop,
> + tree offset, tree *initial_address,
> + gimple_stmt_iterator *gsi, gimple *ptr_incr,
> + bool only_init, bool *inv_p)
> {
> tree base_name;
> stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
> @@ -2966,17 +2968,16 @@ vect_create_data_ref_ptr (gimple stmt, s
> struct loop *loop = NULL;
> bool nested_in_vect_loop = false;
> struct loop *containing_loop = NULL;
> - tree vectype = STMT_VINFO_VECTYPE (stmt_info);
> - tree vect_ptr_type;
> - tree vect_ptr;
> + tree aggr_ptr_type;
> + tree aggr_ptr;
> tree new_temp;
> gimple vec_stmt;
> gimple_seq new_stmt_list = NULL;
> edge pe = NULL;
> basic_block new_bb;
> - tree vect_ptr_init;
> + tree aggr_ptr_init;
> struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info);
> - tree vptr;
> + tree aptr;
> gimple_stmt_iterator incr_gsi;
> bool insert_after;
> bool negative;
> @@ -2986,6 +2987,9 @@ vect_create_data_ref_ptr (gimple stmt, s
> bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info);
> tree base;
>
> + gcc_assert (TREE_CODE (aggr_type) == ARRAY_TYPE
> + || TREE_CODE (aggr_type) == VECTOR_TYPE);
> +
> if (loop_vinfo)
> {
> loop = LOOP_VINFO_LOOP (loop_vinfo);
> @@ -3020,8 +3024,9 @@ vect_create_data_ref_ptr (gimple stmt, s
> if (vect_print_dump_info (REPORT_DETAILS))
> {
> tree data_ref_base = base_name;
> - fprintf (vect_dump, "create vector-pointer variable to type: ");
> - print_generic_expr (vect_dump, vectype, TDF_SLIM);
> + fprintf (vect_dump, "create %s-pointer variable to type: ",
> + tree_code_name[(int) TREE_CODE (aggr_type)]);
> + print_generic_expr (vect_dump, aggr_type, TDF_SLIM);
> if (TREE_CODE (data_ref_base) == VAR_DECL
> || TREE_CODE (data_ref_base) == ARRAY_REF)
> fprintf (vect_dump, " vectorizing an array ref: ");
> @@ -3032,27 +3037,28 @@ vect_create_data_ref_ptr (gimple stmt, s
> print_generic_expr (vect_dump, base_name, TDF_SLIM);
> }
>
> - /* (1) Create the new vector-pointer variable. */
> - vect_ptr_type = build_pointer_type (vectype);
> + /* (1) Create the new aggregate-pointer variable. */
> + aggr_ptr_type = build_pointer_type (aggr_type);
> base = get_base_address (DR_REF (dr));
> if (base
> && TREE_CODE (base) == MEM_REF)
> - vect_ptr_type
> - = build_qualified_type (vect_ptr_type,
> + aggr_ptr_type
> + = build_qualified_type (aggr_ptr_type,
> TYPE_QUALS (TREE_TYPE (TREE_OPERAND (base, 0))));
> - vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
> + aggr_ptr = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var,
> get_name (base_name));
>
> - /* Vector types inherit the alias set of their component type by default so
> - we need to use a ref-all pointer if the data reference does not conflict
> - with the created vector data reference because it is not addressable. */
> - if (!alias_sets_conflict_p (get_deref_alias_set (vect_ptr),
> + /* Vector and array types inherit the alias set of their component
> + type by default so we need to use a ref-all pointer if the data
> + reference does not conflict with the created aggregated data
> + reference because it is not addressable. */
> + if (!alias_sets_conflict_p (get_deref_alias_set (aggr_ptr),
> get_alias_set (DR_REF (dr))))
> {
> - vect_ptr_type
> - = build_pointer_type_for_mode (vectype,
> - TYPE_MODE (vect_ptr_type), true);
> - vect_ptr = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
> + aggr_ptr_type
> + = build_pointer_type_for_mode (aggr_type,
> + TYPE_MODE (aggr_ptr_type), true);
> + aggr_ptr = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var,
> get_name (base_name));
> }
>
> @@ -3063,14 +3069,14 @@ vect_create_data_ref_ptr (gimple stmt, s
> do
> {
> tree lhs = gimple_assign_lhs (orig_stmt);
> - if (!alias_sets_conflict_p (get_deref_alias_set (vect_ptr),
> + if (!alias_sets_conflict_p (get_deref_alias_set (aggr_ptr),
> get_alias_set (lhs)))
> {
> - vect_ptr_type
> - = build_pointer_type_for_mode (vectype,
> - TYPE_MODE (vect_ptr_type), true);
> - vect_ptr
> - = vect_get_new_vect_var (vect_ptr_type, vect_pointer_var,
> + aggr_ptr_type
> + = build_pointer_type_for_mode (aggr_type,
> + TYPE_MODE (aggr_ptr_type), true);
> + aggr_ptr
> + = vect_get_new_vect_var (aggr_ptr_type, vect_pointer_var,
> get_name (base_name));
> break;
> }
> @@ -3080,7 +3086,7 @@ vect_create_data_ref_ptr (gimple stmt, s
> while (orig_stmt);
> }
>
> - add_referenced_var (vect_ptr);
> + add_referenced_var (aggr_ptr);
>
> /* Note: If the dataref is in an inner-loop nested in LOOP, and we are
> vectorizing LOOP (i.e., outer-loop vectorization), we need to create two
> @@ -3113,8 +3119,8 @@ vect_create_data_ref_ptr (gimple stmt, s
> vp2 = vp1 + step
> if () goto LOOP */
>
> - /* (2) Calculate the initial address the vector-pointer, and set
> - the vector-pointer to point to it before the loop. */
> + /* (2) Calculate the initial address of the aggregate-pointer, and set
> + the aggregate-pointer to point to it before the loop. */
>
> /* Create: (&(base[init_val+offset]) in the loop preheader. */
>
> @@ -3133,17 +3139,17 @@ vect_create_data_ref_ptr (gimple stmt, s
>
> *initial_address = new_temp;
>
> - /* Create: p = (vectype *) initial_base */
> + /* Create: p = (aggr_type *) initial_base */
> if (TREE_CODE (new_temp) != SSA_NAME
> - || !useless_type_conversion_p (vect_ptr_type, TREE_TYPE (new_temp)))
> + || !useless_type_conversion_p (aggr_ptr_type, TREE_TYPE (new_temp)))
> {
> - vec_stmt = gimple_build_assign (vect_ptr,
> - fold_convert (vect_ptr_type, new_temp));
> - vect_ptr_init = make_ssa_name (vect_ptr, vec_stmt);
> + vec_stmt = gimple_build_assign (aggr_ptr,
> + fold_convert (aggr_ptr_type, new_temp));
> + aggr_ptr_init = make_ssa_name (aggr_ptr, vec_stmt);
> /* Copy the points-to information if it exists. */
> if (DR_PTR_INFO (dr))
> - duplicate_ssa_name_ptr_info (vect_ptr_init, DR_PTR_INFO (dr));
> - gimple_assign_set_lhs (vec_stmt, vect_ptr_init);
> + duplicate_ssa_name_ptr_info (aggr_ptr_init, DR_PTR_INFO (dr));
> + gimple_assign_set_lhs (vec_stmt, aggr_ptr_init);
> if (pe)
> {
> new_bb = gsi_insert_on_edge_immediate (pe, vec_stmt);
> @@ -3153,19 +3159,19 @@ vect_create_data_ref_ptr (gimple stmt, s
> gsi_insert_before (gsi, vec_stmt, GSI_SAME_STMT);
> }
> else
> - vect_ptr_init = new_temp;
> + aggr_ptr_init = new_temp;
>
> - /* (3) Handle the updating of the vector-pointer inside the loop.
> + /* (3) Handle the updating of the aggregate-pointer inside the loop.
> This is needed when ONLY_INIT is false, and also when AT_LOOP is the
> inner-loop nested in LOOP (during outer-loop vectorization). */
>
> /* No update in loop is required. */
> if (only_init && (!loop_vinfo || at_loop == loop))
> - vptr = vect_ptr_init;
> + aptr = aggr_ptr_init;
> else
> {
> - /* The step of the vector pointer is the Vector Size. */
> - tree step = TYPE_SIZE_UNIT (vectype);
> + /* The step of the aggregate pointer is the type size. */
> + tree step = TYPE_SIZE_UNIT (aggr_type);
> /* One exception to the above is when the scalar step of the load in
> LOOP is zero. In this case the step here is also zero. */
> if (*inv_p)
> @@ -3175,9 +3181,9 @@ vect_create_data_ref_ptr (gimple stmt, s
>
> standard_iv_increment_position (loop, &incr_gsi, &insert_after);
>
> - create_iv (vect_ptr_init,
> - fold_convert (vect_ptr_type, step),
> - vect_ptr, loop, &incr_gsi, insert_after,
> + create_iv (aggr_ptr_init,
> + fold_convert (aggr_ptr_type, step),
> + aggr_ptr, loop, &incr_gsi, insert_after,
> &indx_before_incr, &indx_after_incr);
> incr = gsi_stmt (incr_gsi);
> set_vinfo_for_stmt (incr, new_stmt_vec_info (incr, loop_vinfo, NULL));
> @@ -3191,14 +3197,14 @@ vect_create_data_ref_ptr (gimple stmt, s
> if (ptr_incr)
> *ptr_incr = incr;
>
> - vptr = indx_before_incr;
> + aptr = indx_before_incr;
> }
>
> if (!nested_in_vect_loop || only_init)
> - return vptr;
> + return aptr;
>
>
> - /* (4) Handle the updating of the vector-pointer inside the inner-loop
> + /* (4) Handle the updating of the aggregate-pointer inside the inner-loop
> nested in LOOP, if exists. */
>
> gcc_assert (nested_in_vect_loop);
> @@ -3206,7 +3212,7 @@ vect_create_data_ref_ptr (gimple stmt, s
> {
> standard_iv_increment_position (containing_loop, &incr_gsi,
> &insert_after);
> - create_iv (vptr, fold_convert (vect_ptr_type, DR_STEP (dr)), vect_ptr,
> + create_iv (aptr, fold_convert (aggr_ptr_type, DR_STEP (dr)), aggr_ptr,
> containing_loop, &incr_gsi, insert_after, &indx_before_incr,
> &indx_after_incr);
> incr = gsi_stmt (incr_gsi);
> @@ -3674,8 +3680,9 @@ vect_setup_realignment (gimple stmt, gim
>
> gcc_assert (!compute_in_loop);
> vec_dest = vect_create_destination_var (scalar_dest, vectype);
> - ptr = vect_create_data_ref_ptr (stmt, loop_for_initial_load, NULL_TREE,
> - &init_addr, NULL, &inc, true, &inv_p);
> + ptr = vect_create_data_ref_ptr (stmt, vectype, loop_for_initial_load,
> + NULL_TREE, &init_addr, NULL, &inc,
> + true, &inv_p);
> new_stmt = gimple_build_assign_with_ops
> (BIT_AND_EXPR, NULL_TREE, ptr,
> build_int_cst (TREE_TYPE (ptr),
> Index: gcc/tree-vect-stmts.c
> ===================================================================
> --- gcc/tree-vect-stmts.c 2011-04-12 11:55:07.000000000 +0100
> +++ gcc/tree-vect-stmts.c 2011-04-12 11:55:07.000000000 +0100
> @@ -3581,9 +3581,9 @@ vectorizable_store (gimple stmt, gimple_
> /* We should have catched mismatched types earlier. */
> gcc_assert (useless_type_conversion_p (vectype,
> TREE_TYPE (vec_oprnd)));
> - dataref_ptr = vect_create_data_ref_ptr (first_stmt, NULL, NULL_TREE,
> - &dummy, gsi, &ptr_incr, false,
> - &inv_p);
> + dataref_ptr = vect_create_data_ref_ptr (first_stmt, vectype, NULL,
> + NULL_TREE, &dummy, gsi,
> + &ptr_incr, false, &inv_p);
> gcc_assert (bb_vinfo || !inv_p);
> }
> else
> @@ -4109,9 +4109,9 @@ vectorizable_load (gimple stmt, gimple_s
> {
> /* 1. Create the vector pointer update chain. */
> if (j == 0)
> - dataref_ptr = vect_create_data_ref_ptr (first_stmt, at_loop, offset,
> - &dummy, gsi, &ptr_incr, false,
> - &inv_p);
> + dataref_ptr = vect_create_data_ref_ptr (first_stmt, vectype, at_loop,
> + offset, &dummy, gsi,
> + &ptr_incr, false, &inv_p);
> else
> dataref_ptr =
> bump_vector_ptr (dataref_ptr, ptr_incr, gsi, stmt, NULL_TREE);
>
next prev parent reply other threads:[~2011-04-12 13:30 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-12 13:21 [0/9] Direct support for loads and stores of interleaved vectors Richard Sandiford
2011-04-12 13:25 ` [1/9] Generalise vect_create_data_ref_ptr Richard Sandiford
2011-04-12 13:30 ` Richard Guenther [this message]
2011-04-12 13:28 ` [2/9] Reindent parts of vectorizable_load and vectorizable_store Richard Sandiford
2011-04-12 13:33 ` Richard Guenther
2011-04-12 14:39 ` Richard Sandiford
2011-04-12 13:40 ` [3/9] STMT_VINFO_RELATED_STMT handling in vectorizable_store Richard Sandiford
2011-04-17 10:25 ` Ira Rosen
2011-04-12 13:44 ` [4/9] Move power-of-two checks for interleaving Richard Sandiford
2011-04-12 13:57 ` Richard Guenther
2011-04-12 13:59 ` [5/9] Main target-independent support for direct interleaving Richard Sandiford
2011-04-17 14:26 ` Ira Rosen
2011-04-18 11:54 ` Richard Guenther
2011-04-18 11:57 ` Richard Sandiford
2011-04-18 12:54 ` Richard Guenther
2011-04-18 12:58 ` Richard Sandiford
2011-04-18 13:22 ` Richard Guenther
2011-04-12 14:01 ` [6/9] NEON vec_load_lanes and vec_store_lanes patterns Richard Sandiford
2011-04-15 13:20 ` Richard Earnshaw
2011-04-12 14:14 ` [7/9] Testsuite: remove vect_{extract_even_odd,strided}_wide Richard Sandiford
2011-04-15 12:43 ` Richard Guenther
2011-04-12 14:19 ` [8/9] Testsuite: split tests for strided accesses Richard Sandiford
2011-04-15 12:44 ` Richard Guenther
2011-04-12 14:29 ` [9/9] Testsuite: Replace vect_strided with vect_stridedN Richard Sandiford
2011-04-15 12:44 ` Richard Guenther
2011-04-12 14:34 ` [10/9] Add tests for stride-3 accesses Richard Sandiford
2011-04-15 12:45 ` Richard Guenther
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=BANLkTimBU0f9Y8rioqP1GQ8D8R2jCintGA@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=patches@linaro.org \
--cc=richard.sandiford@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).