aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r--gcc/tree-vectorizer.h129
1 files changed, 70 insertions, 59 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index e4d1feb..53c90ea 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -230,11 +230,51 @@ peel_info_hasher::equal (const _vect_peel_info *a, const _vect_peel_info *b)
return (a->npeel == b->npeel);
}
+/* Vectorizer state common between loop and basic-block vectorization. */
+struct vec_info {
+ enum { bb, loop } kind;
+
+ /* All SLP instances. */
+ vec<slp_instance> slp_instances;
+
+ /* All data references. */
+ vec<data_reference_p> datarefs;
+
+ /* All data dependences. */
+ vec<ddr_p> ddrs;
+
+ /* All interleaving chains of stores, represented by the first
+ stmt in the chain. */
+ vec<gimple *> grouped_stores;
+
+ /* Cost data used by the target cost model. */
+ void *target_cost_data;
+};
+
+struct _loop_vec_info;
+struct _bb_vec_info;
+
+template<>
+template<>
+inline bool
+is_a_helper <_loop_vec_info *>::test (vec_info *i)
+{
+ return i->kind == vec_info::loop;
+}
+
+template<>
+template<>
+inline bool
+is_a_helper <_bb_vec_info *>::test (vec_info *i)
+{
+ return i->kind == vec_info::bb;
+}
+
/*-----------------------------------------------------------------*/
/* Info on vectorized loops. */
/*-----------------------------------------------------------------*/
-typedef struct _loop_vec_info {
+typedef struct _loop_vec_info : public vec_info {
/* The loop to which this info struct refers to. */
struct loop *loop;
@@ -286,12 +326,6 @@ typedef struct _loop_vec_info {
/* The loop nest in which the data dependences are computed. */
vec<loop_p> loop_nest;
- /* All data references in the loop. */
- vec<data_reference_p> datarefs;
-
- /* All data dependences in the loop. */
- vec<ddr_p> ddrs;
-
/* Data Dependence Relations defining address ranges that are candidates
for a run-time aliasing check. */
vec<ddr_p> may_alias_ddrs;
@@ -304,14 +338,6 @@ typedef struct _loop_vec_info {
runtime (loop versioning) misalignment check. */
vec<gimple *> may_misalign_stmts;
- /* All interleaving chains of stores in the loop, represented by the first
- stmt in the chain. */
- vec<gimple *> grouped_stores;
-
- /* All SLP instances in the loop. This is a subset of the set of GROUP_STORES
- of the loop. */
- vec<slp_instance> slp_instances;
-
/* The unrolling factor needed to SLP the loop. In case of that pure SLP is
applied to the loop, i.e., no unrolling is needed, this is 1. */
unsigned slp_unrolling_factor;
@@ -332,9 +358,6 @@ typedef struct _loop_vec_info {
/* Cost of a single scalar iteration. */
int single_scalar_iteration_cost;
- /* Cost data used by the target cost model. */
- void *target_cost_data;
-
/* When we have grouped data accesses with gaps, we may introduce invalid
memory accesses. We peel the last iteration of the loop to prevent
this. */
@@ -434,26 +457,9 @@ nested_in_vect_loop_p (struct loop *loop, gimple *stmt)
&& (loop->inner == (gimple_bb (stmt))->loop_father));
}
-typedef struct _bb_vec_info {
-
+typedef struct _bb_vec_info : public vec_info
+{
basic_block bb;
- /* All interleaving chains of stores in the basic block, represented by the
- first stmt in the chain. */
- vec<gimple *> grouped_stores;
-
- /* All SLP instances in the basic block. This is a subset of the set of
- GROUP_STORES of the basic block. */
- vec<slp_instance> slp_instances;
-
- /* All data references in the basic block. */
- vec<data_reference_p> datarefs;
-
- /* All data dependences in the basic block. */
- vec<ddr_p> ddrs;
-
- /* Cost data used by the target cost model. */
- void *target_cost_data;
-
} *bb_vec_info;
#define BB_VINFO_BB(B) (B)->bb
@@ -551,8 +557,8 @@ typedef struct _stmt_vec_info {
/* The stmt to which this info struct refers to. */
gimple *stmt;
- /* The loop_vec_info with respect to which STMT is vectorized. */
- loop_vec_info loop_vinfo;
+ /* The vec_info with respect to which STMT is vectorized. */
+ vec_info *vinfo;
/* The vector type to be used for the LHS of this statement. */
tree vectype;
@@ -639,9 +645,6 @@ typedef struct _stmt_vec_info {
indicates whether the stmt needs to be vectorized. */
enum vect_relevant relevant;
- /* The bb_vec_info with respect to which STMT is vectorized. */
- bb_vec_info bb_vinfo;
-
/* Is this statement vectorizable or should it be skipped in (partial)
vectorization. */
bool vectorizable;
@@ -659,8 +662,20 @@ typedef struct _stmt_vec_info {
/* Access Functions. */
#define STMT_VINFO_TYPE(S) (S)->type
#define STMT_VINFO_STMT(S) (S)->stmt
-#define STMT_VINFO_LOOP_VINFO(S) (S)->loop_vinfo
-#define STMT_VINFO_BB_VINFO(S) (S)->bb_vinfo
+inline loop_vec_info
+STMT_VINFO_LOOP_VINFO (stmt_vec_info stmt_vinfo)
+{
+ if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (stmt_vinfo->vinfo))
+ return loop_vinfo;
+ return NULL;
+}
+inline bb_vec_info
+STMT_VINFO_BB_VINFO (stmt_vec_info stmt_vinfo)
+{
+ if (bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (stmt_vinfo->vinfo))
+ return bb_vinfo;
+ return NULL;
+}
#define STMT_VINFO_RELEVANT(S) (S)->relevant
#define STMT_VINFO_LIVE_P(S) (S)->live
#define STMT_VINFO_VECTYPE(S) (S)->vectype
@@ -996,11 +1011,9 @@ extern bool vect_can_advance_ivs_p (loop_vec_info);
extern unsigned int current_vector_size;
extern tree get_vectype_for_scalar_type (tree);
extern tree get_same_sized_vectype (tree, tree);
-extern bool vect_is_simple_use (tree, gimple *, loop_vec_info,
- bb_vec_info, gimple **,
+extern bool vect_is_simple_use (tree, gimple *, vec_info *, gimple **,
tree *, enum vect_def_type *);
-extern bool vect_is_simple_use_1 (tree, gimple *, loop_vec_info,
- bb_vec_info, gimple **,
+extern bool vect_is_simple_use_1 (tree, gimple *, vec_info *, gimple **,
tree *, enum vect_def_type *, tree *);
extern bool supportable_widening_operation (enum tree_code, gimple *, tree,
tree, enum tree_code *,
@@ -1009,8 +1022,7 @@ extern bool supportable_widening_operation (enum tree_code, gimple *, tree,
extern bool supportable_narrowing_operation (enum tree_code, tree, tree,
enum tree_code *,
int *, vec<tree> *);
-extern stmt_vec_info new_stmt_vec_info (gimple *stmt, loop_vec_info,
- bb_vec_info);
+extern stmt_vec_info new_stmt_vec_info (gimple *stmt, vec_info *);
extern void free_stmt_vec_info (gimple *stmt);
extern tree vectorizable_function (gcall *, tree, tree);
extern void vect_model_simple_cost (stmt_vec_info, int, enum vect_def_type *,
@@ -1060,14 +1072,13 @@ extern tree vect_get_smallest_scalar_type (gimple *, HOST_WIDE_INT *,
extern bool vect_analyze_data_ref_dependences (loop_vec_info, int *);
extern bool vect_slp_analyze_data_ref_dependences (bb_vec_info);
extern bool vect_enhance_data_refs_alignment (loop_vec_info);
-extern bool vect_analyze_data_refs_alignment (loop_vec_info, bb_vec_info);
-extern bool vect_verify_datarefs_alignment (loop_vec_info, bb_vec_info);
-extern bool vect_analyze_data_ref_accesses (loop_vec_info, bb_vec_info);
+extern bool vect_analyze_data_refs_alignment (vec_info *);
+extern bool vect_verify_datarefs_alignment (vec_info *);
+extern bool vect_analyze_data_ref_accesses (vec_info *);
extern bool vect_prune_runtime_alias_test_list (loop_vec_info);
extern tree vect_check_gather_scatter (gimple *, loop_vec_info, tree *, tree *,
int *);
-extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info, int *,
- unsigned *);
+extern bool vect_analyze_data_refs (vec_info *, int *, unsigned *);
extern tree vect_create_data_ref_ptr (gimple *, tree, struct loop *, tree,
tree *, gimple_stmt_iterator *,
gimple **, bool, bool *,
@@ -1121,8 +1132,8 @@ extern bool vect_transform_slp_perm_load (slp_tree, vec<tree> ,
slp_instance, bool);
extern bool vect_slp_analyze_operations (vec<slp_instance> slp_instances,
void *);
-extern bool vect_schedule_slp (loop_vec_info, bb_vec_info);
-extern bool vect_analyze_slp (loop_vec_info, bb_vec_info, unsigned);
+extern bool vect_schedule_slp (vec_info *);
+extern bool vect_analyze_slp (vec_info *, unsigned);
extern bool vect_make_slp_decision (loop_vec_info);
extern void vect_detect_hybrid_slp (loop_vec_info);
extern void vect_get_slp_defs (vec<tree> , slp_tree,
@@ -1138,10 +1149,10 @@ extern void vect_slp_transform_bb (basic_block);
in the future. */
typedef gimple *(* vect_recog_func_ptr) (vec<gimple *> *, tree *, tree *);
#define NUM_PATTERNS 13
-void vect_pattern_recog (loop_vec_info, bb_vec_info);
+void vect_pattern_recog (vec_info *);
/* In tree-vectorizer.c. */
unsigned vectorize_loops (void);
-void vect_destroy_datarefs (loop_vec_info, bb_vec_info);
+void vect_destroy_datarefs (vec_info *);
#endif /* GCC_TREE_VECTORIZER_H */