This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch]Update new_type_alias
- From: Keith Besaw <kbesaw at us dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 8 Jun 2005 20:17:05 -0500
- Subject: Re: [patch]Update new_type_alias
This patch (http://gcc.gnu.org/ml/gcc-patches/2005-06/msg00445.html)
appears
to fix PR21933 and some ICEs in SPEC.
Keith
gcc-patches-owner@gcc.gnu.org wrote on 06/06/2005 03:29:43 AM:
> new_type_alias (tree ptr, tree var) is being called by the vectorizer to
> construct a
> type tag for a pointer PTR that holds the address of the array VAR. The
> new type tag
> currently gets a may_aliases list that is a copy of the may_aliases of
the
> array VAR.
> With this change, if VAR has a single may_aliases which is a type tag
then
> instead
> of constructing a new type tag for PTR, the type tag from VAR's
> may_aliases is
> assigned to the type_mem_tag PTR.
>
> As an example, from read-arch.c in the SPEC vpr benchmark.
>
> Before Vectorization a loop contains the following statement:
>
> # TMT.643D.7803_38 = V_MAY_DEF <TMT.643D.7803_26>;
> isreadD.4001[iD.4093_444] = 0;
>
> isrreadD.4001 has a single member in its may_aliases list
> TMT.643D.7803. After vectorization, the array element reference
> to isread is replaced with an INDIRECT_REF to a pointer to vector.
> The version of new_type_alias assigns the tag TMT.643D.7803 to the
> type_mem_tag of the pointer which keeps the aliasing identical.
> debug_generic_stmt shows the replacement vectorized statement as:
>
> # TMT.643D.7803_38 = V_MAY_DEF <TMT.643D.7803_26>;
> *vect_pisread.681D.7944_502 = vect_cst_.680D.7943_509;
>
> There are uses of array isread after the vectorized loop which
> continue to use the type memory tag.
> For example.
>
> # VUSE <TMT.643D.7803_230>;
> D.4379_651 = isreadD.4001[4];
>
> tested on ppc
>
> OK for mainline?
>
> Keith
>
> Changelog:
>
> 2005-06-03 Keith Besaw <kbesaw@us.ibm.com>
>
> * tree-ssa-alias.c (new_type_alias): Use existing type
> tag if VAR has just one in its may_aliases list.
>
> Index: tree-ssa-alias.c
> ===================================================================
> RCS file: /cvsroot/gcc/gcc/gcc/tree-ssa-alias.c,v
> retrieving revision 2.93
> diff -u -3 -p -r2.93 tree-ssa-alias.c
> --- tree-ssa-alias.c 29 May 2005 13:14:42 -0000 2.93
> +++ tree-ssa-alias.c 3 Jun 2005 23:51:40 -0000
> @@ -2776,8 +2776,11 @@ found_tag:
> }
>
>
> -/* Create a type tag for PTR. Construct the may-alias list of this
type
> tag
> - so that it has the aliasing of VAR. */
> +/* Create a new type tag for PTR. Construct the may-alias list of this
> type
> + tag so that it has the aliasing of VAR.
> +
> + Note, the set of aliases represented by the new type tag are not
> marked
> + for renaming. */
>
> void
> new_type_alias (tree ptr, tree var)
> @@ -2790,22 +2793,50 @@ new_type_alias (tree ptr, tree var)
>
> gcc_assert (p_ann->type_mem_tag == NULL_TREE);
> gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG);
> - tag = create_memory_tag (tag_type, true);
> - p_ann->type_mem_tag = tag;
>
> /* Add VAR to the may-alias set of PTR's new type tag. If VAR has
> subvars, add the subvars to the tag instead of the actual var. */
> if (var_can_have_subvars (var)
> && (svars = get_subvars_for_var (var)))
> {
> - subvar_t sv;
> + subvar_t sv;
> + tag = create_memory_tag (tag_type, true);
> + p_ann->type_mem_tag = tag;
> +
> for (sv = svars; sv; sv = sv->next)
> add_may_alias (tag, sv->var);
> }
> else
> - add_may_alias (tag, var);
> -
> - /* Note, TAG and its set of aliases are not marked for renaming. */
> + {
> + /* The following is based on code in add_stmt_operand to ensure
> that the
> + same defs/uses/vdefs/vuses will be found after replacing a
> reference
> + to var (or ARRAY_REF to var) with an INDIRECT_REF to ptr whose
> value
> + is the address of var. */
> + varray_type aliases = v_ann->may_aliases;
> +
> + if ((aliases != NULL)
> + && (VARRAY_ACTIVE_SIZE (aliases) == 1))
> + {
> + tree ali = VARRAY_TREE (aliases, 0);
> + if (get_var_ann (ali)->mem_tag_kind == TYPE_TAG)
> + {
> + p_ann->type_mem_tag = ali;
> + return;
> + }
> + }
> +
> + tag = create_memory_tag (tag_type, true);
> + p_ann->type_mem_tag = tag;
> +
> + if (aliases == NULL)
> + add_may_alias (tag, var);
> + else
> + {
> + size_t i;
> + for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
> + add_may_alias (tag, VARRAY_TREE (aliases, i));
> + }
> + }
> }
>
>
>