This patch makes some pieces of code operate directly on the new CONST_VECTOR encoding. Sorry for the late posting, I'd forgotten to include the patch when sending the original series.
Tested as before. Thanks, Richard 2018-01-02 Richard Sandiford <richard.sandif...@linaro.org> gcc/ * cse.c (hash_rtx_cb): Hash only the encoded elements. * cselib.c (cselib_hash_rtx): Likewise. * expmed.c (make_tree): Build VECTOR_CSTs directly from the CONST_VECTOR encoding. Index: gcc/cse.c =================================================================== --- gcc/cse.c 2017-12-22 16:54:09.325037396 +0000 +++ gcc/cse.c 2018-01-02 15:23:39.278076397 +0000 @@ -2353,11 +2353,11 @@ hash_rtx_cb (const_rtx x, machine_mode m int units; rtx elt; - units = CONST_VECTOR_NUNITS (x); + units = const_vector_encoded_nelts (x); for (i = 0; i < units; ++i) { - elt = CONST_VECTOR_ELT (x, i); + elt = CONST_VECTOR_ENCODED_ELT (x, i); hash += hash_rtx_cb (elt, GET_MODE (elt), do_not_record_p, hash_arg_in_memory_p, have_reg_qty, cb); Index: gcc/cselib.c =================================================================== --- gcc/cselib.c 2017-12-28 17:10:07.075025248 +0000 +++ gcc/cselib.c 2018-01-02 15:23:39.279076354 +0000 @@ -1163,11 +1163,11 @@ cselib_hash_rtx (rtx x, int create, mach int units; rtx elt; - units = CONST_VECTOR_NUNITS (x); + units = const_vector_encoded_nelts (x); for (i = 0; i < units; ++i) { - elt = CONST_VECTOR_ELT (x, i); + elt = CONST_VECTOR_ENCODED_ELT (x, i); hash += cselib_hash_rtx (elt, 0, memmode); } Index: gcc/expmed.c =================================================================== --- gcc/expmed.c 2018-01-02 15:12:14.964299450 +0000 +++ gcc/expmed.c 2018-01-02 15:23:39.279076354 +0000 @@ -5273,13 +5273,14 @@ make_tree (tree type, rtx x) case CONST_VECTOR: { - int units = CONST_VECTOR_NUNITS (x); + unsigned int npatterns = CONST_VECTOR_NPATTERNS (x); + unsigned int nelts_per_pattern = CONST_VECTOR_NELTS_PER_PATTERN (x); tree itype = TREE_TYPE (type); - int i; /* Build a tree with vector elements. */ - tree_vector_builder elts (type, units, 1); - for (i = 0; i < units; ++i) + tree_vector_builder elts (type, npatterns, nelts_per_pattern); + unsigned int count = elts.encoded_nelts (); + for (unsigned int i = 0; i < count; ++i) { rtx elt = CONST_VECTOR_ELT (x, i); elts.quick_push (make_tree (itype, elt));