From 8443c80c69eb7c47cd2b66c7cd8531daeee06f18 Mon Sep 17 00:00:00 2001 From: dnovillo Date: Tue, 18 Jul 2006 17:27:57 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115564 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr28410.c | 26 ++++++++++++++++++++++++++ gcc/tree-ssa-operands.c | 10 +++++++--- 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr28410.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f64d3f2290f..435f32508eb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-07-18 Diego Novillo + + PR 28410 + * tree-ssa-operands.c (access_can_touch_variable): Update + comment. + Return true if ALIAS is .GLOBAL_VAR. + 2006-07-18 David Daney * gcc.c (display_help): Fix typo in help text. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2025aadbacc..505a2adcaf4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-07-18 Diego Novillo + + PR 28410 + * gcc.dg/tree-ssa/pr28410.c: New test. + 2006-07-18 Lee Millward PR c++/28258 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr28410.c b/gcc/testsuite/gcc.dg/tree-ssa/pr28410.c new file mode 100644 index 00000000000..12f0633020e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr28410.c @@ -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; +} diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 3cd8c45aaf1..05637814f13 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -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 -- 2.11.0