diff options
author | Richard Guenther <rguenther@suse.de> | 2010-11-15 14:15:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-11-15 14:15:33 +0000 |
commit | c636a4fbf67f2d5344ba102fd55896587ab189c4 (patch) | |
tree | 84e0ca38345ec33e2e9f98b27b972eab98989535 | |
parent | d0a4fd975af9cfbc0c9f23a50bdfdb484d2fc1d6 (diff) | |
download | gcc-c636a4fbf67f2d5344ba102fd55896587ab189c4.zip gcc-c636a4fbf67f2d5344ba102fd55896587ab189c4.tar.gz gcc-c636a4fbf67f2d5344ba102fd55896587ab189c4.tar.bz2 |
re PR tree-optimization/46467 (gcc.dg/torture/pta-structcopy-1.c FAILs with -fipa-pta without inlining)
2010-11-15 Richard Guenther <rguenther@suse.de>
PR tree-optimization/46467
* tree-ssa-structalias.c (do_structure_copy): Properly treat
variables without subvars.
* gcc.dg/ipa/ipa-pta-16.c: New testcase.
From-SVN: r166755
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c | 33 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 12 |
4 files changed, 52 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 613abf2..ad2aecf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-15 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46467 + * tree-ssa-structalias.c (do_structure_copy): Properly treat + variables without subvars. + 2010-11-15 Hariharan Sandanagobalane <hariharan@picochip.com> * config/picochip/picochip.c (file header): Picochip name change. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c051b3..bad83cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-11-15 Richard Guenther <rguenther@suse.de> + PR tree-optimization/46467 + * gcc.dg/ipa/ipa-pta-16.c: New testcase. + +2010-11-15 Richard Guenther <rguenther@suse.de> + PR testsuite/46423 * g++.dg/torture/pr34850.C: Adjust. diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c new file mode 100644 index 0000000..ef41826 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c @@ -0,0 +1,33 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-tree-sra -fipa-pta -fdump-ipa-pta" } */ + +struct X +{ + long l1; + struct Y + { + long l2; + int *p; + } y; +}; +int i; +static int __attribute__((noinline)) +foo (struct X *x) +{ + struct Y y = x->y; + *y.p = 0; + i = 1; + return *y.p; +} +extern void abort (void); +int main() +{ + struct X x; + x.y.p = &i; + if (foo(&x) != 1) + abort (); + return 0; +} + +/* { dg-final { scan-ipa-dump "y.\[0-9\]*\\\+\[0-9\]* = { i }" "pta" } } */ +/* { dg-final { cleanup-ipa-dump "pta" } } */ diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 45efd55..8c9ed6c 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -3541,11 +3541,15 @@ do_structure_copy (tree lhsop, tree rhsop) lhsv = get_varinfo (lhsp->var); rhsv = get_varinfo (rhsp->var); if (lhsv->may_have_pointers - && ranges_overlap_p (lhsv->offset + rhsoffset, lhsv->size, - rhsv->offset + lhsoffset, rhsv->size)) + && (lhsv->is_full_var + || rhsv->is_full_var + || ranges_overlap_p (lhsv->offset + rhsoffset, lhsv->size, + rhsv->offset + lhsoffset, rhsv->size))) process_constraint (new_constraint (*lhsp, *rhsp)); - if (lhsv->offset + rhsoffset + lhsv->size - > rhsv->offset + lhsoffset + rhsv->size) + if (!rhsv->is_full_var + && (lhsv->is_full_var + || (lhsv->offset + rhsoffset + lhsv->size + > rhsv->offset + lhsoffset + rhsv->size))) { ++k; if (k >= VEC_length (ce_s, rhsc)) |