re PR middle-end/21492 (ICE in try_crossjump_to_edge)
authorJakub Jelinek <jakub@redhat.com>
Tue, 17 May 2005 06:48:19 +0000 (08:48 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 17 May 2005 06:48:19 +0000 (08:48 +0200)
PR middle-end/21492
* cfgcleanup.c (try_crossjump_to_edge): update_forwarder_flag for
src2 if src2 has been split.

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

From-SVN: r99816

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/crossjump1.C [new file with mode: 0644]

index 99e010889bcf5b516e546d4d9644957aeec083bf..dc64af228bacfea72d6d4041345b8b9a8994dca5 100644 (file)
@@ -1,5 +1,9 @@
 2005-05-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/21492
+       * cfgcleanup.c (try_crossjump_to_edge): update_forwarder_flag for
+       src2 if src2 has been split.
+
        PR tree-optimization/21610
        * c-typeck.c (decl_constant_value_for_broken_optimization): If not
        returning DECL, call unshare_expr.
index e7df2aeece6165d78b9ee32a51a5a824d27e42d3..10e6f101eed5d978b8d0f7f4e1178f8ed66e51b6 100644 (file)
@@ -1677,6 +1677,8 @@ try_crossjump_to_edge (int mode, edge e1, edge e2)
   delete_basic_block (to_remove);
 
   update_forwarder_flag (redirect_from);
+  if (redirect_to != src2)
+    update_forwarder_flag (src2);
 
   return true;
 }
index e6911746563fd0ffbc2d0d9a942deef0dc2f5e5d..2428cf14f36585ddd69c581066454bd54deb9ec3 100644 (file)
@@ -1,5 +1,8 @@
 2005-05-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/21492
+       * g++.dg/opt/crossjump1.C: New test.
+
        PR tree-optimization/21610
        * gcc.c-torture/compile/20050516-1.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/opt/crossjump1.C b/gcc/testsuite/g++.dg/opt/crossjump1.C
new file mode 100644 (file)
index 0000000..3bb95d1
--- /dev/null
@@ -0,0 +1,33 @@
+// PR middle-end/21492
+// { dg-do compile }
+// { dg-options "-Os -fPIC" }
+
+extern char *bar (const char *, const char *);
+extern char *baz (char *, const char *);
+extern unsigned int fn (const char *);
+static const struct C { int i; } k = { 0};
+
+struct A
+{
+  ~A ();
+};
+
+char *
+foo (char *x, const char *y)
+{
+  A a;
+  char *c = x;
+
+  if (bar (y, "foo"))
+    {
+      baz (c, "foo");
+      c += fn ("foo");
+    }
+  else if (bar (y, "bar"))
+    {
+      baz (c, "bar");
+      c += fn ("bar");
+    }
+
+  return x;
+}