From: Ilya Leoshkevich Date: Fri, 15 Nov 2019 12:55:05 +0000 (+0000) Subject: Free dominance info at the beginning of pass_jump_after_combine X-Git-Tag: releases/gcc-9.3.0~385 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50a969f1713d9a8f4706df7d0e786122c1e0f594;p=thirdparty%2Fgcc.git Free dominance info at the beginning of pass_jump_after_combine 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. Also, since the whole point of this pass is to perform jump threading (other cleanups are not valuable at this point), skip it completely when flag_thread_jumps is not set. gcc/ChangeLog: 2019-11-15 Ilya Leoshkevich Backport from mainline PR rtl-optimization/92430 * cfgcleanup.c (pass_jump_after_combine::gate): New function. (pass_jump_after_combine::execute): Free dominance info at the beginning. gcc/testsuite/ChangeLog: 2019-11-15 Ilya Leoshkevich Backport from mainline PR rtl-optimization/92430 * gcc.dg/pr92430.c: New test (from Arseny Solokha). From-SVN: r278291 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63209837908c..f2694e5dc2d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2019-11-15 Ilya Leoshkevich + + Backport from mainline + PR rtl-optimization/92430 + * cfgcleanup.c (pass_jump_after_combine::gate): New function. + (pass_jump_after_combine::execute): Free + dominance info at the beginning. + 2019-11-13 Claudiu Zissulescu Backport from mainline diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index e90cc43e1f0b..01e13b9dc4f4 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -3303,6 +3303,7 @@ public: {} /* opt_pass methods: */ + virtual bool gate (function *) { return flag_thread_jumps; } virtual unsigned int execute (function *); }; // class pass_jump_after_combine @@ -3310,7 +3311,9 @@ public: unsigned int pass_jump_after_combine::execute (function *) { - cleanup_cfg (flag_thread_jumps ? CLEANUP_THREADING : 0); + /* Jump threading does not keep dominators up-to-date. */ + free_dominance_info (CDI_DOMINATORS); + cleanup_cfg (CLEANUP_THREADING); return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ae0ef123a03..e4f275430ecc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-11-15 Ilya Leoshkevich + + Backport from mainline + PR rtl-optimization/92430 + * gcc.dg/pr92430.c: New test (from Arseny Solokha). + 2019-11-13 Claudiu Zissulescu Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr92430.c b/gcc/testsuite/gcc.dg/pr92430.c new file mode 100644 index 000000000000..915606893bab --- /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; + } +}