diff options
author | Richard Henderson <rth@redhat.com> | 2011-10-25 21:29:48 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2011-10-25 21:29:48 +0000 |
commit | 81999d4449f1bd8f2cc0c69981fdc6b061b730a6 (patch) | |
tree | 646bec23201b08685d3560602023733c6d9f7259 /gcc/tree-vect-slp.c | |
parent | 5761c612c9cf8c9262a8c85c034beb616bfdd448 (diff) |
Change vec_perm checking and expansion level.
The can_vec_perm_p interface changed to use a C integer array. This
allows easy re-use from the rtl level and the gimple level within
the vectorizer. It allows both to determine if a given permutation
is (un-)supported without having to create tree/rtl garbage.
The expand_vec_perm interface changed to use rtl. This allows easy
re-use from the rtl level, so that expand_vec_perm can be used in the
fallback implementation of other optabs.
* target.def (vec_perm_const_ok): Change parameters to mode and
array of indicies.
* doc/tm.texi: Rebuild.
* config/i386/i386.c (ix86_vectorize_vec_perm_const_ok): Change
parameters to mode and array of indicies.
* expr.c (expand_expr_real_2) [VEC_PERM_EXPR]: Expand operands here.
* optabs.c (can_vec_perm_p): Rename from can_vec_perm_expr_p.
Change parameters to mode and array of indicies.
(expand_vec_perm_1): Rename from expand_vec_perm_expr_1.
(expand_vec_perm): Rename from expand_vec_perm_expr. Change
parameters to mode and rtx inputs. Try lowering to QImode
vec_perm_const before trying fully variable permutation.
* optabs.h: Update decls.
* tree-vect-generic.c (lower_vec_perm): Extract array of indices from
VECTOR_CST to pass to can_vec_perm_p.
* tree-vect-slp.c (vect_get_mask_element): Change mask parameter type
from int pointer to unsigned char pointer.
(vect_transform_slp_perm_load): Update for change to can_vec_perm_p.
* tree-vect-stmts.c (perm_mask_for_reverse): Likewise.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@180449 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-slp.c')
-rw-r--r-- | gcc/tree-vect-slp.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index f75817b985f..790f2dd0a75 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2356,7 +2356,7 @@ vect_create_mask_and_perm (gimple stmt, gimple next_scalar_stmt, static bool vect_get_mask_element (gimple stmt, int first_mask_element, int m, int mask_nunits, bool only_one_vec, int index, - int *mask, int *current_mask_element, + unsigned char *mask, int *current_mask_element, bool *need_next_vector, int *number_of_mask_fixes, bool *mask_fixed, bool *needs_first_vector) { @@ -2443,14 +2443,18 @@ vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain, gimple next_scalar_stmt; int group_size = SLP_INSTANCE_GROUP_SIZE (slp_node_instance); int first_mask_element; - int index, unroll_factor, *mask, current_mask_element, ncopies; + int index, unroll_factor, current_mask_element, ncopies; + unsigned char *mask; bool only_one_vec = false, need_next_vector = false; int first_vec_index, second_vec_index, orig_vec_stmts_num, vect_stmts_counter; int number_of_mask_fixes = 1; bool mask_fixed = false; bool needs_first_vector = false; + enum machine_mode mode; - if (!can_vec_perm_expr_p (vectype, NULL_TREE)) + mode = TYPE_MODE (vectype); + + if (!can_vec_perm_p (mode, false, NULL)) { if (vect_print_dump_info (REPORT_DETAILS)) { @@ -2467,7 +2471,7 @@ vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain, (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (vectype))), 1); mask_type = get_vectype_for_scalar_type (mask_element_type); nunits = TYPE_VECTOR_SUBPARTS (vectype); - mask = (int *) xmalloc (sizeof (int) * nunits); + mask = XALLOCAVEC (unsigned char, nunits); unroll_factor = SLP_INSTANCE_UNROLLING_FACTOR (slp_node_instance); /* The number of vector stmts to generate based only on SLP_NODE_INSTANCE @@ -2529,6 +2533,18 @@ vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain, { tree mask_vec = NULL; + if (!can_vec_perm_p (mode, false, mask)) + { + if (vect_print_dump_info (REPORT_DETAILS)) + { + fprintf (vect_dump, "unsupported vect permute { "); + for (i = 0; i < nunits; ++i) + fprintf (vect_dump, "%d ", mask[i]); + fprintf (vect_dump, "}\n"); + } + return false; + } + while (--index >= 0) { tree t = build_int_cst (mask_element_type, mask[index]); @@ -2537,17 +2553,6 @@ vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain, mask_vec = build_vector (mask_type, mask_vec); index = 0; - if (!can_vec_perm_expr_p (vectype, mask_vec)) - { - if (vect_print_dump_info (REPORT_DETAILS)) - { - fprintf (vect_dump, "unsupported vect permute "); - print_generic_expr (vect_dump, mask_vec, 0); - } - free (mask); - return false; - } - if (!analyze_only) { if (need_next_vector) @@ -2569,7 +2574,6 @@ vect_transform_slp_perm_load (gimple stmt, VEC (tree, heap) *dr_chain, } } - free (mask); return true; } |