diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-07-18 08:53:05 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-07-18 06:53:05 +0000 |
commit | f129791ccd978f43f55cbb5c602ea246099127f3 (patch) | |
tree | 6526b967def886168e4d9eb51085ca42f1737e3c /gcc | |
parent | b2e608ca7ff1fa5bce267d52e27e96e36bd4e170 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/cfg1.C | 36 | ||||
-rw-r--r-- | gcc/toplev.c | 10 |
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 (); |