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 <iii@linux.ibm.com>
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 <iii@linux.ibm.com>
Backport from mainline
PR rtl-optimization/92430
* gcc.dg/pr92430.c: New test (from Arseny Solokha).
From-SVN: r278291
+2019-11-15 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ 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 <claziss@gmail.com>
Backport from mainline
{}
/* opt_pass methods: */
+ virtual bool gate (function *) { return flag_thread_jumps; }
virtual unsigned int execute (function *);
}; // class pass_jump_after_combine
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;
}
+2019-11-15 Ilya Leoshkevich <iii@linux.ibm.com>
+
+ Backport from mainline
+ PR rtl-optimization/92430
+ * gcc.dg/pr92430.c: New test (from Arseny Solokha).
+
2019-11-13 Claudiu Zissulescu <claziss@gmail.com>
Backport from mainline
--- /dev/null
+// 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;
+ }
+}