public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PING] Re: [PATCH] tree-optimization/100810 - avoid undefs in IVOPT rewrites
@ 2022-04-19 11:06 Richard Biener
  2022-04-25  7:53 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Richard Biener @ 2022-04-19 11:06 UTC (permalink / raw)
  To: gcc-patches; +Cc: roger, bin.cheng

On Fri, 1 Apr 2022, Richard Biener wrote:

> The following attempts to avoid IVOPTs rewriting uses using
> IV candidates that involve undefined behavior by using uninitialized
> SSA names.  First we restrict the set of candidates we produce
> for such IVs to the original ones and mark them as not important.
> Second we try to only allow expressing uses with such IV if they
> originally use them.  That is to avoid rewriting all such uses
> in terms of other IVs.  Since cand->iv and use->iv seem to never
> exactly match up we resort to comparing the IV bases.
> 
> The approach ends up similar to the one posted by Roger at
> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578441.html
> but it marks IV candidates rather than use groups and the cases
> we allow in determine_group_iv_cost_generic are slightly different.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu.
> 
> OK for trunk?

Ping?  Any opinions?

Thanks,
Richard.

> Thanks,
> Richard.
> 
> 2022-01-04  Richard Biener  <rguenther@suse.de>
> 
> 	PR tree-optimization/100810
> 	* tree-ssa-loop-ivopts.cc (struct iv_cand): Add involves_undefs flag.
> 	(find_ssa_undef): New function.
> 	(add_candidate_1): Avoid adding derived candidates with
> 	undefined SSA names and mark the original ones.
> 	(determine_group_iv_cost_generic): Reject rewriting
> 	uses with a different IV when that involves undefined SSA names.
> 
> 	* gcc.dg/torture/pr100810.c: New testcase.
> ---
>  gcc/testsuite/gcc.dg/torture/pr100810.c | 34 +++++++++++++++++++++++++
>  gcc/tree-ssa-loop-ivopts.cc             | 31 ++++++++++++++++++++++
>  2 files changed, 65 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/torture/pr100810.c
> 
> diff --git a/gcc/testsuite/gcc.dg/torture/pr100810.c b/gcc/testsuite/gcc.dg/torture/pr100810.c
> new file mode 100644
> index 00000000000..63566f530f7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/torture/pr100810.c
> @@ -0,0 +1,34 @@
> +/* { dg-do run } */
> +
> +int a, b = 1, c = 1, e, f = 1, g, h, j;
> +volatile int d;
> +static void k()
> +{
> +  int i;
> +  h = b;
> +  if (c && a >= 0) {
> +      while (a) {
> +	  i++;
> +	  h--;
> +      }
> +      if (g)
> +	for (h = 0; h < 2; h++)
> +	  ;
> +      if (!b)
> +	i &&d;
> +  }
> +}
> +static void l()
> +{
> +  for (; j < 1; j++)
> +    if (!e && c && f)
> +      k();
> +}
> +int main()
> +{
> +  if (f)
> +    l();
> +  if (h != 1)
> +    __builtin_abort();
> +  return 0;
> +}
> diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> index 935d2d4d8f3..b0305c494cd 100644
> --- a/gcc/tree-ssa-loop-ivopts.cc
> +++ b/gcc/tree-ssa-loop-ivopts.cc
> @@ -452,6 +452,7 @@ struct iv_cand
>    unsigned id;		/* The number of the candidate.  */
>    bool important;	/* Whether this is an "important" candidate, i.e. such
>  			   that it should be considered by all uses.  */
> +  bool involves_undefs; /* Whether the IV involves undefined values.  */
>    ENUM_BITFIELD(iv_position) pos : 8;	/* Where it is computed.  */
>    gimple *incremented_at;/* For original biv, the statement where it is
>  			   incremented.  */
> @@ -3068,6 +3069,19 @@ get_loop_invariant_expr (struct ivopts_data *data, tree inv_expr)
>    return *slot;
>  }
>  
> +/* Find the first undefined SSA name in *TP.  */
> +
> +static tree
> +find_ssa_undef (tree *tp, int *walk_subtrees, void *)
> +{
> +  if (TREE_CODE (*tp) == SSA_NAME
> +      && ssa_undefined_value_p (*tp, false))
> +    return *tp;
> +  if (!EXPR_P (*tp))
> +    *walk_subtrees = 0;
> +  return NULL;
> +}
> +
>  /* Adds a candidate BASE + STEP * i.  Important field is set to IMPORTANT and
>     position to POS.  If USE is not NULL, the candidate is set as related to
>     it.  If both BASE and STEP are NULL, we add a pseudocandidate for the
> @@ -3095,6 +3109,17 @@ add_candidate_1 (struct ivopts_data *data, tree base, tree step, bool important,
>    if (flag_keep_gc_roots_live && POINTER_TYPE_P (TREE_TYPE (base)))
>      return NULL;
>  
> +  /* If BASE contains undefined SSA names make sure we only record
> +     the original IV.  */
> +  bool involves_undefs = false;
> +  if (walk_tree (&base, find_ssa_undef, NULL, NULL))
> +    {
> +      if (pos != IP_ORIGINAL)
> +	return NULL;
> +      important = false;
> +      involves_undefs = true;
> +    }
> +
>    /* For non-original variables, make sure their values are computed in a type
>       that does not invoke undefined behavior on overflows (since in general,
>       we cannot prove that these induction variables are non-wrapping).  */
> @@ -3143,6 +3168,7 @@ add_candidate_1 (struct ivopts_data *data, tree base, tree step, bool important,
>  	  cand->var_after = cand->var_before;
>  	}
>        cand->important = important;
> +      cand->involves_undefs = involves_undefs;
>        cand->incremented_at = incremented_at;
>        cand->doloop_p = doloop;
>        data->vcands.safe_push (cand);
> @@ -4956,6 +4982,11 @@ determine_group_iv_cost_generic (struct ivopts_data *data,
>       the candidate.  */
>    if (cand->pos == IP_ORIGINAL && cand->incremented_at == use->stmt)
>      cost = no_cost;
> +  /* If the IV candidate involves undefined SSA values and is not the
> +     same IV as on the USE avoid using that candidate here.  */
> +  else if (cand->involves_undefs
> +	   && (!use->iv || !operand_equal_p (cand->iv->base, use->iv->base, 0)))
> +    return false;
>    else
>      cost = get_computation_cost (data, use, cand, false,
>  				 &inv_vars, NULL, &inv_expr);
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PING] Re: [PATCH] tree-optimization/100810 - avoid undefs in IVOPT rewrites
  2022-04-19 11:06 [PING] Re: [PATCH] tree-optimization/100810 - avoid undefs in IVOPT rewrites Richard Biener
