diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-17 08:39:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-17 08:39:33 +0000 |
commit | f8294131788cec4ca520032073e92928fbbb06a2 (patch) | |
tree | 51735ece6cbb2b9b1ce2bad7559b4555a93ffb61 /gcc/fold-const.c | |
parent | 04f1c83099aab49f530f492b9d8119cf9d5ffcdd (diff) | |
download | gcc-f8294131788cec4ca520032073e92928fbbb06a2.zip gcc-f8294131788cec4ca520032073e92928fbbb06a2.tar.gz gcc-f8294131788cec4ca520032073e92928fbbb06a2.tar.bz2 |
re PR tree-optimization/78305 (Wrong constant folding)
2016-11-17 Richard Biener <rguenther@suse.de>
PR middle-end/78305
* fold-const.c (negate_expr_p): Fix multiplication case.
* gcc.dg/torture/pr78305.c: New testcase.
From-SVN: r242536
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c597414..f4b2cfa 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -450,13 +450,13 @@ negate_expr_p (tree t) if (TYPE_UNSIGNED (type)) break; /* INT_MIN/n * n doesn't overflow while negating one operand it does - if n is a power of two. */ + if n is a (negative) power of two. */ if (INTEGRAL_TYPE_P (TREE_TYPE (t)) && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t)) && ! ((TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST - && ! integer_pow2p (TREE_OPERAND (t, 0))) + && wi::popcount (wi::abs (TREE_OPERAND (t, 0))) != 1) || (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST - && ! integer_pow2p (TREE_OPERAND (t, 1))))) + && wi::popcount (wi::abs (TREE_OPERAND (t, 1))) != 1))) break; /* Fall through. */ |