re PR tree-optimization/28410 (Wrong aliasing with global var grouping during call clobbering)

PR 28410
	* tree-ssa-operands.c (access_can_touch_variable): Update
	comment.
	Return true if ALIAS is .GLOBAL_VAR.

testsuite/ChangeLog

	PR 28410
	* gcc.dg/tree-ssa/pr28410.c: New test.

From-SVN: r115564
This commit is contained in:
Diego Novillo 2006-07-18 17:27:57 +00:00 committed by Diego Novillo
parent 492b73bda9
commit 548a6c6d0e
4 changed files with 45 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2006-07-18 Diego Novillo <dnovillo@redhat.com>
PR 28410
* tree-ssa-operands.c (access_can_touch_variable): Update
comment.
Return true if ALIAS is .GLOBAL_VAR.
2006-07-18 David Daney <ddaney@avtrex.com>
* gcc.c (display_help): Fix typo in help text.

View File

@ -1,3 +1,8 @@
2006-07-18 Diego Novillo <dnovillo@redhat.com>
PR 28410
* gcc.dg/tree-ssa/pr28410.c: New test.
2006-07-18 Lee Millward <lee.millward@gmail.com>
PR c++/28258

View File

@ -0,0 +1,26 @@
/* { dg-do run } */
/* { dg-options "-O2 --param global-var-threshold=1" } */
extern void abort(void);
struct Bar { int p; };
struct Foo { struct Bar *p; };
struct Bar p0 = { 0 };
struct Bar p1 = { 1 };
void bar(struct Foo *f)
{
f->p = &p0;
}
int foo(struct Foo *f)
{
f->p->p = 1;
bar(f);
return f->p->p;
}
int main()
{
struct Foo f;
f.p = &p1;
if (foo(&f) != 0)
abort ();
return 0;
}

View File

@ -1037,9 +1037,7 @@ append_v_must_def (tree var)
/* REF is a tree that contains the entire pointer dereference
expression, if available, or NULL otherwise. ALIAS is the variable
we are asking if REF can access. OFFSET and SIZE come from the
memory access expression that generated this virtual operand.
FOR_CLOBBER is true is this is adding a virtual operand for a call
clobber. */
memory access expression that generated this virtual operand. */
static bool
access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
@ -1049,6 +1047,12 @@ access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
unsigned HOST_WIDE_INT uoffset = (unsigned HOST_WIDE_INT) offset;
tree base = ref ? get_base_address (ref) : NULL;
/* If ALIAS is .GLOBAL_VAR then the memory reference REF must be
using a call-clobbered memory tag. By definition, call-clobbered
memory tags can always touch .GLOBAL_VAR. */
if (alias == global_var)
return true;
/* If ALIAS is an SFT, it can't be touched if the offset
and size of the access is not overlapping with the SFT offset and
size. This is only true if we are accessing through a pointer