aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgloop.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-06-14 15:36:57 +0200
committerRichard Biener <rguenther@suse.de>2021-06-15 10:31:16 +0200
commitdfef1164b1c8d0b7abdf302f94d4be99a75ca791 (patch)
treecb1f0c425f68d95fb5fd006ffed93e366baa1b00 /gcc/cfgloop.c
parentb10f895f41dbe98f2a7d448b91d083a68792a6a0 (diff)
downloadgcc-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.c14
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;
+ }
}
}