public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/tnfchris/heads/gcc-14-early-break)] middle-end: Change loop analysis from looking at at number of BB to actual cfg
@ 2023-11-15 14:55 Tamar Christina
0 siblings, 0 replies; only message in thread
From: Tamar Christina @ 2023-11-15 14:55 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:09acb16c3a7f2fc836f31d0c836128b785d6e939
commit 09acb16c3a7f2fc836f31d0c836128b785d6e939
Author: Tamar Christina <tamar.christina@arm.com>
Date: Thu Nov 2 17:06:29 2023 +0000
middle-end: Change loop analysis from looking at at number of BB to actual cfg
Reviewed at https://reviewboard.gnu.aws.arm.com/r/17974/
Diff:
---
gcc/tree-vect-loop-manip.cc | 2 --
gcc/tree-vect-loop.cc | 24 +++++++++++-------------
2 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/gcc/tree-vect-loop-manip.cc b/gcc/tree-vect-loop-manip.cc
index d00765c39bd..2c4566963ad 100644
--- a/gcc/tree-vect-loop-manip.cc
+++ b/gcc/tree-vect-loop-manip.cc
@@ -1886,12 +1886,10 @@ slpeel_can_duplicate_loop_p (const class loop *loop, const_edge exit_e,
edge entry_e = loop_preheader_edge (loop);
gcond *orig_cond = get_loop_exit_condition (exit_e);
gimple_stmt_iterator loop_exit_gsi = gsi_last_bb (exit_e->src);
- unsigned int num_bb = loop->inner? 5 : 2;
/* All loops have an outer scope; the only case loop->outer is NULL is for
the function itself. */
if (!loop_outer (loop)
- || loop->num_nodes != num_bb
|| !empty_block_p (loop->latch)
|| !exit_e
/* Verify that new loop exit condition can be trivially modified. */
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index cd83cc0a67a..efea49a9237 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -1727,6 +1727,17 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info)
"using as main loop exit: %d -> %d [AUX: %p]\n",
exit_e->src->index, exit_e->dest->index, exit_e->aux);
+ /* Check if we have any control flow that doesn't leave the loop. */
+ class loop *v_loop = loop->inner ? loop->inner : loop;
+ basic_block *bbs= get_loop_body (v_loop);
+ for (unsigned i = 0; i < v_loop->num_nodes; i++)
+ if (EDGE_COUNT (bbs[i]->succs) != 1
+ && (EDGE_COUNT (bbs[i]->succs) != 2
+ || !loop_exits_from_bb_p (bbs[i]->loop_father, bbs[i])))
+ return opt_result::failure_at (vect_location,
+ "not vectorized:"
+ " unsupported control flow in loop.\n");
+
/* Different restrictions apply when we are considering an inner-most loop,
vs. an outer (nested) loop.
(FORNOW. May want to relax some of these restrictions in the future). */
@@ -1746,11 +1757,6 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info)
|
(exit-bb) */
- if (loop->num_nodes != 2)
- return opt_result::failure_at (vect_location,
- "not vectorized:"
- " control flow in loop.\n");
-
if (empty_block_p (loop->header))
return opt_result::failure_at (vect_location,
"not vectorized: empty loop.\n");
@@ -1782,11 +1788,6 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info)
"not vectorized:"
" multiple nested loops.\n");
- if (loop->num_nodes != 5)
- return opt_result::failure_at (vect_location,
- "not vectorized:"
- " control flow in loop.\n");
-
entryedge = loop_preheader_edge (innerloop);
if (entryedge->src != loop->header
|| !single_exit (innerloop)
@@ -1823,9 +1824,6 @@ vect_analyze_loop_form (class loop *loop, vect_loop_form_info *info)
info->inner_loop_cond = inner.conds[0];
}
- if (!single_exit (loop))
- return opt_result::failure_at (vect_location,
- "not vectorized: multiple exits.\n");
if (EDGE_COUNT (loop->header->preds) != 2)
return opt_result::failure_at (vect_location,
"not vectorized:"
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2023-11-15 14:55 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-15 14:55 [gcc(refs/users/tnfchris/heads/gcc-14-early-break)] middle-end: Change loop analysis from looking at at number of BB to actual cfg Tamar Christina
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).