diff options
author | Joseph Myers <jsm@polyomino.org.uk> | 2004-07-22 21:33:34 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2004-07-22 21:33:34 +0100 |
commit | 9e629a806df2b10c39b770dfd908b910b3664ace (patch) | |
tree | 5d92e9b1d075e3e456c4f77032271580d8312ecb /gcc/fold-const.c | |
parent | d592f1c398da37535d3c528d1a511a32d8b9b3ba (diff) | |
download | gcc-9e629a806df2b10c39b770dfd908b910b3664ace.zip gcc-9e629a806df2b10c39b770dfd908b910b3664ace.tar.gz gcc-9e629a806df2b10c39b770dfd908b910b3664ace.tar.bz2 |
re PR c/7284 (incorrectly simplifies leftshift followed by signed power-of-2 division)
PR c/7284
* fold-const.c (extract_muldiv_1): Do not treat signed left shift
as multiplication.
testsuite:
* gcc.c-torture/execute/pr7284-1.c: New test.
From-SVN: r85059
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e976117..a0d6323 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5139,8 +5139,12 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type) case LSHIFT_EXPR: case RSHIFT_EXPR: /* If the second operand is constant, this is a multiplication or floor division, by a power of two, so we can treat it that - way unless the multiplier or divisor overflows. */ + way unless the multiplier or divisor overflows. Signed + left-shift overflow is implementation-defined rather than + undefined in C90, so do not convert signed left shift into + multiplication. */ if (TREE_CODE (op1) == INTEGER_CST + && (tcode == RSHIFT_EXPR || TYPE_UNSIGNED (TREE_TYPE (op0))) /* const_binop may not detect overflow correctly, so check for it explicitly here. */ && TYPE_PRECISION (TREE_TYPE (size_one_node)) > TREE_INT_CST_LOW (op1) |