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:
parent
492b73bda9
commit
548a6c6d0e
@ -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.
|
||||
|
@ -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
|
||||
|
26
gcc/testsuite/gcc.dg/tree-ssa/pr28410.c
Normal file
26
gcc/testsuite/gcc.dg/tree-ssa/pr28410.c
Normal 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;
|
||||
}
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user