mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 17:40:46 +08:00
re PR tree-optimization/48694 (possible memory hog bug)
2011-04-26 Richard Guenther <rguenther@suse.de> PR middle-end/48694 * tree.h (OEP_CONSTANT_ADDRESS_OF): New operand_equal_flag. * fold-const.c (operand_equal_p): For TREE_CONSTANT ADDR_EXPRs compare the operands with OEP_CONSTANT_ADDRESS_OF. Treat trees with TREE_SIDE_EFFECTS equal when OEP_CONSTANT_ADDRESS_OF is set. * gcc.dg/torture/pr48694-1.c: New testcase. * gcc.dg/torture/pr48694-2.c: Likewise. From-SVN: r172954
This commit is contained in:
parent
0d467c0bf2
commit
ad0e2567d6
gcc
@ -2473,9 +2473,12 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
|
||||
equal if they have no side effects. If we have two identical
|
||||
expressions with side effects that should be treated the same due
|
||||
to the only side effects being identical SAVE_EXPR's, that will
|
||||
be detected in the recursive calls below. */
|
||||
be detected in the recursive calls below.
|
||||
If we are taking an invariant address of two identical objects
|
||||
they are necessarily equal as well. */
|
||||
if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
|
||||
&& (TREE_CODE (arg0) == SAVE_EXPR
|
||||
|| (flags & OEP_CONSTANT_ADDRESS_OF)
|
||||
|| (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
|
||||
return 1;
|
||||
|
||||
@ -2538,7 +2541,8 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
|
||||
|
||||
case ADDR_EXPR:
|
||||
return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
|
||||
0);
|
||||
TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)
|
||||
? OEP_CONSTANT_ADDRESS_OF : 0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1,3 +1,9 @@
|
||||
2011-04-26 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/48694
|
||||
* gcc.dg/torture/pr48694-1.c: New testcase.
|
||||
* gcc.dg/torture/pr48694-2.c: Likewise.
|
||||
|
||||
2011-04-25 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
* g++.dg/ext/underlying_type1.C: New.
|
||||
|
14
gcc/testsuite/gcc.dg/torture/pr48694-1.c
Normal file
14
gcc/testsuite/gcc.dg/torture/pr48694-1.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
extern volatile int g_89[5][9];
|
||||
extern int g, *gp;
|
||||
void func_64()
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < 1; )
|
||||
{
|
||||
for (g = 0; g < 1; )
|
||||
return;
|
||||
gp = (int *)&g_89[g][0];
|
||||
}
|
||||
}
|
20
gcc/testsuite/gcc.dg/torture/pr48694-2.c
Normal file
20
gcc/testsuite/gcc.dg/torture/pr48694-2.c
Normal file
@ -0,0 +1,20 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
extern volatile int g_4[1][4];
|
||||
extern int g_7;
|
||||
void modify(int *);
|
||||
void func_2()
|
||||
{
|
||||
int l_46 = 4;
|
||||
if (g_7)
|
||||
modify(&l_46);
|
||||
else
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i != 5; i += 1)
|
||||
{
|
||||
volatile int *vp = &g_4[0][l_46];
|
||||
*vp = 0;
|
||||
}
|
||||
}
|
||||
}
|
@ -5118,7 +5118,8 @@ extern tree fold_fma (location_t, tree, tree, tree, tree);
|
||||
enum operand_equal_flag
|
||||
{
|
||||
OEP_ONLY_CONST = 1,
|
||||
OEP_PURE_SAME = 2
|
||||
OEP_PURE_SAME = 2,
|
||||
OEP_CONSTANT_ADDRESS_OF = 4
|
||||
};
|
||||
|
||||
extern int operand_equal_p (const_tree, const_tree, unsigned int);
|
||||
|
Loading…
x
Reference in New Issue
Block a user