diff options
author | Ira Rosen <ira.rosen@linaro.org> | 2011-09-27 12:26:34 +0000 |
---|---|---|
committer | Ira Rosen <ira.rosen@linaro.org> | 2011-09-27 12:26:34 +0000 |
commit | da5cb8445ea9b6df1be78146059ffbf15728757d (patch) | |
tree | a9affb65d722fc832803aca53919d2087436bef2 /gcc/tree-vect-slp.c | |
parent | 9e7ff2b7ac97cc9e56cfc4e6d363192b1cd9175e (diff) |
* tree-vect-stmts.c (vectorizable_type_demotion): Handle basic
block vectorization.
(vectorizable_type_promotion): Likewise.
(vect_analyze_stmt): Call vectorizable_type_demotion and
vectorizable_type_promotion for basic blocks.
(supportable_widening_operation): Don't assume loop
vectorization.
* tree-vect-slp.c (vect_build_slp_tree): Allow multiple types
for basic blocks. Update vectorization factor for basic block
vectorization.
(vect_analyze_slp_instance): Allow multiple types for basic
block vectorization. Recheck unrolling factor after
construction of SLP instance.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@179267 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r-- | gcc/tree-vect-slp.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 5dc5cf694b2..4b205bf332a 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -393,20 +393,15 @@ vect_build_slp_tree (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, return false; } - ncopies = vectorization_factor / TYPE_VECTOR_SUBPARTS (vectype); - if (ncopies != 1) + /* In case of multiple types we need to detect the smallest type. */ + if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype)) { - if (vect_print_dump_info (REPORT_SLP)) - fprintf (vect_dump, "SLP with multiple types "); - - /* FORNOW: multiple types are unsupported in BB SLP. */ - if (bb_vinfo) - return false; + *max_nunits = TYPE_VECTOR_SUBPARTS (vectype); + if (bb_vinfo) + vectorization_factor = *max_nunits; } - /* In case of multiple types we need to detect the smallest type. */ - if (*max_nunits < TYPE_VECTOR_SUBPARTS (vectype)) - *max_nunits = TYPE_VECTOR_SUBPARTS (vectype); + ncopies = vectorization_factor / TYPE_VECTOR_SUBPARTS (vectype); if (is_gimple_call (stmt)) rhs_code = CALL_EXPR; @@ -1201,7 +1196,6 @@ vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, if (loop_vinfo) vectorization_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo); else - /* No multitypes in BB SLP. */ vectorization_factor = nunits; /* Calculate the unrolling factor. */ @@ -1257,16 +1251,23 @@ vect_analyze_slp_instance (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo, &max_nunits, &load_permutation, &loads, vectorization_factor)) { - /* Create a new SLP instance. */ - new_instance = XNEW (struct _slp_instance); - SLP_INSTANCE_TREE (new_instance) = node; - SLP_INSTANCE_GROUP_SIZE (new_instance) = group_size; - /* Calculate the unrolling factor based on the smallest type in the - loop. */ + /* Calculate the unrolling factor based on the smallest type. */ if (max_nunits > nunits) unrolling_factor = least_common_multiple (max_nunits, group_size) / group_size; + if (unrolling_factor != 1 && !loop_vinfo) + { + if (vect_print_dump_info (REPORT_SLP)) + fprintf (vect_dump, "Build SLP failed: unrolling required in basic" + " block SLP"); + return false; + } + + /* Create a new SLP instance. */ + new_instance = XNEW (struct _slp_instance); + SLP_INSTANCE_TREE (new_instance) = node; + SLP_INSTANCE_GROUP_SIZE (new_instance) = group_size; SLP_INSTANCE_UNROLLING_FACTOR (new_instance) = unrolling_factor; SLP_INSTANCE_OUTSIDE_OF_LOOP_COST (new_instance) = outside_cost; SLP_INSTANCE_INSIDE_OF_LOOP_COST (new_instance) = inside_cost; |