New VECTOR_CST layout

Programming / Compilers / GCC - rsandifo [138bc75d-0d04-0410-961f-82ee72b054a4] - 7 December 2017 18:40 EST

This patch uses a simple compression scheme to represent the contents of a VECTOR_CST using its leading elements. There are three formats:

1) a repeating sequence of N values. This is encoded using the first N elements.

2) a "foreground" sequence of N values inserted at the beginning of a "background" repeating sequence of N values, such as: { 1, 2, 0, 0, 0, 0, ... }. This is encoded using the first 2*N elements.

2) a "foreground" sequence of N values inserted at the beginning of a "background" repeating sequence of N interleaved linear series, such as: { 0, 0, 8, 10, 9, 11, 10, 12, ... }. This is encoded using the first 3*N elements. In practice the foreground values are often part of the same series as the background values, such as: { 1, 11, 2, 12, 3, 13, ... }.

This reduces the amount of work involved in processing simple
vector constants and means that the encoding extends naturally to variable-length vectors.

2017-12-07 Richard Sandiford

gcc/
- doc/generic.texi (VECTOR_CST): Describe new representation of
vector constants.
- vector-builder.h: New file.
- tree-vector-builder.h: Likewise.
- tree-vector-builder.c: Likewise.
- Makefile.in (OBJS): Add tree-vector-builder.o.
- tree.def (VECTOR_CST): Update comment to refer to generic.texi.
- tree-core.h (tree_base): Add a vector_cst field to the u union. (tree_vector): Change the number of elements to
vector_cst_encoded_nelts.
- tree.h (VECTOR_CST_NELTS): Redefine using TYPE_VECTOR_SUBPARTS. (VECTOR_CST_ELTS): Delete. (VECTOR_CST_ELT): Redefine using vector_cst_elt. (VECTOR_CST_LOG2_NPATTERNS, VECTOR_CST_NPATTERNS): New macros. (VECTOR_CST_NELTS_PER_PATTERN, VECTOR_CST_DUPLICATE_P): Likewise. (VECTOR_CST_STEPPED_P, VECTOR_CST_ENCODED_ELTS): Likewise. (VECTOR_CST_ENCODED_ELT): Likewise. (vector_cst_encoded_nelts): New function. (make_vector): Take the values of VECTOR_CST_LOG2_NPATTERNS and
VECTOR_CST_NELTS_PER_PATTERN as arguments. (vector_cst_int_elt, vector_cst_elt): Declare.
- tree.c: Include tree-vector-builder.h. (tree_code_size): Abort if passed VECTOR_CST. (tree_size): Update for . (make_vector): Take the values of VECTOR_CST_LOG2_NPATTERNS and
VECTOR_CST_NELTS_PER_PATTERN as arguments. (build_vector): Use tree_vector_builder. (vector_cst_int_elt, vector_cst_elt): New functions. (drop_tree_overflow): For VECTOR_CST, drop the TREE_OVERFLOW from the encoded elements and then create the vector in the canonical form. (check_vector_cst, check_vector_cst_duplicate, check_vector_cst_fill) (check_vector_cst_stepped, test_vector_cst_patterns): New functions. (tree_c_tests): Call test_vector_cst_patterns.
- lto-streamer-out.c (DFS::DFS_write_tree_body): Handle the new
VECTOR_CST fields. (hash_tree): Likewise.
- tree-streamer-out.c (write_ts_vector_tree_pointers): Likewise. (streamer_write_tree_header): Likewise.
- tree-streamer-in.c (lto_input_ts_vector_tree_pointers): Likewise. (streamer_alloc_tree): Likewise. Update call to make_vector.
- fold-const.c (fold_ternary_loc): Avoid using VECTOR_CST_ELTS.

gcc/lto/
- lto.c (compare_tree_sccs_1): Compare the new VECTOR_CST flags.

998afe5de3f New VECTOR_CST layout
gcc/ChangeLog | 44 ++++++
gcc/Makefile.in | 1 +
gcc/doc/generic.texi | 75 ++++++++-
gcc/fold-const.c | 5 +-
gcc/lto-streamer-out.c | 12 +-
gcc/lto/ChangeLog | 4 +
gcc/lto/lto.c | 13 +-
gcc/tree-core.h | 15 +-
gcc/tree-streamer-in.c | 12 +-
gcc/tree-streamer-out.c | 13 +-
gcc/tree-vector-builder.c | 64 ++++++++
gcc/tree-vector-builder.h | 135 ++++++++++++++++
gcc/tree.c | 261 +++++++++++++++++++++++++-----
gcc/tree.def | 2 +-
gcc/tree.h | 35 +++-
gcc/vector-builder.h | 394 ++++++++++++++++++++++++++++++++++++++++++++++
16 files changed, 1015 insertions(+), 70 deletions(-)

Upstream: gcc.gnu.org


  • Share