diff options
author | Jason Merrill <jason@redhat.com> | 2004-09-29 14:16:34 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2004-09-29 14:16:34 -0400 |
commit | 5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af (patch) | |
tree | f1f413cda3b5d6ca787c0804f4ba3541869a70ef /gcc | |
parent | d962e7adc0f3b990f7b986bb5443a9d1d2361789 (diff) | |
download | gcc-5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af.zip gcc-5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af.tar.gz gcc-5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af.tar.bz2 |
re PR tree-optimization/17697 (ICE: Statement marked for throw, but doesn't - verify_stmts failed)
PR tree-optimization/17697
* decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl.
From-SVN: r88293
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 27 |
2 files changed, 24 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5444a09..4933e07 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index fb1334f..0b05467 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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); |