[PATCH] Fix IPA CP where it forgot to add a reference in cgraph
Jan Hubicka
hubicka@ucw.cz
Wed Jan 18 22:32:00 GMT 2017
>
> 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..6c8fe156f23 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) == ADDR_EXPR ? 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;
Perhaps maybe_create_reference should drop the use_type argument (it is used
with IPA_REF_ADDR only anyway) and should do the parsing itself?
I.e. if there is reference do IPA_REF_LOAD and if there is ADDR_EXPR do
IPA_REF_ADDR. Why one can not have handled component refs in there?
Honza
> val = get_base_var (val);
> if (val && VAR_OR_FUNCTION_DECL_P (val))
> {
> --
> 2.11.0
>
More information about the Gcc-patches
mailing list