When one of the first two stages of DSE removes a throwing stmt we have to purge dead EH edges before the DF re-analyze fires off a fast DCE since that cannot cope with the situation.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. I'll add a testcase when it has finished reducing in time. Richard. 2022-05-12 Richard Biener <rguent...@suse.de> PR rtl-optimization/105577 * dse.cc (rest_of_handle_dse): Make sure to purge dead EH edges before running fast DCE via df_analyze. --- gcc/dse.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/gcc/dse.cc b/gcc/dse.cc index a58c17e0ccb..30c11cee034 100644 --- a/gcc/dse.cc +++ b/gcc/dse.cc @@ -3682,6 +3682,16 @@ rest_of_handle_dse (void) dse_step0 (); dse_step1 (); + /* DSE can eliminate potentially-trapping MEMs. + Remove any EH edges associated with them, since otherwise + DF_LR_RUN_DCE will complain later. */ + if ((locally_deleted || globally_deleted) + && cfun->can_throw_non_call_exceptions + && purge_all_dead_edges ()) + { + free_dominance_info (CDI_DOMINATORS); + delete_unreachable_blocks (); + } dse_step2_init (); if (dse_step2 ()) { -- 2.35.3