]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/19786 (Aliasing optimisation bug)
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 22 Feb 2005 02:27:37 +0000 (02:27 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 22 Feb 2005 02:27:37 +0000 (02:27 +0000)
gcc/ChangeLog:
PR tree-optimization/19786
* tree-ssa-alias.c (compute_flow_insensitive_aliasing): Add one
tag to another's may-alias bitmap when adding to the other's list.
gcc/testsuite/ChangeLog:
PR tree-optimization/19786
* g++.dg/tree-ssa/pr19786.C: New.

From-SVN: r95377

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr19786.C [new file with mode: 0644]
gcc/tree-ssa-alias.c

index 16cb58b19e54ed2dd46f827aef99f72c35ba4d3c..fa3709688c926f4088820a2537f2d8113c69785a 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-21  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-optimization/19786
+       * tree-ssa-alias.c (compute_flow_insensitive_aliasing): Add one
+       tag to another's may-alias bitmap when adding to the other's list.
+
 2005-02-21  DJ Delorie  <dj@redhat.com>
 
        * tree-ssa-loop-ivopts.c (computation_cost): Start register
index 0eae7654672b63c4e7d7e774dedb8322e6f6ee88..dd742ed74b9b212681d3f0456b355f5cb1bd395c 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-21  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR tree-optimization/19786
+       * g++.dg/tree-ssa/pr19786.C: New.
+
 2005-02-21  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * lib/gfortran-dg.exp (gfortran-dg-test): Split long regexps.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr19786.C b/gcc/testsuite/g++.dg/tree-ssa/pr19786.C
new file mode 100644 (file)
index 0000000..faaecdf
--- /dev/null
@@ -0,0 +1,48 @@
+// { dg-do run }
+/* { dg-options "-O2" } */
+
+// We used to get alias grouping wrong on this one, hoisting accesses
+// to the vector's end out of the loop.
+
+#include <vector>
+#include <cassert>
+
+struct A
+{
+  double unused;      // If I remove it => it works.
+  std::vector<int> v;
+
+  A() : v(1) {}
+};
+
+inline // If not inline => it works.
+A g()
+{
+  A r;
+  r.v.resize(2);
+  r.v[0] = 1;
+
+  while (!r.v.empty() && r.v.back() == 0)
+    r.v.pop_back();
+
+  return r;
+}
+
+A f(const A &a)
+{
+  if (a.v.empty())  return a;
+  if (a.v.empty())  return a;
+
+  // A z = g(); return z;  // If I return like this => it works.
+  return g();
+}
+
+int main()
+{
+  A a;
+  A b;
+  A r = f(a);
+  assert(r.v.size() != 0);
+
+  return 0;
+}
index 3e5f8e3dc5fe38fd0a3a9d54fc8d5f1be2b97e68..bfa1685eb9ed8e23c464d0e59881b620a465cb44 100644 (file)
@@ -1116,6 +1116,7 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
              /* Since TAG2 does not have any aliases of its own, add
                 TAG2 itself to the alias set of TAG1.  */
              add_may_alias (tag1, tag2);
+             SET_BIT (may_aliases1, var_ann (tag2)->uid);
            }
        }
     }