diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-12-15 07:19:51 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-12-15 06:19:51 +0000 |
commit | dea91a66ff51bb0f37db48baebc7e098947713e9 (patch) | |
tree | 7d0f222bbf1aafe6ff3d8426db8aafe30396b616 /gcc | |
parent | f1ced6f5e7e78a6818c4820c4a5f103b74112f93 (diff) | |
download | gcc-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.h | 2 | ||||
-rw-r--r-- | gcc/ipa-reference.c | 5 | ||||
-rw-r--r-- | gcc/ipa.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr61602.c | 8 |
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. */ @@ -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; +} |