re PR tree-optimization/48772 (ICE: SIGSEGV in walk_non_aliased_vuses (gimple.h:1100...
authorRichard Guenther <rguenther@suse.de>
Wed, 27 Apr 2011 10:36:35 +0000 (10:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 27 Apr 2011 10:36:35 +0000 (10:36 +0000)
2011-04-27  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48772
* tree-ssa-pre.c (eliminate): Update call stmts after elimination
only.

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

From-SVN: r173019

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

index 492a92dad53fceab1dea08d58b78cc5f510a6077..276ef484ece60137689728bb46615c480d2d6399 100644 (file)
@@ -1,3 +1,9 @@
+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
index 19fd6de0cba143a2f7f76c0369f3d17eddec27eb..4be7479c57a566ee5b64b822841c826bff133f78 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 a833a041bbbe388a8c5238e6420aeced0a293be2..51d9dcde9af3b760588ab7dcb6e939184ecb433d 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;
 }