On Tue, 12 Nov 2019, Ilya Leoshkevich wrote: > Bootstrapped and regtested on x86_64-redhat-linux, s390x-redhat-linux > and ppc64le-redhat-linux. OK for trunk and gcc-9-branch? > > try_forward_edges does not update dominance info, and merge_blocks > relies on it being up-to-date. In PR92430 stale dominance info makes > merge_blocks produce a loop in the dominator tree, which in turn makes > delete_basic_block loop forever. > > Fix by freeing dominance info at the beginning of cleanup_cfg.
You can omit freeing CDI_POST_DOMINATORS, those are never kept across passes. OK with that change. Richard. > gcc/ChangeLog: > > 2019-11-12 Ilya Leoshkevich <i...@linux.ibm.com> > > PR rtl-optimization/92430 > * cfgcleanup.c (pass_jump_after_combine::execute): Free > dominance info at the beginning. > > gcc/testsuite/ChangeLog: > > 2019-11-12 Ilya Leoshkevich <i...@linux.ibm.com> > > PR rtl-optimization/92430 > * gcc.dg/pr92430.c: New test (from Arseny Solokha). > --- > gcc/cfgcleanup.c | 3 +++ > gcc/testsuite/gcc.dg/pr92430.c | 25 +++++++++++++++++++++++++ > 2 files changed, 28 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/pr92430.c > > diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c > index 835f7d79ea4..20096de88b4 100644 > --- a/gcc/cfgcleanup.c > +++ b/gcc/cfgcleanup.c > @@ -3312,6 +3312,9 @@ public: > unsigned int > pass_jump_after_combine::execute (function *) > { > + /* Jump threading does not keep dominators up-to-date. */ > + free_dominance_info (CDI_DOMINATORS); > + free_dominance_info (CDI_POST_DOMINATORS); > cleanup_cfg (flag_thread_jumps ? CLEANUP_THREADING : 0); > return 0; > } > diff --git a/gcc/testsuite/gcc.dg/pr92430.c b/gcc/testsuite/gcc.dg/pr92430.c > new file mode 100644 > index 00000000000..915606893ba > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr92430.c > @@ -0,0 +1,25 @@ > +// PR rtl-optimization/92430 > +// { dg-do compile } > +// { dg-options "-Os -fno-if-conversion -fno-tree-dce > -fno-tree-loop-optimize -fno-tree-vrp" } > + > +int eb, ko; > + > +void > +e9 (int pe, int lx) > +{ > + int ir; > + > + for (ir = 0; ir < 1; ++ir) > + { > + for (ko = 0; ko < 1; ++ko) > + { > + for (eb = 0; eb < 1; ++eb) > + ko += pe; > + > + for (ko = 0; ko < 1; ++ko) > + ; > + } > + > + pe = ir = lx; > + } > +} > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)