Hi Richard,

I would like to backport this fix to GCC 5, 6, and 7.  All have passed regstrap 
on
powerpc64le-linux-gnu (with the test case moved to gcc.dg/ubsan, of course).
Is this ok?

Thanks!

-- Bill


> On Jul 14, 2017, at 1:05 PM, Bill Schmidt <wschm...@linux.vnet.ibm.com> wrote:
> 
> Hi,
> 
> PR81162 identifies a bug in SLSR involving overflow that occurs when
> replacing a NEGATE_EXPR with a PLUS_EXPR.  This is another example
> of an unprofitable transformation that should be skipped anyway,
> hence this simple patch.  Bootstrapped and tested on
> powerpc64le-unknown-linux-gnu, committed.  Test case provided from
> the bug report.
> 
> Thanks,
> Bill
> 
> 
> [gcc]
> 
> 2016-07-14  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
> 
>       PR tree-optimization/81162
>       * gimple-ssa-strength-reduction.c (replace_mult_candidate): Don't
>       replace a negate with an add.
> 
> [gcc/testsuite]
> 
> 2016-07-14  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
> 
>       PR tree-optimization/81162
>       * gcc.dg/pr81162.c: New file.
> 
> 
> Index: gcc/gimple-ssa-strength-reduction.c
> ===================================================================
> --- gcc/gimple-ssa-strength-reduction.c       (revision 250189)
> +++ gcc/gimple-ssa-strength-reduction.c       (working copy)
> @@ -2082,13 +2082,14 @@ replace_mult_candidate (slsr_cand_t c, tree basis_
>      types but allows for safe negation without twisted logic.  */
>   if (wi::fits_shwi_p (bump)
>       && bump.to_shwi () != HOST_WIDE_INT_MIN
> -      /* It is not useful to replace casts, copies, or adds of
> +      /* It is not useful to replace casts, copies, negates, or adds of
>        an SSA name and a constant.  */
>       && cand_code != SSA_NAME
>       && !CONVERT_EXPR_CODE_P (cand_code)
>       && cand_code != PLUS_EXPR
>       && cand_code != POINTER_PLUS_EXPR
> -      && cand_code != MINUS_EXPR)
> +      && cand_code != MINUS_EXPR
> +      && cand_code != NEGATE_EXPR)
>     {
>       enum tree_code code = PLUS_EXPR;
>       tree bump_tree;
> Index: gcc/testsuite/gcc.dg/pr81162.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/pr81162.c    (nonexistent)
> +++ gcc/testsuite/gcc.dg/pr81162.c    (working copy)
> @@ -0,0 +1,17 @@
> +/* PR tree-optimization/81162 */
> +/* { dg-do run } */
> +/* { dg-options "-fsanitize=undefined -O2" } */
> +
> +short s;
> +int i1 = 1;
> +int i2 = 1;
> +unsigned char uc = 147;
> +
> +int main() {
> +  s = (-uc + 2147483647) << 0;
> +  if (9031239389974324562ULL >= (-((i1 && i2) + uc) ^ -21096) ) {
> +    return 0;
> +  } else {
> +    return -1;
> +  }
> +}
> 

Reply via email to