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]

[patch] [4.2 projects] vectorize strided accesses (4 patches)





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]