diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-11-29 14:47:39 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-11-29 14:47:39 +0000 |
commit | 0c3ea6b3424ee4d32d97ca5d7453891b587b3132 (patch) | |
tree | e0eaba8039e6126c11bac9e41ddc147af9c5a974 /gcc/tree-vectorizer.h | |
parent | 1c5d68a677b076262c5508e6d4fbdb765cba2d2f (diff) |
Record the vector mask precision in stmt_vec_info
search_type_for_mask uses a worklist to search a chain of boolean
operations for a natural vector mask type. This patch instead does
that in vect_determine_stmt_precisions, where we also look for
overpromoted integer operations. We then only need to compute
the precision once and can cache it in the stmt_vec_info.
The new function vect_determine_mask_precision is supposed
to handle exactly the same cases as search_type_for_mask_1,
and in the same way. There's a lot we could improve here,
but that's not stage 3 material.
I wondered about sharing mask_precision with other fields like
operation_precision, but in the end that seemed too dangerous.
We have patterns to convert between boolean and non-boolean
operations and it would be very easy to get mixed up about
which case the fields are describing.
2019-11-29 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vectorizer.h (stmt_vec_info::mask_precision): New field.
(vect_use_mask_type_p): New function.
* tree-vect-patterns.c (vect_init_pattern_stmt): Copy the
mask precision to the pattern statement.
(append_pattern_def_seq): Add a scalar_type_for_mask parameter
and use it to initialize the new stmt's mask precision.
(search_type_for_mask_1): Delete.
(search_type_for_mask): Replace with...
(integer_type_for_mask): ...this new function. Use the information
cached in the stmt_vec_info.
(vect_recog_bool_pattern): Update accordingly.
(build_mask_conversion): Pass the scalar type associated with the
mask type to append_pattern_def_seq.
(vect_recog_mask_conversion_pattern): Likewise. Call
integer_type_for_mask instead of search_type_for_mask.
(vect_convert_mask_for_vectype): Call integer_type_for_mask instead
of search_type_for_mask.
(possible_vector_mask_operation_p): New function.
(vect_determine_mask_precision): Likewise.
(vect_determine_stmt_precisions): Call it.
From-SVN: r278850
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r-- | gcc/tree-vectorizer.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index ad73519afaa..51a13f1d207 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1089,6 +1089,23 @@ public: unsigned int operation_precision; signop operation_sign; + /* If the statement produces a boolean result, this value describes + how we should choose the associated vector type. The possible + values are: + + - an integer precision N if we should use the vector mask type + associated with N-bit integers. This is only used if all relevant + input booleans also want the vector mask type for N-bit integers, + or if we can convert them into that form by pattern-matching. + + - ~0U if we considered choosing a vector mask type but decided + to treat the boolean as a normal integer type instead. + + - 0 otherwise. This means either that the operation isn't one that + could have a vector mask type (and so should have a normal vector + type instead) or that we simply haven't made a choice either way. */ + unsigned int mask_precision; + /* True if this is only suitable for SLP vectorization. */ bool slp_vect_only_p; }; @@ -1245,6 +1262,15 @@ nested_in_vect_loop_p (class loop *loop, stmt_vec_info stmt_info) && (loop->inner == (gimple_bb (stmt_info->stmt))->loop_father)); } +/* Return true if STMT_INFO should produce a vector mask type rather than + a normal nonmask type. */ + +static inline bool +vect_use_mask_type_p (stmt_vec_info stmt_info) +{ + return stmt_info->mask_precision && stmt_info->mask_precision != ~0U; +} + /* Return TRUE if a statement represented by STMT_INFO is a part of a pattern. */ |