From 5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 29 Sep 2004 14:16:34 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl.c | 27 +++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5444a09ba63..4933e07af12 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2004-09-29 Jason Merrill + + PR tree-optimization/17697 + * decl.c (duplicate_decls): Copy TREE_NOTHROW from newdecl to olddecl. + 2004-09-28 Jason Merrill PR middle-end/17525 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index fb1334fc16f..0b0546759bc 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); -- 2.30.2