https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80823
--- Comment #4 from Peter Bergner <bergner at gcc dot gnu.org> --- Stupid thinko on my part. An extra increment is causing us to skip some of the case labels in the switch statement, which only causes an ICE/problem if the skipped case happens to point to the same unreachable block as an earlier case label. In that case, the earlier case has already removed the unreachable block, but skipped case label still points to it, leading to the verify_flow ICE. I'm testing the following: Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 248375) +++ gcc/tree-cfg.c (working copy) @@ -1726,7 +1726,6 @@ group_case_labels_stmt (gswitch *stmt) remove_edge_and_dominated_blocks (base_edge); gimple_switch_set_label (stmt, base_index, NULL_TREE); new_size--; - i++; } }