diff options
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 63 |
1 files changed, 51 insertions, 12 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 2422f44..bf29170 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -281,6 +281,36 @@ nested_in_vect_loop_p (struct loop *loop, gimple stmt) && (loop->inner == (gimple_bb (stmt))->loop_father)); } +typedef struct _bb_vec_info { + + basic_block bb; + /* All interleaving chains of stores in the basic block, represented by the + first stmt in the chain. */ + VEC(gimple, heap) *strided_stores; + + /* All SLP instances in the basic block. This is a subset of the set of + STRIDED_STORES of the basic block. */ + VEC(slp_instance, heap) *slp_instances; + + /* All data references in the basic block. */ + VEC (data_reference_p, heap) *datarefs; + + /* All data dependences in the basic block. */ + VEC (ddr_p, heap) *ddrs; +} *bb_vec_info; + +#define BB_VINFO_BB(B) (B)->bb +#define BB_VINFO_STRIDED_STORES(B) (B)->strided_stores +#define BB_VINFO_SLP_INSTANCES(B) (B)->slp_instances +#define BB_VINFO_DATAREFS(B) (B)->datarefs +#define BB_VINFO_DDRS(B) (B)->ddrs + +static inline bb_vec_info +vec_info_for_bb (basic_block bb) +{ + return (bb_vec_info) bb->aux; +} + /*-----------------------------------------------------------------*/ /* Info on vectorized defs. */ /*-----------------------------------------------------------------*/ @@ -437,12 +467,16 @@ typedef struct _stmt_vec_info { /* Whether the stmt is SLPed, loop-based vectorized, or both. */ enum slp_vect_type slp_type; + + /* The bb_vec_info with respect to which STMT is vectorized. */ + bb_vec_info bb_vinfo; } *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 #define STMT_VINFO_RELEVANT(S) (S)->relevant #define STMT_VINFO_LIVE_P(S) (S)->live #define STMT_VINFO_VECTYPE(S) (S)->vectype @@ -707,15 +741,15 @@ extern void slpeel_make_loop_iterate_ntimes (struct loop *, tree); extern bool slpeel_can_duplicate_loop_p (const struct loop *, const_edge); extern void vect_loop_versioning (loop_vec_info, bool, tree *, gimple_seq *); extern void vect_do_peeling_for_loop_bound (loop_vec_info, tree *, - tree, gimple_seq); + tree, gimple_seq); extern void vect_do_peeling_for_alignment (loop_vec_info); extern LOC find_loop_location (struct loop *); extern bool vect_can_advance_ivs_p (loop_vec_info); /* In tree-vect-stmts.c. */ extern tree get_vectype_for_scalar_type (tree); -extern bool vect_is_simple_use (tree, loop_vec_info, gimple *, tree *, - enum vect_def_type *); +extern bool vect_is_simple_use (tree, loop_vec_info, bb_vec_info, gimple *, + tree *, enum vect_def_type *); extern bool supportable_widening_operation (enum tree_code, gimple, tree, tree *, tree *, enum tree_code *, enum tree_code *, int *, @@ -723,7 +757,8 @@ extern bool supportable_widening_operation (enum tree_code, gimple, tree, extern bool supportable_narrowing_operation (enum tree_code, const_gimple, tree, enum tree_code *, int *, VEC (tree, heap) **); -extern stmt_vec_info new_stmt_vec_info (gimple stmt, loop_vec_info); +extern stmt_vec_info new_stmt_vec_info (gimple stmt, loop_vec_info, + bb_vec_info); extern void free_stmt_vec_info (gimple stmt); extern tree vectorizable_function (gimple, tree, tree); extern void vect_model_simple_cost (stmt_vec_info, int, enum vect_def_type *, @@ -742,7 +777,7 @@ extern tree vect_get_vec_def_for_stmt_copy (enum vect_def_type, tree); extern bool vect_transform_stmt (gimple, gimple_stmt_iterator *, bool *, slp_tree, slp_instance); extern void vect_remove_stores (gimple); -extern bool vect_analyze_stmt (gimple, bool *); +extern bool vect_analyze_stmt (gimple, bool *, slp_tree); /* In tree-vect-data-refs.c. */ extern bool vect_can_force_dr_alignment_p (const_tree, unsigned int); @@ -750,14 +785,15 @@ extern enum dr_alignment_support vect_supportable_dr_alignment (struct data_reference *); extern tree vect_get_smallest_scalar_type (gimple, HOST_WIDE_INT *, HOST_WIDE_INT *); -extern bool vect_analyze_data_ref_dependences (loop_vec_info); +extern bool vect_analyze_data_ref_dependences (loop_vec_info, bb_vec_info); extern bool vect_enhance_data_refs_alignment (loop_vec_info); -extern bool vect_analyze_data_refs_alignment (loop_vec_info); -extern bool vect_analyze_data_ref_accesses (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_prune_runtime_alias_test_list (loop_vec_info); -extern bool vect_analyze_data_refs (loop_vec_info); +extern bool vect_analyze_data_refs (loop_vec_info, bb_vec_info); extern tree vect_create_data_ref_ptr (gimple, struct loop *, tree, tree *, - gimple *, bool, bool *); + gimple *, bool, bool *); extern tree bump_vector_ptr (tree, gimple, gimple_stmt_iterator *, gimple, tree); extern tree vect_create_destination_var (tree, tree); extern bool vect_strided_store_supported (tree); @@ -799,13 +835,16 @@ extern void vect_free_slp_instance (slp_instance); extern bool vect_transform_slp_perm_load (gimple, VEC (tree, heap) *, gimple_stmt_iterator *, int, slp_instance, bool); -extern bool vect_schedule_slp (loop_vec_info); +extern bool vect_schedule_slp (loop_vec_info, bb_vec_info); extern void vect_update_slp_costs_according_to_vf (loop_vec_info); -extern bool vect_analyze_slp (loop_vec_info); +extern bool vect_analyze_slp (loop_vec_info, bb_vec_info); extern void vect_make_slp_decision (loop_vec_info); extern void vect_detect_hybrid_slp (loop_vec_info); extern void vect_get_slp_defs (slp_tree, VEC (tree,heap) **, VEC (tree,heap) **); +extern LOC find_bb_location (basic_block); +extern bb_vec_info vect_slp_analyze_bb (basic_block); +extern void vect_slp_transform_bb (basic_block); /* In tree-vect-patterns.c. */ /* Pattern recognition functions. |