On Wed, Oct 21, 2020 at 10:50 AM Aldy Hernandez <al...@redhat.com> wrote:
>
>
>
> On 10/21/20 9:59 AM, Richard Biener wrote:
>
> >>>     /* Even for valid range info, sometimes overflow flag will leak in.
> >>>        As GIMPLE IL should have no constants with TREE_OVERFLOW set, we
> >>>        drop them.  */
> >>>     if (TREE_OVERFLOW_P (*min))
> >>>       *min = drop_tree_overflow (*min);
> >>>     if (TREE_OVERFLOW_P (*max))
> >>>       *max = drop_tree_overflow (*max);
> >>
> >> Interesting.
> >>
> >> If these values "leaked" in.  Should they have been fixed at the source,
> >> instead of after the fact?  You mention below that every use of
> >> TREE_OVERFLOW in the ME is a bug, should we clean them up before
> >> arriving in gimple, or are there legitimate uses of it?
> >
> > There are no legitimate uses in GIMPLE.  They are (ab-)used by
> > GENERIC folding for propagating overflow (also used in FE
> > diagnostics).  Generally the better way is to use wide_ints overflow
> > handling which also "sticks".
>
> If there are no legitimate uses, perhaps we should drop them altogether
> as we go into GIMPLE??

We do, but they tend to creep back in by infrastructure using the
GENERIC folder.  Some key places make sure to clear them (I've tracked
down a lot of them).  But I was never bave enough to assert they do
not end up in IL operands ;)

>  I vaguely recall seeing them leak into
> value_range's.
> >
> >>>
> >>> and the code explicitly checks for overflow, doing range adjustments
> >>> accordingly.
> >>
> >> Well, not all overflows are adjusted:
> >>
> >>     /* Like in PR19590, scev can return a constant function.  */
> >>     if (is_gimple_min_invariant (chrec))
> >>       {
> >>         *min = *max = chrec;
> >>         return true;
> >>       }
> >>
> >> Are these min/max not adjusted for overflow by design, or is this an
> >> oversight?
> >
> > Ah, that's an oversight here.  And yes, "fixing" it in scalar evolution
> > analysis itself (dropping the flag there) would be best
>
> Excellent.  I've pushed the patch below after testing it.
>
> Thanks again.
> Aldy
>
>      Adjust overflow for invariants in bounds_of_var_in_loop.
>
>      Invariants returned from SCEV can have TREE_OVERFLOW set.  Clear the
>      overflow as we do with the rest of the values returned from this
>      function.
>
>      gcc/ChangeLog:
>
>              * gimple-range.cc
> (gimple_ranger::range_of_ssa_name_with_loop_info):
>              Remove TREE_OVERFLOW special case.
>              * vr-values.c (bounds_of_var_in_loop): Adjust overflow for
>              invariants.
>
> diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
> index b790d62d75f..c5520e0700b 100644
> --- a/gcc/gimple-range.cc
> +++ b/gcc/gimple-range.cc
> @@ -1156,9 +1156,9 @@ gimple_ranger::range_of_ssa_name_with_loop_info
> (irange &r, tree name,
>         // ?? We could do better here.  Since MIN/MAX can only be an
>         // SSA, SSA +- INTEGER_CST, or INTEGER_CST, we could easily call
>         // the ranger and solve anything not an integer.
> -      if (TREE_CODE (min) != INTEGER_CST || TREE_OVERFLOW (min))
> +      if (TREE_CODE (min) != INTEGER_CST)
>         min = vrp_val_min (type);
> -      if (TREE_CODE (max) != INTEGER_CST || TREE_OVERFLOW (max))
> +      if (TREE_CODE (max) != INTEGER_CST)
>         max = vrp_val_max (type);
>         r.set (min, max);
>       }
> diff --git a/gcc/vr-values.c b/gcc/vr-values.c
> index cc0ddca2bd3..7a0e70eab64 100644
> --- a/gcc/vr-values.c
> +++ b/gcc/vr-values.c
> @@ -1844,7 +1844,7 @@ bounds_of_var_in_loop (tree *min, tree *max,
> range_query *query,
>     if (is_gimple_min_invariant (chrec))
>       {
>         *min = *max = chrec;
> -      return true;
> +      goto fix_overflow;
>       }
>
>     if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
> @@ -1964,6 +1964,7 @@ bounds_of_var_in_loop (tree *min, tree *max,
> range_query *query,
>     else
>       *min = init;
>
> + fix_overflow:
>     /* Even for valid range info, sometimes overflow flag will leak in.
>        As GIMPLE IL should have no constants with TREE_OVERFLOW set, we
>        drop them.  */
>

Reply via email to