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 <[email protected]>
>
> 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;
}
?
Jakub