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]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));
> +        }
> +    }
>  }
> 
> 
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]