On Mon, 7 Nov 2016, Jakub Jelinek wrote:

> On Mon, Nov 07, 2016 at 01:17:25PM +0100, Richard Biener wrote:
> > 
> > The following fixes phiopt to not introduce undefined behavior
> > in its abs replacement code in case we negate only positive values
> > in the original code.
> > 
> > Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
> > 
> > Richard.
> > 
> > 2016-11-07  Richard Biener  <rguent...@suse.de>
> > 
> >     PR tree-optimization/78228
> >     * tree-ssa-phiopt.c (abs_replacement): Avoid introducing
> >     undefined behavior.
> > 
> >     * gcc.dg/tree-ssa/phi-opt-15.c: New testcase.
> > 
> > Index: gcc/tree-ssa-phiopt.c
> > ===================================================================
> > --- gcc/tree-ssa-phiopt.c   (revision 241891)
> > +++ gcc/tree-ssa-phiopt.c   (working copy)
> > @@ -1453,6 +1453,14 @@ abs_replacement (basic_block cond_bb, ba
> >    else
> >      negate = false;
> >  
> > +  /* If the code negates only iff positive then make sure to not
> > +     introduce undefined behavior when negating or computing the absolute.
> > +     ???  We could use range info if present to check for arg1 == INT_MIN. 
> >  */
> 
> Perhaps just
> 
> > +  if (negate
> > +      && (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg1))
> > +     && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))))
>     {
>       wide_int minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (arg1)));
>       if (!expr_not_equal_to (arg1, minv))
>       return false;
>     }
> ?

rather wi::min_value (TREE_TYPE (arg1), SIGNED) I guess.  Didn't know
of expr_not_equal_to, seems to be only used from i386.c at the moment.

We can improve things on trunk but I'd prefer to be safe on the 
branch(es).

Richard.

Reply via email to