This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Support vectorization in the presence strided loads in the loop This part includes: (*) fixes to the analysis part: don't fail in the presence of strided access (*) support for loads and stores in the presence of interlieved accesses. The remaining patches will add the following support: part 2 - vectorize strided stores part 3 - vectorize strided loads with gaps part 4 - vectorize loops with several loads from the same data referencetype demotion ok for mainline? thanks, -- Victor (for Ira Rozen) :ADDPATCH SSA (vectorizer): Part 1/4 * 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): New optabs. * genopinit.c (vec_extract_even_optab, vec_extract_odd_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.c (object_analysis): Handle COMPONENT_REFs. (create_data_ref): Handle offsets with casts. Always analyze offset. Handle COMPONENT_REFs. (find_data_references_in_loop): Handle COMPONENT_REFs. * tree-data-ref.h (first_location_in_loop): Update comment. * tree-vect-analyze.c (toplev.h): Include. (vect_insert_into_interleaving_chain, vect_update_interleaving_chain, vect_equal_offsets): New functions. (vect_analyze_data_ref_dependence): Check for interleaving. (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): 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_permute_load_chain, vect_transform_strided_load): New function. (vectorizable_load): Handle interleaved loads. (vect_gen_niters_for_prolog_loop): Update calculation for interleaving. * config/rs6000/altivec.md (UNSPEC_EXTEVEN, UNSPEC_EXTODD): New constants. (vpkuhum_nomode, vpkuwum_nomode, vec_extract_even<mode>, vec_extract_odd<mode>): Implement. (See attached file: mainline.strided.patch1.load.txt) Part 2/4 * 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_interleave_high_optab, vec_interleave_low_optab): New optabs. * genopinit.c (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 field. * tree-vectorizer.h (stmt_vec_info): Add new field, size, for interleaving along with macros for its access. * tree.def (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_strided_store_supported): New function. (vect_permute_store_chain): Likewise. (vectorizable_store): Handle strided stores. (vect_transform_stmt): Add argument. Handle strided stores. Check that vectorized stmt exists for patterns. (vect_transform_loop): Remove stmt_vec_info for strided stores only after whole chain vectorization. * config/rs6000/altivec.md (UNSPEC_INTERHI, UNSPEC_INTERLO): New constants. (altivec_vmrghsf, altivec_vmrglsf, vec_interleave_high<mode>, vec_interleave_low<mode>): Implement. (See attached file: mainline.strided.patch2.store.txt) Part 3/4 * tree-vectorizer.c (new_stmt_vec_info): Initialize new field. * tree-vectorizer.h (stmt_vec_info): Add new field, gap, for interleaving along with macros for its access. * tree-vect-analyze.c (vect_analyze_data_ref_access): Detect single element interleaving. Store gaps for loads. * tree-vect-transform.c (vect_transform_strided_load): Handle loads with gaps. testsute/ChageLog * gcc.dg/vect/vect-strided-a-u8-i2-gap.c: New test. * gcc.dg/vect/vect-strided-a-u8-i8-gap2.c: Likewise. * gcc.dg/vect/vect-strided-a-u8-i8-gap7.c: Likewise. * gcc.dg/vect/vect-strided-u8-i2-gap.c: Likewise. * gcc.dg/vect/vect-strided-u8-i8-gap2.c: Likewise. * gcc.dg/vect/vect-strided-u8-i8-gap4.c: Likewise. * gcc.dg/vect/vect-strided-u8-i8-gap7.c: Likewise. (See attached file: mainline.strided.patch3.gaps.txt) Part 4/4 * tree-vectorizer.c (new_stmt_vec_info): Initialize new field. * tree-vectorizer.h (stmt_vec_info): Add new field, same_dr, for interleaving along with macros for its access. * tree-vect-analyze.c (vect_analyze_data_ref_dependence): Add argument for interleaving check. Check interleaving only 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_analyze_data_ref_access): Skip stmts with same data-ref. * tree-vect-transform.c (vect_transform_strided_load): Handle stmts with same data-ref. (See attached file: mainline.strided.patch4.samedr.txt)
Attachment:
mainline.strided.patch1.load.txt
Description: Text document
Attachment:
mainline.strided.patch2.store.txt
Description: Text document
Attachment:
mainline.strided.patch3.gaps.txt
Description: Text document
Attachment:
mainline.strided.patch4.samedr.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |