diff options
author | Richard Biener <rguenther@suse.de> | 2021-02-08 09:52:56 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-02-08 13:05:44 +0100 |
commit | d4536e431316b4568e236afd7a6017e5efd1b0a1 (patch) | |
tree | d441b8a714952a95d33657cae42b7d11b7e01f56 /gcc/tree.c | |
parent | 0d701e3eb89870237669ef7bf41394d90c35ae70 (diff) | |
download | gcc-d4536e431316b4568e236afd7a6017e5efd1b0a1.zip gcc-d4536e431316b4568e236afd7a6017e5efd1b0a1.tar.gz gcc-d4536e431316b4568e236afd7a6017e5efd1b0a1.tar.bz2 |
lto/96591 - walk VECTOR_CST elements in walk_tree
This implements walking of VECTOR_CST elements in walk_tree, mimicing
the walk of COMPLEX_CST elements. Without this free-lang-data fails
to see some types in case they are only refered to via tree constants
used only as VECTOR_CST elements.
2021-02-08 Richard Biener <rguenther@suse.de>
PR lto/96591
* tree.c (walk_tree_1): Walk VECTOR_CST elements.
* g++.dg/lto/pr96591_0.C: New testcase.
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -12131,7 +12131,6 @@ walk_tree_1 (tree *tp, walk_tree_fn func, void *data, case INTEGER_CST: case REAL_CST: case FIXED_CST: - case VECTOR_CST: case STRING_CST: case BLOCK: case PLACEHOLDER_EXPR: @@ -12162,6 +12161,18 @@ walk_tree_1 (tree *tp, walk_tree_fn func, void *data, WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0)); } + case VECTOR_CST: + { + unsigned len = vector_cst_encoded_nelts (*tp); + if (len == 0) + break; + /* Walk all elements but the first. */ + while (--len) + WALK_SUBTREE (VECTOR_CST_ENCODED_ELT (*tp, len)); + /* Now walk the first one as a tail call. */ + WALK_SUBTREE_TAIL (VECTOR_CST_ENCODED_ELT (*tp, 0)); + } + case COMPLEX_CST: WALK_SUBTREE (TREE_REALPART (*tp)); WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp)); |