re PR middle-end/16790 (Integer down cast ignored in larger expression)

PR middle-end/16790
	* fold-const.c (extract_muldiv_1) <NOP_EXPR>: Disallow local
	truncations, not just global truncations.

	* gcc.c-torture/execute/pr16790-1.c: New test case.

From-SVN: r85506
This commit is contained in:
Roger Sayle 2004-08-03 21:24:32 +00:00 committed by Roger Sayle
parent 5357b1f9df
commit a0fac73d2b
4 changed files with 55 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2004-08-03 Roger Sayle <roger@eyesopen.com>
PR middle-end/16790
* fold-const.c (extract_muldiv_1) <NOP_EXPR>: Disallow local
truncations, not just global truncations.
2004-08-03 Andrew Pinski <apinski@apple.com>
PR bootstrap/16865

View File

@ -5102,9 +5102,9 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
&& TYPE_IS_SIZETYPE (TREE_TYPE (op0)))
&& (GET_MODE_SIZE (TYPE_MODE (ctype))
> GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0)))))
/* ... or its type is larger than ctype,
then we cannot pass through this truncation. */
|| (GET_MODE_SIZE (TYPE_MODE (ctype))
/* ... or this is a truncation (t is narrower than op0),
then we cannot pass through this narrowing. */
|| (GET_MODE_SIZE (TYPE_MODE (type))
< GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op0))))
/* ... or signedness changes for division or modulus,
then we cannot pass through this conversion. */

View File

@ -1,3 +1,8 @@
2004-08-03 Roger Sayle <roger@eyesopen.com>
PR middle-end/16790
* gcc.c-torture/execute/pr16790-1.c: New test case.
2004-08-03 Mark Mitchell <mark@codesourcery.com>
* gcc.dg/symbian1.c: New test.

View File

@ -0,0 +1,41 @@
/* PR middle-end/16790. */
extern void abort ();
static void test1(unsigned int u1)
{
unsigned int y_final_1;
signed short y_middle;
unsigned int y_final_2;
y_final_1 = (unsigned int)( (signed short)(u1 * 2) * 3 );
y_middle = (signed short)(u1 * 2);
y_final_2 = (unsigned int)( y_middle * 3 );
if (y_final_1 != y_final_2)
abort ();
}
static void test2(unsigned int u1)
{
unsigned int y_final_1;
signed short y_middle;
unsigned int y_final_2;
y_final_1 = (unsigned int)( (signed short)(u1 << 1) * 3 );
y_middle = (signed short)(u1 << 1);
y_final_2 = (unsigned int)( y_middle * 3 );
if (y_final_1 != y_final_2)
abort ();
}
int main()
{
test1(0x4000U);
test2(0x4000U);
return 0;
}