diff options
author | Richard Biener <rguenther@suse.de> | 2021-06-14 15:36:57 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-06-15 10:31:16 +0200 |
commit | dfef1164b1c8d0b7abdf302f94d4be99a75ca791 (patch) | |
tree | cb1f0c425f68d95fb5fd006ffed93e366baa1b00 /gcc/cfgloop.c | |
parent | b10f895f41dbe98f2a7d448b91d083a68792a6a0 (diff) | |
download | gcc-dfef1164b1c8d0b7abdf302f94d4be99a75ca791.zip gcc-dfef1164b1c8d0b7abdf302f94d4be99a75ca791.tar.gz gcc-dfef1164b1c8d0b7abdf302f94d4be99a75ca791.tar.bz2 |
Handle multiple latches in irreducible region mark
The following makes irreducible region discovery handle multiple latches.
2021-06-14 Richard Biener <rguenther@suse.de>
* cfgloopanal.c (mark_irreducible_loops): Use a dominance
check to identify loop latches.
* cfgloop.c (verify_loop_structure): Likewise.
* loop-init.c (apply_loop_flags): Allow marked irreducible
regions even with multiple latches.
* predict.c (rebuild_frequencies): Simplify.
Diffstat (limited to 'gcc/cfgloop.c')
-rw-r--r-- | gcc/cfgloop.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/cfgloop.c b/gcc/cfgloop.c index 4e227cd..f094538 100644 --- a/gcc/cfgloop.c +++ b/gcc/cfgloop.c @@ -1555,11 +1555,17 @@ verify_loop_structure (void) error ("loop %d%'s header does not belong directly to it", i); err = 1; } - if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS) - && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP)) + if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)) { - error ("loop %d%'s latch is marked as part of irreducible region", i); - err = 1; + edge_iterator ei; + FOR_EACH_EDGE (e, ei, loop->header->preds) + if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header) + && e->flags & EDGE_IRREDUCIBLE_LOOP) + { + error ("loop %d%'s latch is marked as part of irreducible" + " region", i); + err = 1; + } } } |