OSDN Git Service

PR tree-optimization/17697
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Sep 2004 18:16:34 +0000 (18:16 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Sep 2004 18:16:34 +0000 (18:16 +0000)
        * decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88293 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c

index 5444a09..4933e07 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-29  Jason Merrill  <jason@redhat.com>
+
+       PR tree-optimization/17697
+       * decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl.
+
 2004-09-28  Jason Merrill  <jason@redhat.com>
 
        PR middle-end/17525
index fb1334f..0b05467 100644 (file)
@@ -1719,6 +1719,8 @@ duplicate_decls (tree newdecl, tree olddecl)
        TREE_READONLY (olddecl) = 1;
       if (TREE_THIS_VOLATILE (newdecl))
        TREE_THIS_VOLATILE (olddecl) = 1;
+      if (TREE_NOTHROW (newdecl))
+       TREE_NOTHROW (olddecl) = 1;
 
       /* Merge the initialization information.  */
       if (DECL_INITIAL (newdecl) == NULL_TREE
@@ -5237,7 +5239,7 @@ expand_static_init (tree decl, tree init)
   if (DECL_FUNCTION_SCOPE_P (decl))
     {
       /* Emit code to perform this initialization but once.  */
-      tree if_stmt, inner_if_stmt = NULL_TREE;
+      tree if_stmt = NULL_TREE, inner_if_stmt = NULL_TREE;
       tree then_clause, inner_then_clause = NULL_TREE;
       tree guard, guard_addr, guard_addr_list;
       tree acquire_fn, release_fn, abort_fn;
@@ -5277,10 +5279,16 @@ expand_static_init (tree decl, tree init)
       /* Create the guard variable.  */
       guard = get_guard (decl);
 
-      /* Begin the conditional initialization.  */
-      if_stmt = begin_if_stmt ();
-      finish_if_stmt_cond (get_guard_cond (guard), if_stmt);
-      then_clause = begin_compound_stmt (BCS_NO_SCOPE);
+      /* This optimization isn't safe on targets which can reorder loads,
+        via speculative execution, caching behavior or whatever.  In that
+        case we force synchronization in __cxa_guard_acquire.  */
+      if (!targetm.reorders_loads || !flag_threadsafe_statics)
+       {
+         /* Begin the conditional initialization.  */
+         if_stmt = begin_if_stmt ();
+         finish_if_stmt_cond (get_guard_cond (guard), if_stmt);
+         then_clause = begin_compound_stmt (BCS_NO_SCOPE);
+       }
 
       if (flag_threadsafe_statics)
        {
@@ -5343,9 +5351,12 @@ expand_static_init (tree decl, tree init)
          finish_if_stmt (inner_if_stmt);
        }
 
-      finish_compound_stmt (then_clause);
-      finish_then_clause (if_stmt);
-      finish_if_stmt (if_stmt);
+      if (!targetm.reorders_loads || !flag_threadsafe_statics)
+       {
+         finish_compound_stmt (then_clause);
+         finish_then_clause (if_stmt);
+         finish_if_stmt (if_stmt);
+       }
     }
   else
     static_aggregates = tree_cons (init, decl, static_aggregates);