OSDN Git Service

2011-04-27 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Apr 2011 10:36:35 +0000 (10:36 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 27 Apr 2011 10:36:35 +0000 (10:36 +0000)
PR tree-optimization/48772
* tree-ssa-pre.c (eliminate): Update call stmts after elimination
only.

* g++.dg/pr48772.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173019 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 492a92d..276ef48 100644 (file)
@@ -1,5 +1,11 @@
 2011-04-27  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/48772
+       * tree-ssa-pre.c (eliminate): Update call stmts after elimination
+       only.
+
+2011-04-27  Richard Guenther  <rguenther@suse.de>
+
        * tree-ssa-alias.c (indirect_refs_may_alias_p): Fix
        TARGET_MEM_REF handling.
 
index 19fd6de..4be7479 100644 (file)
@@ -1,3 +1,8 @@
+2011-04-27  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48772
+       * g++.dg/pr48772.C: New testcase.
+
 2011-04-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/48742
diff --git a/gcc/testsuite/g++.dg/pr48772.C b/gcc/testsuite/g++.dg/pr48772.C
new file mode 100644 (file)
index 0000000..39c1094
--- /dev/null
@@ -0,0 +1,35 @@
+// { dg-do compile }
+// { dg-options "-O -fnon-call-exceptions -fno-tree-ccp -fno-tree-dce" }
+
+extern "C" void abort ();
+
+struct A
+{
+  void foo ()
+  {
+    this->bar ();
+  }
+  virtual void bar ()
+  {
+    abort ();
+  }
+  ~A ()
+  {
+  }
+};
+
+struct B:A
+{
+  virtual void bar ()
+  {
+  }
+};
+
+int
+main ()
+{
+  B b;
+  b.foo ();
+  return 0;
+}
+
index a833a04..51d9dcd 100644 (file)
@@ -4186,6 +4186,7 @@ static unsigned int
 eliminate (void)
 {
   VEC (gimple, heap) *to_remove = NULL;
+  VEC (gimple, heap) *to_update = NULL;
   basic_block b;
   unsigned int todo = 0;
   gimple_stmt_iterator gsi;
@@ -4411,7 +4412,7 @@ eliminate (void)
                    }
 
                  gimple_call_set_fn (stmt, fn);
-                 update_stmt (stmt);
+                 VEC_safe_push (gimple, heap, to_update, stmt);
 
                  /* When changing a call into a noreturn call, cfg cleanup
                     is needed to fix up the noreturn call.  */
@@ -4563,6 +4564,13 @@ eliminate (void)
     }
   VEC_free (gimple, heap, to_remove);
 
+  /* We cannot update call statements with virtual operands during
+     SSA walk.  This might remove them which in turn makes our
+     VN lattice invalid.  */
+  FOR_EACH_VEC_ELT (gimple, to_update, i, stmt)
+    update_stmt (stmt);
+  VEC_free (gimple, heap, to_update);
+
   return todo;
 }