On Thu, Apr 9, 2020 at 4:23 AM bin.cheng <bin.ch...@linux.alibaba.com> wrote:
>
> ------------------------------------------------------------------
> Sender:Richard Biener <richard.guent...@gmail.com>
> Sent At:2020 Mar. 20 (Fri.) 18:12
> Recipient:bin.cheng <bin.ch...@linux.alibaba.com>
> Cc:Andrew Pinski <pins...@gmail.com>; GCC Patches <gcc-patches@gcc.gnu.org>
> Subject:Re: [PATCH PR93674]Avoid introducing IV of enumeral type in case of 
> -fstrict-enums
>
>
> On Fri, Mar 20, 2020 at 10:27 AM bin.cheng <bin.ch...@linux.alibaba.com> 
> wrote:
> >
> > ------------------------------------------------------------------
> > Sender:Richard Biener <richard.guent...@gmail.com>
> > Sent At:2020 Mar. 3 (Tue.) 17:36
> > Recipient:Andrew Pinski <pins...@gmail.com>
> > Cc:bin.cheng <bin.ch...@linux.alibaba.com>; GCC Patches 
> > <gcc-patches@gcc.gnu.org>
> > Subject:Re: [PATCH PR93674]Avoid introducing IV of enumeral type in case of 
> > -fstrict-enums
> >
> >
> > On Mon, Mar 2, 2020 at 6:14 PM Andrew Pinski <pins...@gmail.com> wrote:
> > >
> > > On Mon, Mar 2, 2020 at 1:40 AM Richard Biener
> > > <richard.guent...@gmail.com> wrote:
> > > >
> > > > On Mon, Mar 2, 2020 at 9:07 AM bin.cheng <bin.ch...@linux.alibaba.com> 
> > > > wrote:
> > > > >
> > > > > Hi,
> > > > > This is a simple fix for PR93674.  It adds cand carefully for 
> > > > > enumeral type iv_use in
> > > > > case of -fstrict-enums, it also avoids computing, replacing iv_use 
> > > > > with the candidate
> > > > > so that no IV of enumeral type is introduced with -fstrict-enums 
> > > > > option.
> > > > >
> > > > > Testcase is also added.  Bootstrap and test on x86_64.  Any comment?
> > > >
> > > > I think we should avoid enum-typed (or bool-typed) IVs in general, not 
> > > > just
> > > > with -fstrict-enums.  That said, the ENUMERAL_TYPE checks should be
> > > > !(INTEGER_TYPE || POINTER_TYPE_P) checks.
> > >
> > > Maybe even check type_has_mode_precision_p or
> > > TYPE_MIN_VALUE/TYPE_MAX_VALUE have the same as the min/max for that
> > > precision/signedness.
> >
> > Indeed we don't want non-mode precision INTEGER_TYPE IVs either.  I wouldn't
> > check TYPE_MIN/MAX_VALUE here though.
> >
> > Here is the updated patch with more checks.  I also removed the 
> > computation/elimination part for now.
>
> +  if ((TREE_CODE (basetype) != INTEGER_TYPE && !POINTER_TYPE_P (basetype))
> +      || !type_has_mode_precision_p (basetype))
> +    {
> +      if (!CONVERT_EXPR_P (iv->base))
> +       return;
> +
> +      /* Specially handle such iv_use if it's converted from other ones by
> +        adding candidate for the source iv.  */
> +      base = TREE_OPERAND (iv->base, 0);
> +      basetype = TREE_TYPE (base);
> +      if (!INTEGRAL_TYPE_P (basetype))
> +       return;
>
> I think this is too lax - you'll happily add another non-INTEGER_TYPE
> or non-mode-precision IV through this handling.  If the conversion
> is not value-preserving the IV may also be useless (also the step
> might see truncation in its type adjustment).  With a widening
> conversion there's the issue with different wrap-around behavior.
> I guess in most cases we'll not be able to use the IV if it is "bogus"
> so all this might be harmless.
>
> The original idea is to depend on the condition that the result won't be a 
> legal IV in
> case of widening.  For narrowing, it won't be a problem except what you 
> mentioned
> about non-INTEGER_TYPE or non-mode-precision issue.
>
> Was there any reason to handle this special case?  Why not simply
> do sth like
> The reason is to strength reduce (conversion) operation in RHS by introducing 
> appropriate
> candidate.
> And right, your proposed code looks better and more general.
>
> +  if ((TREE_CODE (basetype) != INTEGER_TYPE && !POINTER_TYPE_P (basetype)))
> +      || !type_has_mode_precision_p (basetype))
> +    {
>          basetype = lang_hooks.type_for_mode (TYPE_MODE (basetype),
> TYPE_UNSIGNED (basetype));
>          tree step = fold_convert (basetype, iv->step);
>          add_candidate (...);
>
> ?
>
> The following also looks bogus:
>
> +      if (basetype == generic_type_for (basetype))
> +       step = fold_convert (basetype, step);
>
> don't we add IVs in generic_type_for () and thus the conversion is
> always necessary
> anyways?  (it has the wrong type from the conversion we just stripped)
>
> This is now discarded.
> Patch updated and tested on x86_64.  Is it OK?

OK.

Richard.

> Thanks,
> bin
>
> 2020-04-09  Bin Cheng  <bin.ch...@linux.alibaba.com>
>             Richard Biener  <rguent...@suse.de>
>
>         PR tree-optimization/93674
>         * tree-ssa-loop-ivopts.c (langhooks.h): New include.
>         (add_iv_candidate_for_use): For iv_use of non integer or pointer type,
>         or non-mode precision type, add candidate in unsigned type with the
>         same precision.
>
> gcc/testsuite
> 2020-04-09  Bin Cheng  <bin.ch...@linux.alibaba.com>
>
>         PR tree-optimization/93674
>         * g++.dg/pr93674.C: New test.

Reply via email to