diff options
author | Ira Rosen <irar@il.ibm.com> | 2006-11-22 08:46:03 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2006-11-22 08:46:03 +0000 |
commit | 98b44b0eeac41545f8b4d236ba5b3fe1562203aa (patch) | |
tree | 4b2ea3085ae0c7d9acece7d444f408bf4d827a97 /gcc/tree-vectorizer.h | |
parent | b0c6db58adfcdd39c80ea0b1895d1b7d255fe633 (diff) | |
download | gcc-98b44b0eeac41545f8b4d236ba5b3fe1562203aa.zip gcc-98b44b0eeac41545f8b4d236ba5b3fe1562203aa.tar.gz gcc-98b44b0eeac41545f8b4d236ba5b3fe1562203aa.tar.bz2 |
c-tree.texi: Document new tree codes.
* doc/c-tree.texi: Document new tree codes.
* doc/md.texi: Document new optabs.
* tree-pretty-print.c (dump_generic_node): Handle print of new tree
codes.
* optabs.c (optab_for_tree_code, init_optabs): Handle new optabs.
* optabs.h (optab_index): Add new.
(vec_extract_even_optab, vec_extract_odd_optab,
vec_interleave_high_optab, vec_interleave_low_optab): New optabs.
* genopinit.c (vec_extract_even_optab, vec_extract_odd_optab,
vec_interleave_high_optab, vec_interleave_low_optab): Initialize
new optabs.
* expr.c (expand_expr_real_1): Add implementation for new tree codes.
* tree-vectorizer.c (new_stmt_vec_info): Initialize new fields.
* tree-vectorizer.h (stmt_vec_info): Add new fields for interleaving
along with macros for their access.
* tree-data-ref.h (first_location_in_loop, data_reference): Update
comment.
* tree-vect-analyze.c (toplev.h): Include.
(vect_determine_vectorization_factor): Fix indentation.
(vect_insert_into_interleaving_chain,
vect_update_interleaving_chain, vect_equal_offsets): New functions.
(vect_analyze_data_ref_dependence): Add argument for interleaving
check. Check for interleaving if it's true.
(vect_check_dependences): New function.
(vect_analyze_data_ref_dependences): Call vect_check_dependences for
every ddr. Call vect_analyze_data_ref_dependence with new argument.
(vect_update_misalignment_for_peel): Update for interleaving.
(vect_verify_datarefs_alignment): Check only first data-ref for
interleaving.
(vect_enhance_data_refs_alignment): Update for interleaving. Check
only first data-ref for interleaving.
(vect_analyze_data_ref_access): Check interleaving, update
interleaving data.
(vect_analyze_data_refs): Call compute_data_dependences_for_loop
with different parameters.
* tree.def (VEC_EXTRACT_EVEN_EXPR, VEC_EXTRACT_ODD_EXPR,
VEC_INTERLEAVE_HIGH_EXPR, VEC_INTERLEAVE_LOW_EXPR): New tree codes.
* tree-inline.c (estimate_num_insns_1): Add cases for new codes.
* tree-vect-transform.c (vect_create_addr_base_for_vector_ref):
Update step in case of interleaving.
(vect_strided_store_supported, vect_permute_store_chain): New
functions.
(vectorizable_store): Handle strided stores.
(vect_strided_load_supported, vect_permute_load_chain,
vect_transform_strided_load): New functions.
(vectorizable_load): Handle strided loads.
(vect_transform_stmt): Add argument. Handle strided stores. Check
that vectorized stmt exists for patterns.
(vect_gen_niters_for_prolog_loop): Update calculation for
interleaving.
(vect_transform_loop): Remove stmt_vec_info for strided stores after
whole chain vectorization.
* config/rs6000/altivec.md (UNSPEC_EXTEVEN, UNSPEC_EXTODD,
UNSPEC_INTERHI, UNSPEC_INTERLO): New constants.
(vpkuhum_nomode, vpkuwum_nomode, vec_extract_even<mode>,
vec_extract_odd<mode>, altivec_vmrghsf, altivec_vmrglsf,
vec_interleave_high<mode>, vec_interleave_low<mode>): Implement.
From-SVN: r119088
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 8341ad0..9d75133 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -235,21 +235,50 @@ typedef struct _stmt_vec_info { /* Classify the def of this stmt. */ enum vect_def_type def_type; + /* Interleaving info. */ + /* First data-ref in the interleaving group. */ + tree first_dr; + /* Pointer to the next data-ref in the group. */ + tree next_dr; + /* The size of the interleaving group. */ + unsigned int size; + /* For stores, number of stores from this group seen. We vectorize the last + one. */ + unsigned int store_count; + /* For loads only, the gap from the previous load. For consecutive loads, GAP + is 1. */ + unsigned int gap; + /* In case that two or more stmts share data-ref, this is the pointer to the + previously detected stmt with the same dr. */ + tree same_dr_stmt; } *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_RELEVANT(S) (S)->relevant -#define STMT_VINFO_LIVE_P(S) (S)->live -#define STMT_VINFO_VECTYPE(S) (S)->vectype -#define STMT_VINFO_VEC_STMT(S) (S)->vectorized_stmt -#define STMT_VINFO_DATA_REF(S) (S)->data_ref_info -#define STMT_VINFO_IN_PATTERN_P(S) (S)->in_pattern_p -#define STMT_VINFO_RELATED_STMT(S) (S)->related_stmt -#define STMT_VINFO_SAME_ALIGN_REFS(S) (S)->same_align_refs -#define STMT_VINFO_DEF_TYPE(S) (S)->def_type +#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_RELEVANT(S) (S)->relevant +#define STMT_VINFO_LIVE_P(S) (S)->live +#define STMT_VINFO_VECTYPE(S) (S)->vectype +#define STMT_VINFO_VEC_STMT(S) (S)->vectorized_stmt +#define STMT_VINFO_DATA_REF(S) (S)->data_ref_info +#define STMT_VINFO_IN_PATTERN_P(S) (S)->in_pattern_p +#define STMT_VINFO_RELATED_STMT(S) (S)->related_stmt +#define STMT_VINFO_SAME_ALIGN_REFS(S) (S)->same_align_refs +#define STMT_VINFO_DEF_TYPE(S) (S)->def_type +#define STMT_VINFO_DR_GROUP_FIRST_DR(S) (S)->first_dr +#define STMT_VINFO_DR_GROUP_NEXT_DR(S) (S)->next_dr +#define STMT_VINFO_DR_GROUP_SIZE(S) (S)->size +#define STMT_VINFO_DR_GROUP_STORE_COUNT(S) (S)->store_count +#define STMT_VINFO_DR_GROUP_GAP(S) (S)->gap +#define STMT_VINFO_DR_GROUP_SAME_DR_STMT(S)(S)->same_dr_stmt + +#define DR_GROUP_FIRST_DR(S) (S)->first_dr +#define DR_GROUP_NEXT_DR(S) (S)->next_dr +#define DR_GROUP_SIZE(S) (S)->size +#define DR_GROUP_STORE_COUNT(S) (S)->store_count +#define DR_GROUP_GAP(S) (S)->gap +#define DR_GROUP_SAME_DR_STMT(S) (S)->same_dr_stmt #define STMT_VINFO_RELEVANT_P(S) ((S)->relevant != vect_unused_in_loop) |