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; > + } > +} >