From 3211aea29a0576eeb3326879b2f58fc0ed374a40 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 11 Jan 2018 09:02:26 +0100 Subject: [PATCH] re PR rtl-optimization/83575 (ICE: verify_flow_info failed (error: multiple hot/cold transitions found)) PR middle-end/83575 * cfgrtl.c (rtl_verify_edges): Only verify fixability of partition when in layout mode. (cfg_layout_finalize): Do not verify cfg before we are out of layout. * cfgcleanup.c (try_optimize_cfg): Only verify flow info when doing partition fixup. * gcc.c-torture/compile/pr83575.c: New testcase. From-SVN: r256479 --- gcc/ChangeLog | 9 +++++ gcc/cfgcleanup.c | 6 ++-- gcc/cfgrtl.c | 4 +-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.c-torture/compile/pr83575.c | 33 +++++++++++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr83575.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7eb6c1cc47c5..1a55b2010907 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-01-10 Jan Hubicka + + PR middle-end/83575 + * cfgrtl.c (rtl_verify_edges): Only verify fixability of partition + when in layout mode. + (cfg_layout_finalize): Do not verify cfg before we are out of layout. + * cfgcleanup.c (try_optimize_cfg): Only verify flow info when doing + partition fixup. + 2018-01-10 Michael Collison * config/aarch64/aarch64-modes.def (V2HF): New VECTOR_MODE. diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index eebbe8f7959b..c33022c1bb5c 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -3013,8 +3013,10 @@ try_optimize_cfg (int mode) is only visible after newly unreachable blocks are deleted, which will be done in fixup_partitions. */ if ((mode & CLEANUP_NO_PARTITIONING) == 0) - fixup_partitions (); - checking_verify_flow_info (); + { + fixup_partitions (); + checking_verify_flow_info (); + } } changed_overall |= changed; diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index f47a78cfcee2..6ff80fd5c015 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -2615,7 +2615,8 @@ rtl_verify_edges (void) /* If there are partitions, do a sanity check on them: A basic block in   a cold partition cannot dominate a basic block in a hot partition.  */ - if (crtl->has_bb_partition && !err) + if (crtl->has_bb_partition && !err + && current_ir_type () == IR_RTL_CFGLAYOUT) { vec bbs_to_fix = find_partition_fixes (true); err = !bbs_to_fix.is_empty (); @@ -4322,7 +4323,6 @@ break_superblocks (void) void cfg_layout_finalize (void) { - checking_verify_flow_info (); free_dominance_info (CDI_DOMINATORS); force_one_exit_fallthru (); rtl_register_cfg_hooks (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 209d6d896bd8..68fe8ef65bef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-01-10 Jan Hubicka + + * gcc.c-torture/compile/pr83575.c: New testcase. + 2018-01-10 Michael Collison gcc.target/aarch64/fp16_fmul_high_1.c: New testcase. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr83575.c b/gcc/testsuite/gcc.c-torture/compile/pr83575.c new file mode 100644 index 000000000000..1c554e982acc --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr83575.c @@ -0,0 +1,33 @@ +/* { dg-options "-O2 -funroll-loops -fno-tree-dominator-opts -fno-tree-loop-im -fno-code-hoisting -fno-tree-pre -fno-guess-branch-probability" } */ +int tw, be; + +void +fp (void) +{ + if (tw == 0) + goto gq; + else if (be == 0) + goto ob; + else + return; + + for (;;) + if (tw < 1) + { + while (tw < 1) + { + gq: + tw = 0; + } + + while (be < 1) + { + ob: + tw = 0; + } + + while (be < 1) + ++be; + } +} + -- 2.43.5