Hi! On Fri, 30 Sep 2016 09:47:56 +0200, Richard Biener <richard.guent...@gmail.com> wrote: > On Thu, Sep 29, 2016 at 4:48 PM, Thomas Schwinge > <tho...@codesourcery.com> wrote: > > On Mon, 19 Sep 2016 13:25:01 +0200, Richard Biener > > <richard.guent...@gmail.com> wrote: > >> On Mon, Sep 19, 2016 at 1:19 PM, Thomas Schwinge > >> <tho...@codesourcery.com> wrote: > >> > On Mon, 19 Sep 2016 10:18:35 +0200, Richard Biener > >> > <richard.guent...@gmail.com> wrote: > >> >> On Fri, Sep 16, 2016 at 3:32 PM, Thomas Schwinge > >> >> <tho...@codesourcery.com> wrote: > >> >> > --- gcc/tree-streamer.c > >> >> > +++ gcc/tree-streamer.c > >> >> > @@ -278,9 +278,23 @@ record_common_node (struct streamer_tree_cache_d > >> >> > *cache, tree node) > >> >> > streamer_tree_cache_append (cache, node, cache->nodes.length ()); > >> >> > > >> >> > if (POINTER_TYPE_P (node) > >> >> > - || TREE_CODE (node) == COMPLEX_TYPE > >> >> > || TREE_CODE (node) == ARRAY_TYPE) > >> >> > record_common_node (cache, TREE_TYPE (node)); > >> >> > + else if (TREE_CODE (node) == COMPLEX_TYPE) > >> >> > [...] > >> >> > else if (TREE_CODE (node) == RECORD_TYPE) > > > >> [looks to me we miss handling of vector type components alltogether, > >> maybe there are no global vector type trees ...] > > > > Looks like it, yes. Would a patch like the following be reasonable, > > which explicitly lists/handles all expected tree codes, or is something > > like that not feasible? (That's a subset of tree codes I gathered by a > > partial run of the GCC testsuite, and libgomp testsuite; not claiming > > this is complete.) > > I think it would be a nice thing to have indeed. > > So -- I'm inclined to approve this patch ;)
After quite a bit of testing (contrib/config-list.mk, modified to run -fself-test with -flto, to exercise the code I'm modifying), I have now committed this to trunk in r241246: commit 29cfc397b0ec2c953ff929d0ba57001c7018ec0c Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Mon Oct 17 15:56:22 2016 +0000 Explicitly list all tree codes in gcc/tree-streamer.c:record_common_node gcc/ * tree-streamer.c (record_common_node): Explicitly list expected tree codes. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@241246 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/tree-streamer.c | 30 +++++++++++++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git gcc/ChangeLog gcc/ChangeLog index 86df616..9acc738 100644 --- gcc/ChangeLog +++ gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-10-17 Thomas Schwinge <tho...@codesourcery.com> + + * tree-streamer.c (record_common_node): Explicitly list expected + tree codes. + 2016-10-17 Richard Biener <rguent...@suse.de> PR tree-optimization/77988 diff --git gcc/tree-streamer.c gcc/tree-streamer.c index 7ea7096..2139e96 100644 --- gcc/tree-streamer.c +++ gcc/tree-streamer.c @@ -277,12 +277,28 @@ record_common_node (struct streamer_tree_cache_d *cache, tree node) in the cache as hash value. */ streamer_tree_cache_append (cache, node, cache->nodes.length ()); - if (POINTER_TYPE_P (node) - || TREE_CODE (node) == COMPLEX_TYPE - || TREE_CODE (node) == ARRAY_TYPE) - record_common_node (cache, TREE_TYPE (node)); - else if (TREE_CODE (node) == RECORD_TYPE) + switch (TREE_CODE (node)) { + case ERROR_MARK: + case FIELD_DECL: + case FIXED_POINT_TYPE: + case IDENTIFIER_NODE: + case INTEGER_CST: + case INTEGER_TYPE: + case POINTER_BOUNDS_TYPE: + case REAL_TYPE: + case TREE_LIST: + case VOID_CST: + case VOID_TYPE: + /* No recursive trees. */ + break; + case ARRAY_TYPE: + case COMPLEX_TYPE: + case POINTER_TYPE: + case REFERENCE_TYPE: + record_common_node (cache, TREE_TYPE (node)); + break; + case RECORD_TYPE: /* The FIELD_DECLs of structures should be shared, so that every COMPONENT_REF uses the same tree node when referencing a field. Pointer equality between FIELD_DECLs is used by the alias @@ -291,6 +307,10 @@ record_common_node (struct streamer_tree_cache_d *cache, tree node) nonoverlapping_component_refs_of_decl_p). */ for (tree f = TYPE_FIELDS (node); f; f = TREE_CHAIN (f)) record_common_node (cache, f); + break; + default: + /* Unexpected tree code. */ + gcc_unreachable (); } } Grüße Thomas