From: aldyh Date: Wed, 15 Feb 2012 00:29:06 +0000 (+0000) Subject: + PR middle-end/52142 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3bd76a9934b9469a02c6fa46e089f720e1b600ce;p=thirdparty%2Fgcc.git + PR middle-end/52142 + * ipa-inline.c (can_inline_edge_p): Do not inline tm_pure + functions into non-tm_pure functions. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184251 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7f2169b9d33..b3d1b9cdaa6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-02-14 Aldy Hernandez + + 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 PR lto/52178 diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 8f8899f2475d..d7ccf684f646 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -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; diff --git a/gcc/testsuite/gcc.dg/tm/pr52141.c b/gcc/testsuite/gcc.dg/tm/pr52141.c new file mode 100644 index 000000000000..c5136f3e0649 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/pr52141.c @@ -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; +} diff --git a/gcc/testsuite/gcc.dg/tm/pr52142.c b/gcc/testsuite/gcc.dg/tm/pr52142.c new file mode 100644 index 000000000000..21d4a0ca13a6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/pr52142.c @@ -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" } } */ diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index d760db34b2ae..b7320b5ee724 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -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 % function %qE", + current_function_decl); return true; default: