Commit 80fd8eba by Aldy Hernandez Committed by Aldy Hernandez

trans-mem.c (struct diagnose_tm): Remove saw_unsafe.

        PR/51443
        * trans-mem.c (struct diagnose_tm): Remove saw_unsafe.
        (diagnose_tm_1): Same.
        (ipa_tm_execute): Do not test tm_may_enter_irr before we set it.
        (ipa_tm_scan_irr_function): Return gracefully when no
        DECL_STRUCT_FUNCTION.
        (ipa_tm_scan_irr_block): Believe the user on TM attributes.

From-SVN: r182290
parent d3705186
2011-12-13 Aldy Hernandez <aldyh@redhat.com>
PR/51443
* trans-mem.c (struct diagnose_tm): Remove saw_unsafe.
(diagnose_tm_1): Same.
(ipa_tm_execute): Do not test tm_may_enter_irr before we set it.
(ipa_tm_scan_irr_function): Return gracefully when no
DECL_STRUCT_FUNCTION.
(ipa_tm_scan_irr_block): Believe the user on TM attributes.
2011-12-13 Martin Jambor <mjambor@suse.cz> 2011-12-13 Martin Jambor <mjambor@suse.cz>
PR middle-end/50628 PR middle-end/50628
// { dg-do compile }
// { dg-options "-fgnu-tm -O1" }
template<class T> class shared_ptr {
public:
shared_ptr() {
__asm__ ("");
}
};
template<typename _Tp> class deque {
public:
void push_back() {
::new _Tp();
}
};
class Bar {
__attribute__((transaction_callable)) void push();
deque<shared_ptr<int> > events;
};
void Bar::push() {
events.push_back();
}
/* { dg-do compile } */
/* { dg-options "-fgnu-tm -O1" } */
static inline void asmfunc()
{
__asm__("");
}
__attribute__((transaction_callable))
void push()
{
asmfunc();
}
...@@ -544,7 +544,6 @@ struct diagnose_tm ...@@ -544,7 +544,6 @@ struct diagnose_tm
unsigned int summary_flags : 8; unsigned int summary_flags : 8;
unsigned int block_flags : 8; unsigned int block_flags : 8;
unsigned int func_flags : 8; unsigned int func_flags : 8;
unsigned int saw_unsafe : 1;
unsigned int saw_volatile : 1; unsigned int saw_volatile : 1;
gimple stmt; gimple stmt;
}; };
...@@ -695,8 +694,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p, ...@@ -695,8 +694,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
else if (d->func_flags & DIAG_TM_SAFE) else if (d->func_flags & DIAG_TM_SAFE)
error_at (gimple_location (stmt), error_at (gimple_location (stmt),
"asm not allowed in %<transaction_safe%> function"); "asm not allowed in %<transaction_safe%> function");
else
d->saw_unsafe = true;
break; break;
case GIMPLE_TRANSACTION: case GIMPLE_TRANSACTION:
...@@ -711,8 +708,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p, ...@@ -711,8 +708,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
else if (d->func_flags & DIAG_TM_SAFE) else if (d->func_flags & DIAG_TM_SAFE)
error_at (gimple_location (stmt), error_at (gimple_location (stmt),
"relaxed transaction in %<transaction_safe%> function"); "relaxed transaction in %<transaction_safe%> function");
else
d->saw_unsafe = true;
inner_flags = DIAG_TM_RELAXED; inner_flags = DIAG_TM_RELAXED;
} }
else if (gimple_transaction_subcode (stmt) & GTMA_IS_OUTER) else if (gimple_transaction_subcode (stmt) & GTMA_IS_OUTER)
...@@ -727,8 +722,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p, ...@@ -727,8 +722,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
else if (d->func_flags & DIAG_TM_SAFE) else if (d->func_flags & DIAG_TM_SAFE)
error_at (gimple_location (stmt), error_at (gimple_location (stmt),
"outer transaction in %<transaction_safe%> function"); "outer transaction in %<transaction_safe%> function");
else
d->saw_unsafe = true;
inner_flags |= DIAG_TM_OUTER; inner_flags |= DIAG_TM_OUTER;
} }
...@@ -748,8 +741,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p, ...@@ -748,8 +741,6 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
walk_gimple_seq (gimple_transaction_body (stmt), walk_gimple_seq (gimple_transaction_body (stmt),
diagnose_tm_1, diagnose_tm_1_op, &wi_inner); diagnose_tm_1, diagnose_tm_1_op, &wi_inner);
d->saw_unsafe |= d_inner.saw_unsafe;
} }
} }
break; break;
...@@ -780,11 +771,6 @@ diagnose_tm_blocks (void) ...@@ -780,11 +771,6 @@ diagnose_tm_blocks (void)
walk_gimple_seq (gimple_body (current_function_decl), walk_gimple_seq (gimple_body (current_function_decl),
diagnose_tm_1, diagnose_tm_1_op, &wi); diagnose_tm_1, diagnose_tm_1_op, &wi);
/* If we saw something other than a call that makes this function
unsafe, remember it so that the IPA pass only needs to scan calls. */
if (d.saw_unsafe && !is_tm_safe_or_pure (current_function_decl))
cgraph_local_info (current_function_decl)->tm_may_enter_irr = 1;
return 0; return 0;
} }
...@@ -3696,7 +3682,11 @@ ipa_tm_scan_irr_block (basic_block bb) ...@@ -3696,7 +3682,11 @@ ipa_tm_scan_irr_block (basic_block bb)
break; break;
d = get_cg_data (cgraph_get_node (fn)); d = get_cg_data (cgraph_get_node (fn));
if (d->is_irrevocable)
/* Return true if irrevocable, but above all, believe
the user. */
if (d->is_irrevocable
&& !is_tm_safe_or_pure (fn))
return true; return true;
} }
break; break;
...@@ -3880,6 +3870,11 @@ ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone) ...@@ -3880,6 +3870,11 @@ ipa_tm_scan_irr_function (struct cgraph_node *node, bool for_clone)
VEC (basic_block, heap) *queue; VEC (basic_block, heap) *queue;
bool ret = false; bool ret = false;
/* Builtin operators (operator new, and such). */
if (DECL_STRUCT_FUNCTION (node->decl) == NULL
|| DECL_STRUCT_FUNCTION (node->decl)->cfg == NULL)
return false;
current_function_decl = node->decl; current_function_decl = node->decl;
push_cfun (DECL_STRUCT_FUNCTION (node->decl)); push_cfun (DECL_STRUCT_FUNCTION (node->decl));
calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS);
...@@ -4689,15 +4684,12 @@ ipa_tm_execute (void) ...@@ -4689,15 +4684,12 @@ ipa_tm_execute (void)
/* Scan for calls that are in each transaction. */ /* Scan for calls that are in each transaction. */
ipa_tm_scan_calls_transaction (d, &tm_callees); ipa_tm_scan_calls_transaction (d, &tm_callees);
/* If we saw something that will make us go irrevocable, put it /* Put it in the worklist so we can scan the function
in the worklist so we can scan the function later later (ipa_tm_scan_irr_function) and mark the
(ipa_tm_scan_irr_function) and mark the irrevocable blocks. */ irrevocable blocks. */
if (node->local.tm_may_enter_irr)
{
maybe_push_queue (node, &irr_worklist, &d->in_worklist); maybe_push_queue (node, &irr_worklist, &d->in_worklist);
d->want_irr_scan_normal = true; d->want_irr_scan_normal = true;
} }
}
pop_cfun (); pop_cfun ();
current_function_decl = NULL; current_function_decl = NULL;
...@@ -4712,10 +4704,9 @@ ipa_tm_execute (void) ...@@ -4712,10 +4704,9 @@ ipa_tm_execute (void)
a = cgraph_function_body_availability (node); a = cgraph_function_body_availability (node);
d = get_cg_data (node); d = get_cg_data (node);
/* If we saw something that will make us go irrevocable, put it /* Put it in the worklist so we can scan the function later
in the worklist so we can scan the function later (ipa_tm_scan_irr_function) and mark the irrevocable
(ipa_tm_scan_irr_function) and mark the irrevocable blocks. */ blocks. */
if (node->local.tm_may_enter_irr)
maybe_push_queue (node, &irr_worklist, &d->in_worklist); maybe_push_queue (node, &irr_worklist, &d->in_worklist);
/* Some callees cannot be arbitrarily cloned. These will always be /* Some callees cannot be arbitrarily cloned. These will always be
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment