Message ID | 6421e992-7681-1456-2a73-ba79fd8b00c1@suse.cz |
---|---|
State | Superseded |
Headers | show |
Hi! Just a nit, defer actual review to Honza or Richard. On Mon, Dec 19, 2016 at 11:09:52AM +0100, Martin Liška wrote: > + ipa_ref_use use_type > + = TREE_CODE (map->new_tree) == VAR_DECL ? IPA_REF_ADDR : IPA_REF_LOAD; = VAR_P (map->new_tree) ? IPA_REF_ADDR : IPA_REF_LOAD. please. Jakub
Hi, On Mon, Dec 19, 2016 at 11:09:52AM +0100, Martin Liska wrote: > Hello. > > Building mariadb with -flto exposes a bug which I also used to see > in Firefox. It's caused by IPA CP starting from r236418, where the > pass started to propagate const VAR_DECLs. Problem is that the pass > does not update call graph by adding IPA_REF_READ of the propagated > variable. > > Patch can bootstrap on ppc64le-redhat-linux and survives regression tests. > > Ready to be installed? Honza needs to have a look at this but since I have suggested this approach, I am of course fine with it, except that... > Martin > From 477e81fde08d0520ce552ec8baa0349590dc683c Mon Sep 17 00:00:00 2001 > From: marxin <mliska@suse.cz> > Date: Mon, 19 Dec 2016 11:03:34 +0100 > Subject: [PATCH] Fix IPA CP where it forgot to add a reference in cgraph > > gcc/ChangeLog: > > 2016-12-19 Martin Liska <mliska@suse.cz> > > * cgraphclones.c (cgraph_node::create_virtual_clone): > Create either IPA_REF_LOAD of IPA_REF_READ depending on > whether new_tree is a VAR_DECL or an ADDR_EXPR. > * ipa-cp.c (create_specialized_node): Add reference just for > ADDR_EXPRs. > * symtab.c (symtab_node::maybe_create_reference): Remove guard > as it's guarded in callers. > --- > gcc/cgraphclones.c | 6 +++++- > gcc/ipa-cp.c | 3 ++- > gcc/symtab.c | 2 -- > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c > index 349892dab67..93c86e6a1cc 100644 > --- a/gcc/cgraphclones.c > +++ b/gcc/cgraphclones.c > @@ -624,7 +624,11 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers, > || in_lto_p) > new_node->unique_name = true; > FOR_EACH_VEC_SAFE_ELT (tree_map, i, map) > - new_node->maybe_create_reference (map->new_tree, IPA_REF_ADDR, NULL); > + { > + ipa_ref_use use_type > + = TREE_CODE (map->new_tree) == VAR_DECL ? IPA_REF_ADDR : IPA_REF_LOAD; ...this test should be for ADDR_EXPR here. Or you could switch the IPA_REF_* constants the other way round which I bet is going to have the same effect in practice, but personally, I'd test for ADDR_EXPR. Thanks, Martin
From 477e81fde08d0520ce552ec8baa0349590dc683c Mon Sep 17 00:00:00 2001 From: marxin <mliska@suse.cz> Date: Mon, 19 Dec 2016 11:03:34 +0100 Subject: [PATCH] Fix IPA CP where it forgot to add a reference in cgraph gcc/ChangeLog: 2016-12-19 Martin Liska <mliska@suse.cz> * cgraphclones.c (cgraph_node::create_virtual_clone): Create either IPA_REF_LOAD of IPA_REF_READ depending on whether new_tree is a VAR_DECL or an ADDR_EXPR. * ipa-cp.c (create_specialized_node): Add reference just for ADDR_EXPRs. * symtab.c (symtab_node::maybe_create_reference): Remove guard as it's guarded in callers. --- gcc/cgraphclones.c | 6 +++++- gcc/ipa-cp.c | 3 ++- gcc/symtab.c | 2 -- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 349892dab67..93c86e6a1cc 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -624,7 +624,11 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers, || in_lto_p) new_node->unique_name = true; FOR_EACH_VEC_SAFE_ELT (tree_map, i, map) - new_node->maybe_create_reference (map->new_tree, IPA_REF_ADDR, NULL); + { + ipa_ref_use use_type + = TREE_CODE (map->new_tree) == VAR_DECL ? IPA_REF_ADDR : IPA_REF_LOAD; + new_node->maybe_create_reference (map->new_tree, use_type, NULL); + } if (ipa_transforms_to_apply.exists ()) new_node->ipa_transforms_to_apply diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index d3b50524457..fd312b56fde 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -3787,7 +3787,8 @@ create_specialized_node (struct cgraph_node *node, args_to_skip, "constprop"); ipa_set_node_agg_value_chain (new_node, aggvals); for (av = aggvals; av; av = av->next) - new_node->maybe_create_reference (av->value, IPA_REF_ADDR, NULL); + if (TREE_CODE (av->value) == ADDR_EXPR) + new_node->maybe_create_reference (av->value, IPA_REF_ADDR, NULL); if (dump_file && (dump_flags & TDF_DETAILS)) { diff --git a/gcc/symtab.c b/gcc/symtab.c index 73168a8db09..562a4a2f6a6 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -598,8 +598,6 @@ symtab_node::maybe_create_reference (tree val, enum ipa_ref_use use_type, gimple *stmt) { STRIP_NOPS (val); - if (TREE_CODE (val) != ADDR_EXPR) - return NULL; val = get_base_var (val); if (val && VAR_OR_FUNCTION_DECL_P (val)) { -- 2.11.0