+ PR middle-end/52142 + * ipa-inline.c (can_inline_edge_p): Do not inline...
+ PR middle-end/52142 + * ipa-inline.c (can_inline_edge_p): Do not inline tm_pure + functions into non-tm_pure functions. From-SVN: r184251
This commit is contained in:
parent
6bb69d8759
commit
a7ff6e2725
@ -1,3 +1,9 @@
|
||||
2012-02-14 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
PR middle-end/52142
|
||||
* ipa-inline.c (can_inline_edge_p): Do not inline tm_pure
|
||||
functions into non-tm_pure functions.
|
||||
|
||||
2012-02-14 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR lto/52178
|
||||
|
@ -284,10 +284,10 @@ can_inline_edge_p (struct cgraph_edge *e, bool report)
|
||||
e->inline_failed = CIF_EH_PERSONALITY;
|
||||
inlinable = false;
|
||||
}
|
||||
/* TM pure functions should not get inlined if the outer function is
|
||||
a TM safe function. */
|
||||
/* TM pure functions should not be inlined into non-TM_pure
|
||||
functions. */
|
||||
else if (is_tm_pure (callee->decl)
|
||||
&& is_tm_safe (e->caller->decl))
|
||||
&& !is_tm_pure (e->caller->decl))
|
||||
{
|
||||
e->inline_failed = CIF_UNSPECIFIED;
|
||||
inlinable = false;
|
||||
|
21
gcc/testsuite/gcc.dg/tm/pr52141.c
Normal file
21
gcc/testsuite/gcc.dg/tm/pr52141.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fgnu-tm -O1" } */
|
||||
|
||||
inline void asmfunc(void)
|
||||
{
|
||||
__asm__ (""); /* { dg-error "asm not allowed in .transaction_safe" } */
|
||||
}
|
||||
|
||||
__attribute__((transaction_safe))
|
||||
static void f(void)
|
||||
{
|
||||
asmfunc();
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
__transaction_atomic {
|
||||
f();
|
||||
}
|
||||
return 0;
|
||||
}
|
22
gcc/testsuite/gcc.dg/tm/pr52142.c
Normal file
22
gcc/testsuite/gcc.dg/tm/pr52142.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fgnu-tm -O1" } */
|
||||
static int global = 0;
|
||||
|
||||
__attribute__((transaction_pure))
|
||||
static inline void purefunc()
|
||||
{
|
||||
global++;
|
||||
}
|
||||
|
||||
__attribute__((transaction_safe))
|
||||
void f();
|
||||
|
||||
void push()
|
||||
{
|
||||
__transaction_atomic {
|
||||
f();
|
||||
purefunc();
|
||||
}
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-not "_ITM_RfWU4" } } */
|
@ -3736,6 +3736,10 @@ ipa_tm_scan_irr_block (basic_block bb)
|
||||
assembly statement is not relevant to the transaction
|
||||
is to wrap it in a __tm_waiver block. This is not
|
||||
yet implemented, so we can't check for it. */
|
||||
if (is_tm_safe (current_function_decl))
|
||||
error_at (gimple_location (stmt),
|
||||
"asm not allowed in %<transaction_safe%> function %qE",
|
||||
current_function_decl);
|
||||
return true;
|
||||
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user