https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85354
Alexander Monakov <amonakov at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |abel at gcc dot gnu.org Assignee|unassigned at gcc dot gnu.org |amonakov at gcc dot gnu.org --- Comment #1 from Alexander Monakov <amonakov at gcc dot gnu.org> --- Thanks. Judging from the backtrace, we shouldn't call cleanup_cfg after dominators are computed: it will invalidate dominators without freeing or fixing them. I wonder if that's "by design". A simple way out is to run cleanup_cfg early enough. I'll bootstrap/regtest the following on gcc112: diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 50a7daafba6..ee970522890 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -30,7 +30,6 @@ along with GCC; see the file COPYING3. If not see #include "cfgrtl.h" #include "cfganal.h" #include "cfgbuild.h" -#include "cfgcleanup.h" #include "insn-config.h" #include "insn-attr.h" #include "recog.h" @@ -6122,9 +6121,6 @@ make_regions_from_loop_nest (struct loop *loop) void sel_init_pipelining (void) { - /* Remove empty blocks: their presence can break assumptions elsewhere, - e.g. the logic to invoke update_liveness_on_insn in sel_region_init. */ - cleanup_cfg (0); /* Collect loop information to be used in outer loops pipelining. */ loop_optimizer_init (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_FALLTHRU_PREHEADERS diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index cd29df35666..59762964c6e 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "tm_p.h" #include "regs.h" #include "cfgbuild.h" +#include "cfgcleanup.h" #include "insn-config.h" #include "insn-attr.h" #include "params.h" @@ -7661,6 +7662,10 @@ sel_sched_region (int rgn) static void sel_global_init (void) { + /* Remove empty blocks: their presence can break assumptions elsewhere, + e.g. the logic to invoke update_liveness_on_insn in sel_region_init. */ + cleanup_cfg (0); + calculate_dominance_info (CDI_DOMINATORS); alloc_sched_pools ();