re PR tree-optimization/40813 (ICE in gsi_insert_seq_nodes_after, at gimple-iterator...
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Jul 2009 14:51:13 +0000 (16:51 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Jul 2009 14:51:13 +0000 (16:51 +0200)
PR tree-optimization/40813
* tree-inline.c (copy_bb): Regimplify RHS after last stmt, not before
it.

* g++.dg/opt/inline15.C: New test.

From-SVN: r149857

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/inline15.C [new file with mode: 0644]
gcc/tree-inline.c

index 68a81cc..2ae1c41 100644 (file)
@@ -1,3 +1,9 @@
+2009-07-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/40813
+       * tree-inline.c (copy_bb): Regimplify RHS after last stmt, not before
+       it.
+
 2009-07-21  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * config/sh/sh.c (sh_gimplify_va_arg_expr): Wrap the result
index a50af86..c140cdf 100644 (file)
@@ -1,3 +1,8 @@
+2009-07-21  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/40813
+       * g++.dg/opt/inline15.C: New test.
+
 2009-07-21  Paul Brook <paul@codesourcery.com>
 
        * gcc.dg/vect/section-anchors-nest-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/inline15.C b/gcc/testsuite/g++.dg/opt/inline15.C
new file mode 100644 (file)
index 0000000..5da3a61
--- /dev/null
@@ -0,0 +1,42 @@
+// PR tree-optimization/40813
+// { dg-do compile }
+// { dg-options "-O -fcheck-new" }
+
+typedef __SIZE_TYPE__ size_t;
+typedef void *P;
+struct A;
+struct B
+{
+  void *b[5];
+  A *foo () { return (A *) & b[0]; }
+};
+struct A
+{
+  void *operator new (size_t x, B &y) { return y.foo (); }
+};
+struct C : public A
+{
+  virtual int bar () { }
+};
+struct D : public C
+{
+  static B baz (unsigned *x) { B b; new (b) D (x); return b; }
+  D (unsigned *x) { }
+};
+struct E
+{
+  B e;
+  B fn (unsigned *a) { return D::baz (a); }
+  E (P b, unsigned *a) : e (fn (a)) { }
+};
+
+static unsigned *
+fn2 ()
+{
+}
+
+void
+test (P x)
+{
+  E (x, fn2 ());
+}
index 8b5e1ff..3b7b666 100644 (file)
@@ -1383,8 +1383,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale,
        {
          tree new_rhs;
          new_rhs = force_gimple_operand_gsi (&seq_gsi,
-                                             gimple_assign_rhs1 (stmt),
-                                             true, NULL, true, GSI_SAME_STMT);
+                                             gimple_assign_rhs1 (stmt),
+                                             true, NULL, false, GSI_NEW_STMT);
          gimple_assign_set_rhs1 (stmt, new_rhs);
          id->regimplify = false;
        }