]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
toplev.c (rest_of_handle_addresof): Rename into rest_of_handle_addressof.
authorEric Botcazou <ebotcazou@libertysurf.fr>
Fri, 18 Jul 2003 06:53:05 +0000 (08:53 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 18 Jul 2003 06:53:05 +0000 (06:53 +0000)
* 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

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

index 4f80106551a49c1bfd3d0e2f64da8e58f5c25f0a..2166ec5c54b39853b8ddbba372d64cc7f46fb053 100644 (file)
@@ -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
index 91f7815eaf33577148094c4259b74794d1aa98a7..c69031a5be2264c54fd9d5fd6a1eda68c7ab9741 100644 (file)
@@ -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 (file)
index 0000000..dbc81fe
--- /dev/null
@@ -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));
+}
index eac556284f8dfab2f93b3056f81381bf8af3b76a..cf61228dc83d7747fd8e0ace70517e04a50d38cc 100644 (file)
@@ -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 ();