@ 2022-04-25  7:53 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2022-04-25  7:53 UTC (permalink / raw)
  To: Richard Biener; +Cc: GCC Patches, bin.cheng, Roger Sayle

On Tue, Apr 19, 2022 at 1:06 PM Richard Biener via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Fri, 1 Apr 2022, Richard Biener wrote:
>
> > The following attempts to avoid IVOPTs rewriting uses using
> > IV candidates that involve undefined behavior by using uninitialized
> > SSA names.  First we restrict the set of candidates we produce
> > for such IVs to the original ones and mark them as not important.
> > Second we try to only allow expressing uses with such IV if they
> > originally use them.  That is to avoid rewriting all such uses
> > in terms of other IVs.  Since cand->iv and use->iv seem to never
> > exactly match up we resort to comparing the IV bases.
> >
> > The approach ends up similar to the one posted by Roger at
> > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/578441.html
> > but it marks IV candidates rather than use groups and the cases
> > we allow in determine_group_iv_cost_generic are slightly different.
> >
> > Bootstrapped and tested on x86_64-unknown-linux-gnu.
> >
> > OK for trunk?
>
> Ping?  Any opinions?

I have now pushed the patch.

Richard.

> Thanks,
> Richard.
>
> > Thanks,
> > Richard.
> >
> > 2022-01-04  Richard Biener  <rguenther@suse.de>
> >
> >       PR tree-optimization/100810
> >       * tree-ssa-loop-ivopts.cc (struct iv_cand): Add involves_undefs flag.
> >       (find_ssa_undef): New function.
> >       (add_candidate_1): Avoid adding derived candidates with
> >       undefined SSA names and mark the original ones.
> >       (determine_group_iv_cost_generic): Reject rewriting
> >       uses with a different IV when that involves undefined SSA names.
> >
> >       * gcc.dg/torture/pr100810.c: New testcase.
> > ---
> >  gcc/testsuite/gcc.dg/torture/pr100810.c | 34 +++++++++++++++++++++++++
> >  gcc/tree-ssa-loop-ivopts.cc             | 31 ++++++++++++++++++++++
> >  2 files changed, 65 insertions(+)
> >  create mode 100644 gcc/testsuite/gcc.dg/torture/pr100810.c
> >
> > diff --git a/gcc/testsuite/gcc.dg/torture/pr100810.c b/gcc/testsuite/gcc.dg/torture/pr100810.c
> > new file mode 100644
> > index 00000000000..63566f530f7
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.dg/torture/pr100810.c
> > @@ -0,0 +1,34 @@
> > +/* { dg-do run } */
> > +
> > +int a, b = 1, c = 1, e, f = 1, g, h, j;
> > +volatile int d;
> > +static void k()
> > +{
> > +  int i;
> > +  h = b;
> > +  if (c && a >= 0) {
> > +      while (a) {
> > +       i++;
> > +       h--;
> > +      }
> > +      if (g)
> > +     for (h = 0; h < 2; h++)
> > +       ;
> > +      if (!b)
> > +     i &&d;
> > +  }
> > +}
> > +static void l()
> > +{
> > +  for (; j < 1; j++)
> > +    if (!e && c && f)
> > +      k();
> > +}
> > +int main()
> > +{
> > +  if (f)
> > +    l();
> > +  if (h != 1)
> > +    __builtin_abort();
> > +  return 0;
> > +}
> > diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
> > index 935d2d4d8f3..b0305c494cd 100644
> > --- a/gcc/tree-ssa-loop-ivopts.cc
> > +++ b/gcc/tree-ssa-loop-ivopts.cc
> > @@ -452,6 +452,7 @@ struct iv_cand
> >    unsigned id;               /* The number of the candidate.  */
> >    bool important;    /* Whether this is an "important" candidate, i.e. such
> >                          that it should be considered by all uses.  */
> > +  bool involves_undefs; /* Whether the IV involves undefined values.  */
> >    ENUM_BITFIELD(iv_position) pos : 8;        /* Where it is computed.  */
> >    gimple *incremented_at;/* For original biv, the statement where it is
> >                          incremented.  */
> > @@ -3068,6 +3069,19 @@ get_loop_invariant_expr (struct ivopts_data *data, tree inv_expr)
> >    return *slot;
> >  }
> >
> > +/* Find the first undefined SSA name in *TP.  */
> > +
> > +static tree
> > +find_ssa_undef (tree *tp, int *walk_subtrees, void *)
> > +{
> > +  if (TREE_CODE (*tp) == SSA_NAME
> > +      && ssa_undefined_value_p (*tp, false))
> > +    return *tp;
> > +  if (!EXPR_P (*tp))
> > +    *walk_subtrees = 0;
> > +  return NULL;
> > +}
> > +
> >  /* Adds a candidate BASE + STEP * i.  Important field is set to IMPORTANT and
> >     position to POS.  If USE is not NULL, the candidate is set as related to
> >     it.  If both BASE and STEP are NULL, we add a pseudocandidate for the
> > @@ -3095,6 +3109,17 @@ add_candidate_1 (struct ivopts_data *data, tree base, tree step, bool important,
> >    if (flag_keep_gc_roots_live && POINTER_TYPE_P (TREE_TYPE (base)))
> >      return NULL;
> >
> > +  /* If BASE contains undefined SSA names make sure we only record
> > +     the original IV.  */
> > +  bool involves_undefs = false;
> > +  if (walk_tree (&base, find_ssa_undef, NULL, NULL))
> > +    {
> > +      if (pos != IP_ORIGINAL)
> > +     return NULL;
> > +      important = false;
> > +      involves_undefs = true;
> > +    }
> > +
> >    /* For non-original variables, make sure their values are computed in a type
> >       that does not invoke undefined behavior on overflows (since in general,
> >       we cannot prove that these induction variables are non-wrapping).  */
> > @@ -3143,6 +3168,7 @@ add_candidate_1 (struct ivopts_data *data, tree base, tree step, bool important,
> >         cand->var_after = cand->var_before;
> >       }
> >        cand->important = important;
> > +      cand->involves_undefs = involves_undefs;
> >        cand->incremented_at = incremented_at;
> >        cand->doloop_p = doloop;
> >        data->vcands.safe_push (cand);
> > @@ -4956,6 +4982,11 @@ determine_group_iv_cost_generic (struct ivopts_data *data,
> >       the candidate.  */
> >    if (cand->pos == IP_ORIGINAL && cand->incremented_at == use->stmt)
> >      cost = no_cost;
> > +  /* If the IV candidate involves undefined SSA values and is not the
> > +     same IV as on the USE avoid using that candidate here.  */
> > +  else if (cand->involves_undefs
> > +        && (!use->iv || !operand_equal_p (cand->iv->base, use->iv->base, 0)))
> > +    return false;
> >    else
> >      cost = get_computation_cost (data, use, cand, false,
> >                                &inv_vars, NULL, &inv_expr);
> >
>
> --
> Richard Biener <rguenther@suse.de>
> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
> Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-04-25  7:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-19 11:06 [PING] Re: [PATCH] tree-optimization/100810 - avoid undefs in IVOPT rewrites Richard Biener
2022-04-25  7:53 ` Richard Biener

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).