Commit 9e629a80 by Joseph Myers Committed by Joseph Myers

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
parent d592f1c3
2004-07-22 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/7284
* fold-const.c (extract_muldiv_1): Do not treat signed left shift
as multiplication.
2004-07-22 Joseph S. Myers <jsm@polyomino.org.uk>
* doc/implement-c.texi: New file.
* doc/extend.texi (C Implementation): Move to there.
* doc/gcc.texi: Include implement-c.texi.
......
......@@ -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)
......
2004-07-22 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/7284
* gcc.c-torture/execute/pr7284-1.c: New test.
2004-07-22 Brian Booth <bbooth@redhat.com>
* gcc.dg/tree-ssa/20040721-1.c: New test.
......
/* Signed left-shift is implementation-defined in C89 (and see
DR#081), not undefined. Bug 7284 from Al Grant (AlGrant at
myrealbox.com). */
/* { dg-options "-std=c89" } */
extern void abort (void);
extern void exit (int);
int
f (int n)
{
return (n << 24) / (1 << 23);
}
volatile int x = 128;
int
main (void)
{
if (f(x) != -256)
abort ();
exit (0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment