aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2004-09-29 14:16:34 -0400
committerJason Merrill <jason@gcc.gnu.org>2004-09-29 14:16:34 -0400
commit5cefa0d95b76d79efc4f1ea63a95fd24dbd4a4af (patch)
treef1f413cda3b5d6ca787c0804f4ba3541869a70ef /gcc
parentd962e7adc0f3b990f7b986bb5443a9d1d2361789 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/decl.c27
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);