The attached patch reverts commit r235318.  It caused an ICE in 
binds_to_current_def_p building java.
Although java is now gone, the change broke bootstrap and the handling of 
_GLOBAL constructors on
32-bit hpux targets.

See PR 70795:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70795

In as much as there has been no comment regarding the PR, I believe the change 
should be reverted.
It doesn't look as if the change was reviewed.

Okay for trunk?  The hppa2.0w-hp-hpux11.11 and hppa64-hp-hpux11.11 targets 
build successfully with
change reverted.

Dave
--
John David Anglin       dave.ang...@bell.net


2016-10-08  John David Anglin  <dang...@gcc.gnu.org>

        PR ipa/70018
        * cgraph.c: Revert commit r235318.
        * cgraph.h: Likewise.
        * ipa-pure-const.c: Likewise.

Index: cgraph.c
===================================================================
--- cgraph.c    (revision 240816)
+++ cgraph.c    (working copy)
@@ -2383,65 +2383,27 @@
 
 /* Worker to set nothrow flag.  */
 
-static void
-set_nothrow_flag_1 (cgraph_node *node, bool nothrow, bool non_call,
-                   bool *changed)
+static bool
+cgraph_set_nothrow_flag_1 (cgraph_node *node, void *data)
 {
   cgraph_edge *e;
 
-  if (nothrow && !TREE_NOTHROW (node->decl))
-    {
-      /* With non-call exceptions we can't say for sure if other function body
-        was not possibly optimized to stil throw.  */
-      if (!non_call || node->binds_to_current_def_p ())
-       {
-         TREE_NOTHROW (node->decl) = true;
-         *changed = true;
-         for (e = node->callers; e; e = e->next_caller)
-           e->can_throw_external = false;
-       }
-    }
-  else if (!nothrow && TREE_NOTHROW (node->decl))
-    {
-      TREE_NOTHROW (node->decl) = false;
-      *changed = true;
-    }
-  ipa_ref *ref;
-  FOR_EACH_ALIAS (node, ref)
-    {
-      cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
-      if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
-       set_nothrow_flag_1 (alias, nothrow, non_call, changed);
-    }
-  for (cgraph_edge *e = node->callers; e; e = e->next_caller)
-    if (e->caller->thunk.thunk_p
-       && (!nothrow || e->caller->get_availability () > AVAIL_INTERPOSABLE))
-      set_nothrow_flag_1 (e->caller, nothrow, non_call, changed);
+  TREE_NOTHROW (node->decl) = data != NULL;
+
+  if (data != NULL)
+    for (e = node->callers; e; e = e->next_caller)
+      e->can_throw_external = false;
+  return false;
 }
 
 /* Set TREE_NOTHROW on NODE's decl and on aliases of NODE
    if any to NOTHROW.  */
 
-bool
+void
 cgraph_node::set_nothrow_flag (bool nothrow)
 {
-  bool changed = false;
-  bool non_call = opt_for_fn (decl, flag_non_call_exceptions);
-
-  if (!nothrow || get_availability () > AVAIL_INTERPOSABLE)
-    set_nothrow_flag_1 (this, nothrow, non_call, &changed);
-  else
-    {
-      ipa_ref *ref;
-
-      FOR_EACH_ALIAS (this, ref)
-       {
-         cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
-         if (!nothrow || alias->get_availability () > AVAIL_INTERPOSABLE)
-           set_nothrow_flag_1 (alias, nothrow, non_call, &changed);
-       }
-    }
-  return changed;
+  call_for_symbol_thunks_and_aliases (cgraph_set_nothrow_flag_1,
+                                     (void *)(size_t)nothrow, nothrow == true);
 }
 
 /* Worker to set_const_flag.  */
@@ -2580,7 +2542,8 @@
 
 /* Info used by set_pure_flag_1.  */
 
-struct set_pure_flag_info
+struct
+set_pure_flag_info
 {
   bool pure;
   bool looping;
Index: cgraph.h
===================================================================
--- cgraph.h    (revision 240816)
+++ cgraph.h    (working copy)
@@ -1111,7 +1111,7 @@
 
   /* Set TREE_NOTHROW on cgraph_node's decl and on aliases of the node
      if any to NOTHROW.  */
-  bool set_nothrow_flag (bool nothrow);
+  void set_nothrow_flag (bool nothrow);
 
   /* If SET_CONST is true, mark function, aliases and thunks to be ECF_CONST.
     If SET_CONST if false, clear the flag.
Index: ipa-pure-const.c
===================================================================
--- ipa-pure-const.c    (revision 240816)
+++ ipa-pure-const.c    (working copy)
@@ -1167,10 +1167,7 @@
   enum availability avail;
   cgraph_node *n = e->callee->function_or_virtual_thunk_symbol (&avail,
                                                                e->caller);
-  if (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (n->decl))
-    return true;
-  return opt_for_fn (e->callee->decl, flag_non_call_exceptions)
-        && !e->callee->binds_to_current_def_p (e->caller);
+  return (avail <= AVAIL_INTERPOSABLE || TREE_NOTHROW (n->decl));
 }
 
 /* Return true if NODE is self recursive function.
@@ -1601,20 +1598,14 @@
                    continue;
 
                  struct cgraph_node *y = e->callee->
-                                  function_or_virtual_thunk_symbol (&avail,
-                                                                    e->caller);
+                                   function_or_virtual_thunk_symbol (&avail,
+                                                                     
e->caller);
 
                  /* We can use info about the callee only if we know it can
-                    not be interposed.
-                    When callee is compiled with non-call exceptions we also
-                    must check that the declaration is bound to current
-                    body as other semantically equivalent body may still
-                    throw.  */
+                    not be interposed.  */
                  if (avail <= AVAIL_INTERPOSABLE
                      || (!TREE_NOTHROW (y->decl)
-                         && (get_function_state (y)->can_throw
-                             || (opt_for_fn (y->decl, flag_non_call_exceptions)
-                                 && !e->callee->binds_to_current_def_p (w)))))
+                         && get_function_state (y)->can_throw))
                    can_throw = true;
                }
              for (ie = w->indirect_calls; ie && !can_throw;

Reply via email to