This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Better propagation of flags in access trees of SRA
- From: Richard Guenther <rguenther at suse dot de>
- To: Martin Jambor <mjambor at suse dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 8 Jun 2011 10:27:04 +0200 (CEST)
- Subject: Re: [PATCH] Better propagation of flags in access trees of SRA
- References: <20110607162349.GA31184@virgil.arch.suse.de>
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