Commit ad0e2567 by Richard Guenther Committed by Richard Biener

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
parent 0d467c0b
...@@ -2473,9 +2473,12 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) ...@@ -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 equal if they have no side effects. If we have two identical
expressions with side effects that should be treated the same due expressions with side effects that should be treated the same due
to the only side effects being identical SAVE_EXPR's, that will 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) if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
&& (TREE_CODE (arg0) == SAVE_EXPR && (TREE_CODE (arg0) == SAVE_EXPR
|| (flags & OEP_CONSTANT_ADDRESS_OF)
|| (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1)))) || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
return 1; return 1;
...@@ -2538,7 +2541,8 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) ...@@ -2538,7 +2541,8 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
case ADDR_EXPR: case ADDR_EXPR:
return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0), 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: default:
break; break;
} }
......
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> 2011-04-25 Paolo Carlini <paolo.carlini@oracle.com>
* g++.dg/ext/underlying_type1.C: New. * g++.dg/ext/underlying_type1.C: New.
......
/* { 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];
}
}
/* { 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); ...@@ -5118,7 +5118,8 @@ extern tree fold_fma (location_t, tree, tree, tree, tree);
enum operand_equal_flag enum operand_equal_flag
{ {
OEP_ONLY_CONST = 1, 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); extern int operand_equal_p (const_tree, const_tree, unsigned int);
......
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