public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/users/marxin/heads/slp-ebb-v2)] Version one.
@ 2020-10-05 12:18 Martin Liska
0 siblings, 0 replies; only message in thread
From: Martin Liska @ 2020-10-05 12:18 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:7bde8676fc39d9a0c676e9238d41b845af42df0f
commit 7bde8676fc39d9a0c676e9238d41b845af42df0f
Author: Martin Liska <mliska@suse.cz>
Date: Wed Sep 23 15:58:25 2020 +0200
Version one.
Diff:
---
gcc/tree-vect-patterns.c | 2 +
gcc/tree-vect-slp.c | 134 ++++++++++++++++++++++++++++++-----------------
gcc/tree-vectorizer.c | 20 ++++---
gcc/tree-vectorizer.h | 68 +++++++++++++++++++-----
4 files changed, 150 insertions(+), 74 deletions(-)
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index d626c5f7362..09e75437d39 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -5125,6 +5125,8 @@ vect_determine_precisions (vec_info *vinfo)
bb_vec_info bb_vinfo = as_a <bb_vec_info> (vinfo);
for (gimple *stmt : bb_vinfo->reverse_region_stmts ())
{
+ if (stmt == NULL)
+ continue;
stmt_vec_info stmt_info = vinfo->lookup_stmt (stmt);
if (stmt_info && STMT_VINFO_VECTORIZABLE (stmt_info))
vect_determine_stmt_precisions (vinfo, stmt_info);
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index e0614fb472f..07459d8c168 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -45,7 +45,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple-fold.h"
#include "internal-fn.h"
#include "dump-context.h"
-
+#include "cfganal.h"
static bool vectorizable_slp_permutation (vec_info *, gimple_stmt_iterator *,
slp_tree, stmt_vector_for_cost *);
@@ -2727,26 +2727,22 @@ vect_detect_hybrid_slp (loop_vec_info loop_vinfo)
}
-/* Initialize a bb_vec_info struct for the statements between
- REGION_BEGIN_IN (inclusive) and REGION_END_IN (exclusive). */
+/* Initialize a bb_vec_info struct for the statements in BBS basic blocks. */
-_bb_vec_info::_bb_vec_info (gimple_stmt_iterator region_begin_in,
- gimple_stmt_iterator region_end_in,
+_bb_vec_info::_bb_vec_info (vec<basic_block> _bbs,
vec_info_shared *shared)
: vec_info (vec_info::bb, init_cost (NULL), shared),
- bb (gsi_bb (region_begin_in)),
- region_begin (region_begin_in),
- region_end (region_end_in)
+ bbs (_bbs)
{
for (gimple *stmt : this->region_stmts ())
{
+ if (stmt == NULL)
+ continue;
gimple_set_uid (stmt, 0);
if (is_gimple_debug (stmt))
continue;
add_stmt (stmt);
}
-
- bb->aux = this;
}
@@ -2756,10 +2752,9 @@ _bb_vec_info::_bb_vec_info (gimple_stmt_iterator region_begin_in,
_bb_vec_info::~_bb_vec_info ()
{
for (gimple *stmt : this->region_stmts ())
- /* Reset region marker. */
- gimple_set_uid (stmt, -1);
-
- bb->aux = NULL;
+ if (stmt != NULL)
+ /* Reset region marker. */
+ gimple_set_uid (stmt, -1);
}
/* Subroutine of vect_slp_analyze_node_operations. Handle the root of NODE,
@@ -3462,6 +3457,8 @@ vect_slp_check_for_constructors (bb_vec_info bb_vinfo)
{
for (gimple *stmt : bb_vinfo->region_stmts ())
{
+ if (stmt == NULL)
+ continue;
gassign *assign = dyn_cast<gassign *> (stmt);
if (!assign || gimple_assign_rhs_code (assign) != CONSTRUCTOR)
continue;
@@ -3601,14 +3598,12 @@ vect_slp_analyze_bb_1 (bb_vec_info bb_vinfo, int n_stmts, bool &fatal,
return true;
}
-/* Subroutine of vect_slp_bb. Try to vectorize the statements between
- REGION_BEGIN (inclusive) and REGION_END (exclusive), returning true
- on success. The region has N_STMTS statements and has the datarefs
- given by DATAREFS. */
+/* Subroutine of vect_slp_bb. Try to vectorize the statements for all
+ basic blocks in BBS, returning true on success.
+ The region has N_STMTS statements and has the datarefs given by DATAREFS. */
static bool
-vect_slp_region (gimple_stmt_iterator region_begin,
- gimple_stmt_iterator region_end,
+vect_slp_region (vec<basic_block> bbs,
vec<data_reference_p> datarefs,
vec<int> *dataref_groups,
unsigned int n_stmts)
@@ -3628,7 +3623,7 @@ vect_slp_region (gimple_stmt_iterator region_begin,
{
bool vectorized = false;
bool fatal = false;
- bb_vinfo = new _bb_vec_info (region_begin, region_end, &shared);
+ bb_vinfo = new _bb_vec_info (bbs, &shared);
bool first_time_p = shared.datarefs.is_empty ();
BB_VINFO_DATAREFS (bb_vinfo) = datarefs;
@@ -3753,50 +3748,91 @@ vect_slp_region (gimple_stmt_iterator region_begin,
}
}
-/* Main entry for the BB vectorizer. Analyze and transform BB, returns
- true if anything in the basic-block was vectorized. */
-bool
-vect_slp_bb (basic_block bb)
+static bool
+vect_slp_bbs (vec<basic_block> bbs)
{
vec<data_reference_p> datarefs = vNULL;
vec<int> dataref_groups = vNULL;
int insns = 0;
int current_group = 0;
- gimple_stmt_iterator region_begin = gsi_start_nondebug_after_labels_bb (bb);
- gimple_stmt_iterator region_end = gsi_last_bb (bb);
- if (!gsi_end_p (region_end))
- gsi_next (®ion_end);
- for (gimple_stmt_iterator gsi = gsi_after_labels (bb); !gsi_end_p (gsi);
- gsi_next (&gsi))
+ for (unsigned i = 0; i < bbs.length (); i++)
{
- gimple *stmt = gsi_stmt (gsi);
- if (is_gimple_debug (stmt))
- continue;
+ basic_block bb = bbs[i];
+ for (gimple_stmt_iterator gsi = gsi_after_labels (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+ if (is_gimple_debug (stmt))
+ continue;
- insns++;
+ insns++;
- if (gimple_location (stmt) != UNKNOWN_LOCATION)
- vect_location = stmt;
+ if (gimple_location (stmt) != UNKNOWN_LOCATION)
+ vect_location = stmt;
- if (!vect_find_stmt_data_reference (NULL, stmt, &datarefs,
- &dataref_groups, current_group))
- ++current_group;
+ if (!vect_find_stmt_data_reference (NULL, stmt, &datarefs,
+ &dataref_groups, current_group))
+ ++current_group;
- if (insns > param_slp_max_insns_in_bb)
- {
- if (dump_enabled_p ())
- dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- "not vectorized: too many instructions in "
- "basic block.\n");
+ if (insns > param_slp_max_insns_in_bb)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "not vectorized: too many instructions in "
+ "basic block.\n");
+ }
}
}
- return vect_slp_region (region_begin, region_end, datarefs,
- &dataref_groups, insns);
+ return vect_slp_region (bbs, datarefs, &dataref_groups, insns);
}
+/* Main entry for the BB vectorizer. Analyze and transform BB, returns
+ true if anything in the basic-block was vectorized. */
+
+bool
+vect_slp_bb (basic_block bb)
+{
+ auto_vec<basic_block> bbs;
+ bbs.safe_push (bb);
+
+ return vect_slp_bbs (bbs);
+}
+
+/* Main entry for the BB vectorizer. Analyze and transform BB, returns
+ true if anything in the basic-block was vectorized. */
+
+bool
+vect_slp_function ()
+{
+ bool r = false;
+ int *rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
+ unsigned n = pre_and_rev_post_order_compute_fn (cfun, NULL, rpo, false);
+
+ auto_vec<basic_block> ebb;
+ for (unsigned i = 0; i < n; i++)
+ {
+ basic_block bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
+ gphi_iterator phi = gsi_start_phis (bb);
+ if (gsi_end_p (phi))
+ ebb.safe_push (bb);
+ else if (!ebb.is_empty ())
+ {
+ r |= vect_slp_bbs (ebb);
+ ebb.truncate (0);
+ ebb.quick_push (bb);
+ }
+ }
+
+ if (!ebb.is_empty ())
+ r |= vect_slp_bbs (ebb);
+
+ free (rpo);
+
+ return r;
+}
/* Build a variable-length vector in which the elements in ELTS are repeated
to a fill NRESULTS vectors of type VECTOR_TYPE. Store the vectors in
@@ -4673,7 +4709,7 @@ vect_schedule_slp_instance (vec_info *vinfo,
we do not insert before the region boundary. */
if (SLP_TREE_SCALAR_OPS (child).is_empty ()
&& !vinfo->lookup_def (SLP_TREE_VEC_DEFS (child)[0]))
- last_stmt = gsi_stmt (as_a <bb_vec_info> (vinfo)->region_begin);
+ last_stmt = gsi_stmt (as_a <bb_vec_info> (vinfo)->region_begin ());
else
{
unsigned j;
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 37e36f556e5..658bd19bbc9 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -605,11 +605,11 @@ vec_info::remove_stmt (stmt_vec_info stmt_info)
set_vinfo_for_stmt (stmt_info->stmt, NULL);
unlink_stmt_vdef (stmt_info->stmt);
gimple_stmt_iterator si = gsi_for_stmt (stmt_info->stmt);
- gimple_stmt_iterator *psi = &si;
+ gimple_stmt_iterator psi = si;
if (bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (this))
- if (gsi_stmt (bb_vinfo->region_begin) == stmt_info->stmt)
- psi = &bb_vinfo->region_begin;
- gsi_remove (psi, true);
+ if (gsi_stmt (bb_vinfo->region_begin ()) == stmt_info->stmt)
+ psi = bb_vinfo->region_begin ();
+ gsi_remove (&psi, true);
release_defs (stmt_info->stmt);
free_stmt_vec_info (stmt_info);
}
@@ -653,7 +653,7 @@ vec_info::insert_seq_on_entry (stmt_vec_info context, gimple_seq seq)
else
{
bb_vec_info bb_vinfo = as_a <bb_vec_info> (this);
- gimple_stmt_iterator gsi_region_begin = bb_vinfo->region_begin;
+ gimple_stmt_iterator gsi_region_begin = bb_vinfo->region_begin ();
gsi_insert_seq_before (&gsi_region_begin, seq, GSI_SAME_STMT);
}
}
@@ -1428,12 +1428,10 @@ pass_slp_vectorize::execute (function *fun)
}
}
- FOR_EACH_BB_FN (bb, fun)
- {
- if (vect_slp_bb (bb))
- if (dump_enabled_p ())
- dump_printf_loc (MSG_NOTE, vect_location, "basic block vectorized\n");
- }
+ if (vect_slp_function ())
+ // TODO: change to function vectorized
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location, "basic block vectorized\n");
if (!in_loop_pipeline)
{
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 37b091558fd..0d1cf8cb3f9 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -832,12 +832,18 @@ public:
struct const_iterator
{
- const_iterator (gimple_stmt_iterator _gsi) : gsi (_gsi) {}
+ const_iterator (gimple_stmt_iterator _gsi, vec<basic_block> _bbs)
+ : gsi (_gsi), bbs (_bbs), bb_index (1) {}
const const_iterator &
operator++ ()
{
- gsi_next (&gsi); return *this;
+ if (!gsi_end_p (gsi))
+ gsi_next (&gsi);
+ while (gsi_end_p (gsi) && bb_index < (int)bbs.length ())
+ gsi = gsi_start_nondebug_after_labels_bb (bbs[bb_index++]);
+
+ return *this;
}
gimple *operator* () const { return gsi_stmt (gsi); }
@@ -845,7 +851,8 @@ public:
bool
operator== (const const_iterator &other) const
{
- return gsi_stmt (gsi) == gsi_stmt (other.gsi);
+ return (gsi_stmt (gsi) == gsi_stmt (other.gsi)
+ && gsi_bb (gsi) == gsi_bb (other.gsi));
}
bool
@@ -855,18 +862,33 @@ public:
}
gimple_stmt_iterator gsi;
+ vec<basic_block> bbs;
+ int bb_index;
};
/* GIMPLE statement iterator going from region_end to region_begin. */
struct const_reverse_iterator
{
- const_reverse_iterator (gimple_stmt_iterator _gsi) : gsi (_gsi) {}
+ const_reverse_iterator (gimple_stmt_iterator _gsi, vec<basic_block> _bbs)
+ : gsi (_gsi), bbs (_bbs)
+ {
+ bb_index = bbs.length () - 1;
+ }
const const_reverse_iterator &
operator++ ()
{
- gsi_prev (&gsi); return *this;
+ if (!gsi_end_p (gsi))
+ gsi_prev (&gsi);
+ while (gsi_end_p (gsi) && bb_index >= 0)
+ {
+ gsi = gsi_last_bb (bbs[bb_index--]);
+ if (!gsi_end_p (gsi))
+ gsi_prev (&gsi);
+ }
+
+ return *this;
}
gimple *operator* () const { return gsi_stmt (gsi); }
@@ -874,7 +896,8 @@ public:
bool
operator== (const const_reverse_iterator &other) const
{
- return gsi_stmt (gsi) == gsi_stmt (other.gsi);
+ return (gsi_stmt (gsi) == gsi_stmt (other.gsi)
+ && gsi_bb (gsi) == gsi_bb (other.gsi));
}
bool
@@ -884,17 +907,35 @@ public:
}
gimple_stmt_iterator gsi;
+ vec<basic_block> bbs;
+ int bb_index;
};
- _bb_vec_info (gimple_stmt_iterator, gimple_stmt_iterator, vec_info_shared *);
+ _bb_vec_info (vec<basic_block> bbs, vec_info_shared *);
~_bb_vec_info ();
+ // TODO
+ gimple_stmt_iterator region_begin ()
+ {
+ return gsi_start_nondebug_after_labels_bb (bbs[0]);
+ }
+
+ // TODO
+ gimple_stmt_iterator region_end ()
+ {
+ gimple_stmt_iterator gsi = gsi_last_bb (bbs[bbs.length () - 1]);
+ if (!gsi_end_p (gsi))
+ gsi_next (&gsi);
+ return gsi;
+ }
+
/* Returns iterator_range for range-based loop. */
iterator_range<const_iterator>
region_stmts ()
{
- return iterator_range<const_iterator> (region_begin, region_end);
+ return iterator_range<const_iterator> (const_iterator (region_begin (), bbs),
+ const_iterator (region_end (), bbs));
}
/* Returns iterator_range for range-based loop in a reverse order. */
@@ -902,19 +943,17 @@ public:
iterator_range<const_reverse_iterator>
reverse_region_stmts ()
{
- const_reverse_iterator begin = region_end;
+ const_reverse_iterator begin (region_end (), bbs);
if (*begin == NULL)
- begin = const_reverse_iterator (gsi_last_bb (gsi_bb (region_end)));
+ begin = const_reverse_iterator (gsi_last_bb (gsi_bb (region_end ())), bbs);
else
++begin;
- const_reverse_iterator end = region_begin;
+ const_reverse_iterator end (region_begin (), bbs);
return iterator_range<const_reverse_iterator> (begin, ++end);
}
- basic_block bb;
- gimple_stmt_iterator region_begin;
- gimple_stmt_iterator region_end;
+ vec<basic_block> bbs;
} *bb_vec_info;
#define BB_VINFO_BB(B) (B)->bb
@@ -2035,6 +2074,7 @@ extern void vect_get_slp_defs (slp_tree, vec<tree> *);
extern void vect_get_slp_defs (vec_info *, slp_tree, vec<vec<tree> > *,
unsigned n = -1U);
extern bool vect_slp_bb (basic_block);
+extern bool vect_slp_function ();
extern stmt_vec_info vect_find_last_scalar_stmt_in_slp (slp_tree);
extern stmt_vec_info vect_find_first_scalar_stmt_in_slp (slp_tree);
extern bool is_simple_and_all_uses_invariant (stmt_vec_info, loop_vec_info);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-10-05 12:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-05 12:18 [gcc(refs/users/marxin/heads/slp-ebb-v2)] Version one Martin Liska
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).