[PATCH] Better propagation of flags in access trees of SRA

Richard Guenther rguenther@suse.de
Wed Jun 8 08:31:00 GMT 2011


On Tue, 7 Jun 2011, Martin Jambor wrote:

> Hi,
> 
> the way we propagate flags in SRA access tree has evolved in an
> unfortunate way, this patch simplifies the whole thing while doing
> exactly the same thing.
> 
> Bootstrapped and tested on x86_64-linux, OK for trunk?

Ok.

Thanks,
Richard.

> Thanks,
> 
> Martin
> 
> 
> 
> 2011-06-06  Martin Jambor  <mjambor@suse.cz>
> 
> 	* tree-sra.c (mark_rw_status): Removed.
> 	(analyze_access_subtree): New parameter parent instead of
> 	mark_read and mark_write, propagate from that.
> 
> Index: src/gcc/tree-sra.c
> ===================================================================
> *** src.orig/gcc/tree-sra.c
> --- src/gcc/tree-sra.c
> *************** expr_with_var_bounded_array_refs_p (tree
> *** 1864,1871 ****
>     return false;
>   }
>   
> - enum mark_rw_status { SRA_MRRW_NOTHING, SRA_MRRW_DIRECT, SRA_MRRW_ASSIGN};
> - 
>   /* Analyze the subtree of accesses rooted in ROOT, scheduling replacements when
>      both seeming beneficial and when ALLOW_REPLACEMENTS allows it.  Also set all
>      sorts of access flags appropriately along the way, notably always set
> --- 1864,1869 ----
> *************** enum mark_rw_status { SRA_MRRW_NOTHING,
> *** 1905,1913 ****
>      1	1	1	1	Yes		Any of the above yeses  */
>   
>   static bool
> ! analyze_access_subtree (struct access *root, bool allow_replacements,
> ! 			enum mark_rw_status mark_read,
> ! 			enum mark_rw_status mark_write)
>   {
>     struct access *child;
>     HOST_WIDE_INT limit = root->offset + root->size;
> --- 1903,1910 ----
>      1	1	1	1	Yes		Any of the above yeses  */
>   
>   static bool
> ! analyze_access_subtree (struct access *root, struct access *parent,
> ! 			bool allow_replacements)
>   {
>     struct access *child;
>     HOST_WIDE_INT limit = root->offset + root->size;
> *************** analyze_access_subtree (struct access *r
> *** 1915,1943 ****
>     bool scalar = is_gimple_reg_type (root->type);
>     bool hole = false, sth_created = false;
>   
> !   if (root->grp_assignment_read)
> !     mark_read = SRA_MRRW_ASSIGN;
> !   else if (mark_read == SRA_MRRW_ASSIGN)
> !     {
> !       root->grp_read = 1;
> !       root->grp_assignment_read = 1;
> !     }
> !   else if (mark_read == SRA_MRRW_DIRECT)
> !     root->grp_read = 1;
> !   else if (root->grp_read)
> !     mark_read = SRA_MRRW_DIRECT;
> ! 
> !   if (root->grp_assignment_write)
> !     mark_write = SRA_MRRW_ASSIGN;
> !   else if (mark_write == SRA_MRRW_ASSIGN)
>       {
> !       root->grp_write = 1;
> !       root->grp_assignment_write = 1;
>       }
> -   else if (mark_write == SRA_MRRW_DIRECT)
> -     root->grp_write = 1;
> -   else if (root->grp_write)
> -     mark_write = SRA_MRRW_DIRECT;
>   
>     if (root->grp_unscalarizable_region)
>       allow_replacements = false;
> --- 1912,1928 ----
>     bool scalar = is_gimple_reg_type (root->type);
>     bool hole = false, sth_created = false;
>   
> !   if (parent)
>       {
> !       if (parent->grp_read)
> ! 	root->grp_read = 1;
> !       if (parent->grp_assignment_read)
> ! 	root->grp_assignment_read = 1;
> !       if (parent->grp_write)
> ! 	root->grp_write = 1;
> !       if (parent->grp_assignment_write)
> ! 	root->grp_assignment_write = 1;
>       }
>   
>     if (root->grp_unscalarizable_region)
>       allow_replacements = false;
> *************** analyze_access_subtree (struct access *r
> *** 1952,1960 ****
>         else
>   	covered_to += child->size;
>   
> !       sth_created |= analyze_access_subtree (child,
> ! 					     allow_replacements && !scalar,
> ! 					     mark_read, mark_write);
>   
>         root->grp_unscalarized_data |= child->grp_unscalarized_data;
>         hole |= !child->grp_covered;
> --- 1937,1944 ----
>         else
>   	covered_to += child->size;
>   
> !       sth_created |= analyze_access_subtree (child, root,
> ! 					     allow_replacements && !scalar);
>   
>         root->grp_unscalarized_data |= child->grp_unscalarized_data;
>         hole |= !child->grp_covered;
> *************** analyze_access_trees (struct access *acc
> *** 2002,2009 ****
>   
>     while (access)
>       {
> !       if (analyze_access_subtree (access, true,
> ! 				  SRA_MRRW_NOTHING, SRA_MRRW_NOTHING))
>   	ret = true;
>         access = access->next_grp;
>       }
> --- 1986,1992 ----
>   
>     while (access)
>       {
> !       if (analyze_access_subtree (access, NULL, true))
>   	ret = true;
>         access = access->next_grp;
>       }
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer


More information about the Gcc-patches mailing list