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.
delete_basic_block (to_remove);
update_forwarder_flag (redirect_from);
+ if (redirect_to != src2)
+ update_forwarder_flag (src2);
return true;
}
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.
--- /dev/null
+// 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;
+}