mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-12 21:33:54 +08:00
middle-end: Store and use the SLP instance kind when aborting load/store lanes
This patch stores the SLP instance kind in the SLP instance so that we can use it later when detecting load/store lanes support. This also changes the load/store lane support check to only check if the SLP kind is a store. This means that in order for the load/lanes to work all instances must be of kind store. gcc/ChangeLog: * tree-vect-loop.c (vect_analyze_loop_2): Check kind. * tree-vect-slp.c (vect_build_slp_instance): New. (enum slp_instance_kind): Move to... * tree-vectorizer.h (enum slp_instance_kind): .. Here (SLP_INSTANCE_KIND): New.
This commit is contained in:
parent
025f434a87
commit
e3587a2d8b
@ -2394,6 +2394,7 @@ start_over:
|
||||
/* If the loads and stores can be handled with load/store-lane
|
||||
instructions record it and move on to the next instance. */
|
||||
if (loads_permuted
|
||||
&& SLP_INSTANCE_KIND (instance) == slp_inst_kind_store
|
||||
&& vect_store_lanes_supported (vectype, group_size, false))
|
||||
{
|
||||
FOR_EACH_VEC_ELT (SLP_INSTANCE_LOADS (instance), i, load_node)
|
||||
|
@ -2171,13 +2171,6 @@ calculate_unrolling_factor (poly_uint64 nunits, unsigned int group_size)
|
||||
return exact_div (common_multiple (nunits, group_size), group_size);
|
||||
}
|
||||
|
||||
enum slp_instance_kind {
|
||||
slp_inst_kind_store,
|
||||
slp_inst_kind_reduc_group,
|
||||
slp_inst_kind_reduc_chain,
|
||||
slp_inst_kind_ctor
|
||||
};
|
||||
|
||||
static bool
|
||||
vect_analyze_slp_instance (vec_info *vinfo,
|
||||
scalar_stmts_to_slp_tree_map_t *bst_map,
|
||||
@ -2253,6 +2246,7 @@ vect_build_slp_instance (vec_info *vinfo,
|
||||
SLP_INSTANCE_UNROLLING_FACTOR (new_instance) = unrolling_factor;
|
||||
SLP_INSTANCE_LOADS (new_instance) = vNULL;
|
||||
SLP_INSTANCE_ROOT_STMT (new_instance) = root_stmt_info;
|
||||
SLP_INSTANCE_KIND (new_instance) = kind;
|
||||
new_instance->reduc_phis = NULL;
|
||||
new_instance->cost_vec = vNULL;
|
||||
new_instance->subgraph_entries = vNULL;
|
||||
|
@ -174,6 +174,15 @@ struct _slp_tree {
|
||||
static void operator delete (void *, size_t);
|
||||
};
|
||||
|
||||
/* The enum describes the type of operations that an SLP instance
|
||||
can perform. */
|
||||
|
||||
enum slp_instance_kind {
|
||||
slp_inst_kind_store,
|
||||
slp_inst_kind_reduc_group,
|
||||
slp_inst_kind_reduc_chain,
|
||||
slp_inst_kind_ctor
|
||||
};
|
||||
|
||||
/* SLP instance is a sequence of stmts in a loop that can be packed into
|
||||
SIMD stmts. */
|
||||
@ -202,6 +211,9 @@ public:
|
||||
entries into the same subgraph, including itself. */
|
||||
vec<_slp_instance *> subgraph_entries;
|
||||
|
||||
/* The type of operation the SLP instance is performing. */
|
||||
slp_instance_kind kind;
|
||||
|
||||
dump_user_location_t location () const;
|
||||
} *slp_instance;
|
||||
|
||||
@ -211,6 +223,7 @@ public:
|
||||
#define SLP_INSTANCE_UNROLLING_FACTOR(S) (S)->unrolling_factor
|
||||
#define SLP_INSTANCE_LOADS(S) (S)->loads
|
||||
#define SLP_INSTANCE_ROOT_STMT(S) (S)->root_stmt
|
||||
#define SLP_INSTANCE_KIND(S) (S)->kind
|
||||
|
||||
#define SLP_TREE_CHILDREN(S) (S)->children
|
||||
#define SLP_TREE_SCALAR_STMTS(S) (S)->stmts
|
||||
|
Loading…
Reference in New Issue
Block a user