aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-07-18 08:53:05 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-07-18 06:53:05 +0000
commitf129791ccd978f43f55cbb5c602ea246099127f3 (patch)
tree6526b967def886168e4d9eb51085ca42f1737e3c /gcc
parentb2e608ca7ff1fa5bce267d52e27e96e36bd4e170 (diff)
downloadgcc-f129791ccd978f43f55cbb5c602ea246099127f3.zip
gcc-f129791ccd978f43f55cbb5c602ea246099127f3.tar.gz
gcc-f129791ccd978f43f55cbb5c602ea246099127f3.tar.bz2
toplev.c (rest_of_handle_addresof): Rename into rest_of_handle_addressof.
* toplev.c (rest_of_handle_addresof): Rename into rest_of_handle_addressof. Delete unreachable blocks if dead edges were purged after the addressof pass. From-SVN: r69545
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/opt/cfg1.C36
-rw-r--r--gcc/toplev.c10
4 files changed, 52 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4f80106..2166ec5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2003-07-18 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR optimization/11083
+ * toplev.c (rest_of_handle_addresof): Rename into
+ rest_of_handle_addressof. Delete unreachable blocks
+ if dead edges were purged after the addressof pass.
+
2003-07-18 Neil Booth <neil@daikokuya.co.uk>
* Makefile.in, configure, configure.in: Remove handling of
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 91f7815..c69031a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-07-18 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * g++.dg/opt/cfg1.C: New test.
+
2003-07-17 Mark Mitchell <mark@codesourcery.com>
PR optimization/11557
diff --git a/gcc/testsuite/g++.dg/opt/cfg1.C b/gcc/testsuite/g++.dg/opt/cfg1.C
new file mode 100644
index 0000000..dbc81fe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/cfg1.C
@@ -0,0 +1,36 @@
+// PR optimization/11083
+// Origin: <nick@ilm.com>
+// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// The compiler used to keep unreachable basic blocks after dead edges
+// had been purged, which fooled the LCM code of the GCSE pass.
+
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+extern void *memmove (void *, const void *, unsigned int) throw ();
+
+struct S {
+ int *q;
+
+ S(int *i) : q(i) {}
+};
+
+struct X {
+ int *p;
+
+ void foo(S first, S last) {
+ try { memmove(0, 0, last.q - first.q); }
+ catch(...) { throw; }
+ }
+
+ void bar (const X& x);
+};
+
+void X::bar (const X& x)
+{
+ const unsigned int xlen = S(x.p).q - S(x.p).q;
+
+ if (xlen > 0)
+ foo(S(x.p), S(x.p));
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index eac5562..cf61228 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -134,7 +134,7 @@ static void rest_of_handle_loop2 (tree, rtx);
static void rest_of_handle_jump_bypass (tree, rtx);
static void rest_of_handle_sibling_calls (rtx);
static void rest_of_handle_null_pointer (tree, rtx);
-static void rest_of_handle_addresof (tree, rtx);
+static void rest_of_handle_addressof (tree, rtx);
static void rest_of_handle_cfg (tree, rtx);
static void rest_of_handle_branch_prob (tree, rtx);
static void rest_of_handle_if_conversion (tree, rtx);
@@ -2405,13 +2405,13 @@ rest_of_handle_cfg (tree decl, rtx insns)
/* Purge addressofs. */
static void
-rest_of_handle_addresof (tree decl, rtx insns)
+rest_of_handle_addressof (tree decl, rtx insns)
{
open_dump_file (DFI_addressof, decl);
purge_addressof (insns);
- if (optimize)
- purge_all_dead_edges (0);
+ if (optimize && purge_all_dead_edges (0))
+ delete_unreachable_blocks ();
reg_scan (insns, max_reg_num (), 1);
close_dump_file (DFI_addressof, print_rtl, insns);
@@ -3219,7 +3219,7 @@ rest_of_compilation (tree decl)
if (optimize > 0)
rest_of_handle_cse (decl, insns);
- rest_of_handle_addresof (decl, insns);
+ rest_of_handle_addressof (decl, insns);
ggc_collect ();