aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-11-15 14:15:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-11-15 14:15:33 +0000
commitc636a4fbf67f2d5344ba102fd55896587ab189c4 (patch)
tree84e0ca38345ec33e2e9f98b27b972eab98989535
parentd0a4fd975af9cfbc0c9f23a50bdfdb484d2fc1d6 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/ipa/ipa-pta-16.c33
-rw-r--r--gcc/tree-ssa-structalias.c12
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))