aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-01-20 09:44:35 +0100
committerMartin Liska <marxin@gcc.gnu.org>2017-01-20 08:44:35 +0000
commit2d8d3ae29381d13789fa5fa349ec5c302b921aac (patch)
tree79ae1578993b051576a1c049cc48e85c5e63a05d /gcc
parenta809d56440d84fd363aa542a37d69275fd2930c5 (diff)
downloadgcc-2d8d3ae29381d13789fa5fa349ec5c302b921aac.zip
gcc-2d8d3ae29381d13789fa5fa349ec5c302b921aac.tar.gz
gcc-2d8d3ae29381d13789fa5fa349ec5c302b921aac.tar.bz2
Fix IPA CP where it forgot to add a reference in cgraph (PR ipa/71190).
2017-01-20 Martin Liska <mliska@suse.cz> PR ipa/71190 * cgraph.h (maybe_create_reference): Remove argument and update comment. * cgraphclones.c (cgraph_node::create_virtual_clone): Remove one argument. * ipa-cp.c (create_specialized_node): Likewise. * symtab.c (symtab_node::maybe_create_reference): Handle VAR_DECLs and ADDR_EXPRs and select ipa_ref_use type. From-SVN: r244687
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cgraph.h6
-rw-r--r--gcc/cgraphclones.c2
-rw-r--r--gcc/ipa-cp.c2
-rw-r--r--gcc/symtab.c25
5 files changed, 31 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d38e2a5..9ff10e0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2017-01-20 Martin Liska <mliska@suse.cz>
+ PR ipa/71190
+ * cgraph.h (maybe_create_reference): Remove argument and
+ update comment.
+ * cgraphclones.c (cgraph_node::create_virtual_clone): Remove one
+ argument.
+ * ipa-cp.c (create_specialized_node): Likewise.
+ * symtab.c (symtab_node::maybe_create_reference): Handle
+ VAR_DECLs and ADDR_EXPRs and select ipa_ref_use type.
+
+2017-01-20 Martin Liska <mliska@suse.cz>
+
* read-rtl-function.c (function_reader::create_function): Use
build_decl instread of build_decl_stat.
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index db2915c..5410a71 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -131,11 +131,9 @@ public:
enum ipa_ref_use use_type, gimple *stmt);
/* If VAL is a reference to a function or a variable, add a reference from
- this symtab_node to the corresponding symbol table node. USE_TYPE specify
- type of the use and STMT the statement (if it exists). Return the new
+ this symtab_node to the corresponding symbol table node. Return the new
reference or NULL if none was created. */
- ipa_ref *maybe_create_reference (tree val, enum ipa_ref_use use_type,
- gimple *stmt);
+ ipa_ref *maybe_create_reference (tree val, gimple *stmt);
/* Clone all references from symtab NODE to this symtab_node. */
void clone_references (symtab_node *node);
diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c
index a176635..c2337e8 100644
--- a/gcc/cgraphclones.c
+++ b/gcc/cgraphclones.c
@@ -624,7 +624,7 @@ 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);
+ new_node->maybe_create_reference (map->new_tree, 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 9cc9037..aa3c997 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -3786,7 +3786,7 @@ 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);
+ new_node->maybe_create_reference (av->value, NULL);
if (dump_file && (dump_flags & TDF_DETAILS))
{
diff --git a/gcc/symtab.c b/gcc/symtab.c
index ba395cd..87febdc 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -588,18 +588,25 @@ symtab_node::create_reference (symtab_node *referred_node,
return ref;
}
-/* If VAL is a reference to a function or a variable, add a reference from
- this symtab_node to the corresponding symbol table node. USE_TYPE specify
- type of the use and STMT the statement (if it exists). Return the new
- reference or NULL if none was created. */
-
ipa_ref *
-symtab_node::maybe_create_reference (tree val, enum ipa_ref_use use_type,
- gimple *stmt)
+symtab_node::maybe_create_reference (tree val, gimple *stmt)
{
STRIP_NOPS (val);
- if (TREE_CODE (val) != ADDR_EXPR)
- return NULL;
+ ipa_ref_use use_type;
+
+ switch (TREE_CODE (val))
+ {
+ case VAR_DECL:
+ use_type = IPA_REF_LOAD;
+ break;
+ case ADDR_EXPR:
+ use_type = IPA_REF_ADDR;
+ break;
+ default:
+ gcc_assert (!handled_component_p (val));
+ return NULL;
+ }
+
val = get_base_var (val);
if (val && VAR_OR_FUNCTION_DECL_P (val))
{