Rework VEC_PERM_EXPR folding
commitf63c1cff2969b0030e227c6a8cf123aaad781349
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Jan 2018 18:27:15 +0000 (2 18:27 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 2 Jan 2018 18:27:15 +0000 (2 18:27 +0000)
tree1666d763225f1b16cafb34b101ec4e31817f8679
parentc3fa7fe9d8e274d28ef95d1ba519519fa102d90d
Rework VEC_PERM_EXPR folding

This patch reworks the VEC_PERM_EXPR folding so that more of it
works for variable-length vectors.  E.g. it means that we can
now recognise variable-length permutes that reduce to a single
vector, or cases in which a variable-length permute only needs
one input.  There should be no functional change for fixed-length
vectors.

2018-01-02  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* selftest.h (selftest::vec_perm_indices_c_tests): Declare.
* selftest-run-tests.c (selftest::run_tests): Call it.
* vector-builder.h (vector_builder::operator ==): New function.
(vector_builder::operator !=): Likewise.
* vec-perm-indices.h (vec_perm_indices::series_p): Declare.
(vec_perm_indices::all_from_input_p): New function.
* vec-perm-indices.c (vec_perm_indices::series_p): Likewise.
(test_vec_perm_12, selftest::vec_perm_indices_c_tests): Likewise.
* fold-const.c (fold_ternary_loc): Use tree_to_vec_perm_builder
instead of reading the VECTOR_CST directly.  Detect whether both
vector inputs are the same before constructing the vec_perm_indices,
and update the number of inputs argument accordingly.  Use the
utility functions added above.  Only construct sel2 if we need to.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@256098 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/fold-const.c
gcc/selftest-run-tests.c
gcc/selftest.h
gcc/vec-perm-indices.c
gcc/vec-perm-indices.h
gcc/vector-builder.h