This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Free dominance info at the beginning of pass_jump_after_combine
- From: Richard Biener <rguenther at suse dot de>
- To: Ilya Leoshkevich <iii at linux dot ibm dot com>
- Cc: gcc-patches at gcc dot gnu dot org, law at redhat dot com, segher at gcc dot gnu dot org, krebbel at linux dot ibm dot com
- Date: Tue, 12 Nov 2019 15:14:53 +0100 (CET)
- Subject: Re: [PATCH] Free dominance info at the beginning of pass_jump_after_combine
- References: <20191112141105.36592-1-iii@linux.ibm.com>
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 <iii@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 <iii@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 <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)