aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-12-15 07:19:51 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-12-15 06:19:51 +0000
commitdea91a66ff51bb0f37db48baebc7e098947713e9 (patch)
tree7d0f222bbf1aafe6ff3d8426db8aafe30396b616 /gcc
parentf1ced6f5e7e78a6818c4820c4a5f103b74112f93 (diff)
downloadgcc-dea91a66ff51bb0f37db48baebc7e098947713e9.zip
gcc-dea91a66ff51bb0f37db48baebc7e098947713e9.tar.gz
gcc-dea91a66ff51bb0f37db48baebc7e098947713e9.tar.bz2
re PR ipa/61602 (ICE in lto1 on x86_64-linux-gnu in ipa_single_use, at ipa.c:1257)
PR ipa/61602 * gcc.dg/torture/pr61602.c: New testcase. * cgraph.h (ipa_discover_readonly_nonaddressable_vars): Return bool. * ipa.c (set_writeonly_bit): Track if reference was removed. (ipa_discover_readonly_nonaddressable_vars): Return true if any references was removed. * ipa-reference.c (propagate): Return TODO_remove_functions if reference was removed. From-SVN: r218731
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cgraph.h2
-rw-r--r--gcc/ipa-reference.c5
-rw-r--r--gcc/ipa.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr61602.c8
5 files changed, 34 insertions, 9 deletions
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index a2fc563..fbb9922 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -2188,7 +2188,7 @@ void record_references_in_initializer (tree, bool);
/* In ipa.c */
void cgraph_build_static_cdtor (char which, tree body, int priority);
-void ipa_discover_readonly_nonaddressable_vars (void);
+bool ipa_discover_readonly_nonaddressable_vars (void);
/* In varpool.c */
tree ctor_for_folding (tree);
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index b046f9e..714a0ee 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -676,11 +676,12 @@ propagate (void)
XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
int order_pos;
int i;
+ bool remove_p;
if (dump_file)
cgraph_node::dump_cgraph (dump_file);
- ipa_discover_readonly_nonaddressable_vars ();
+ remove_p = ipa_discover_readonly_nonaddressable_vars ();
generate_summary ();
/* Propagate the local information through the call graph to produce
@@ -867,7 +868,7 @@ propagate (void)
if (dump_file)
splay_tree_delete (reference_vars_to_consider);
reference_vars_to_consider = NULL;
- return 0;
+ return remove_p ? TODO_remove_functions : 0;
}
/* Return true if we need to write summary of NODE. */
diff --git a/gcc/ipa.c b/gcc/ipa.c
index ec19d5d..d7ec497 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -714,14 +714,18 @@ set_readonly_bit (varpool_node *vnode, void *data ATTRIBUTE_UNUSED)
/* Set writeonly bit and clear the initalizer, since it will not be needed. */
bool
-set_writeonly_bit (varpool_node *vnode, void *data ATTRIBUTE_UNUSED)
+set_writeonly_bit (varpool_node *vnode, void *data)
{
vnode->writeonly = true;
if (optimize)
{
DECL_INITIAL (vnode->decl) = NULL;
if (!vnode->alias)
- vnode->remove_all_references ();
+ {
+ if (vnode->num_references ())
+ *(bool *)data = true;
+ vnode->remove_all_references ();
+ }
}
return false;
}
@@ -739,15 +743,18 @@ clear_addressable_bit (varpool_node *vnode, void *data ATTRIBUTE_UNUSED)
/* Discover variables that have no longer address taken or that are read only
and update their flags.
+ Return true when unreachable symbol removan should be done.
+
FIXME: This can not be done in between gimplify and omp_expand since
readonly flag plays role on what is shared and what is not. Currently we do
this transformation as part of whole program visibility and re-do at
ipa-reference pass (to take into account clonning), but it would
make sense to do it before early optimizations. */
-void
+bool
ipa_discover_readonly_nonaddressable_vars (void)
{
+ bool remove_p = false;
varpool_node *vnode;
if (dump_file)
fprintf (dump_file, "Clearing variable flags:");
@@ -762,14 +769,16 @@ ipa_discover_readonly_nonaddressable_vars (void)
bool read = false;
bool explicit_refs = true;
- process_references (vnode, &written, &address_taken, &read, &explicit_refs);
+ process_references (vnode, &written, &address_taken, &read,
+ &explicit_refs);
if (!explicit_refs)
continue;
if (!address_taken)
{
if (TREE_ADDRESSABLE (vnode->decl) && dump_file)
fprintf (dump_file, " %s (non-addressable)", vnode->name ());
- vnode->call_for_node_and_aliases (clear_addressable_bit, NULL, true);
+ vnode->call_for_node_and_aliases (clear_addressable_bit, NULL,
+ true);
}
if (!address_taken && !written
/* Making variable in explicit section readonly can cause section
@@ -785,11 +794,13 @@ ipa_discover_readonly_nonaddressable_vars (void)
{
if (dump_file)
fprintf (dump_file, " %s (write-only)", vnode->name ());
- vnode->call_for_node_and_aliases (set_writeonly_bit, NULL, true);
+ vnode->call_for_node_and_aliases (set_writeonly_bit, &remove_p,
+ true);
}
}
if (dump_file)
fprintf (dump_file, "\n");
+ return remove_p;
}
/* Free inline summary. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9592747..1b51abe 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-14 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/61602
+ * gcc.dg/torture/pr61602.c: New testcase.
+
2014-12-14 Jan Hubicka <hubicka@ucw.cz>
PR ipa/61558
diff --git a/gcc/testsuite/gcc.dg/torture/pr61602.c b/gcc/testsuite/gcc.dg/torture/pr61602.c
new file mode 100644
index 0000000..51a6755
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr61602.c
@@ -0,0 +1,8 @@
+int a;
+int *b = &a, **c = &b;
+int
+main ()
+{
+ int **d = &b;
+ *d = 0;
+}