re PR ipa/61602 (ICE in lto1 on x86_64-linux-gnu in ipa_single_use, at ipa.c:1257)
authorJan Hubicka <hubicka@ucw.cz>
Mon, 15 Dec 2014 06:19:51 +0000 (07:19 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 15 Dec 2014 06:19:51 +0000 (06:19 +0000)
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

gcc/cgraph.h
gcc/ipa-reference.c
gcc/ipa.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr61602.c [new file with mode: 0644]

index a2fc563..fbb9922 100644 (file)
@@ -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);
index b046f9e..714a0ee 100644 (file)
@@ -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. */
index ec19d5d..d7ec497 100644 (file)
--- 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.  */
index 9592747..1b51abe 100644 (file)
@@ -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 (file)
index 0000000..51a6755
--- /dev/null
@@ -0,0 +1,8 @@
+int a;
+int *b = &a, **c = &b;
+int
+main ()
+{
+  int **d = &b;
+  *d = 0;
+}