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