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.