mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-14 23:10:21 +08:00
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:
parent
5357b1f9df
commit
a0fac73d2b
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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.
|
||||
|
41
gcc/testsuite/gcc.c-torture/execute/pr16790-1.c
Normal file
41
gcc/testsuite/gcc.c-torture/execute/pr16790-1.c
Normal 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user