On Fri, Jul 21, 2017 at 7:40 PM, Bill Schmidt <wschm...@linux.vnet.ibm.com> wrote: > 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?
Yes. Richard. > 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; >> + } >> +} >> >