aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-05-17 08:48:19 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2005-05-17 08:48:19 +0200
commit7cbd12b88f5749676e888502453056fcc48cd61e (patch)
tree5683629f8c3f41248f9737c62c8e1e9255c55a85 /gcc
parentc477e13bd7d3f369cde2fbb171d8aa9501759373 (diff)
downloadgcc-7cbd12b88f5749676e888502453056fcc48cd61e.zip
gcc-7cbd12b88f5749676e888502453056fcc48cd61e.tar.gz
gcc-7cbd12b88f5749676e888502453056fcc48cd61e.tar.bz2
re PR middle-end/21492 (ICE in try_crossjump_to_edge)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/cfgcleanup.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/opt/crossjump1.C33
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99e0108..dc64af2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index e7df2ae..10e6f10 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e691174..2428cf1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3bb95d1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/crossjump1.C
@@ -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;
+}