From a7ff6e2725731539c2f122618c97847069a9a6aa Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 15 Feb 2012 00:29:06 +0000 Subject: [PATCH] + 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 --- gcc/ChangeLog | 6 ++++++ gcc/ipa-inline.c | 6 +++--- gcc/testsuite/gcc.dg/tm/pr52141.c | 21 +++++++++++++++++++++ gcc/testsuite/gcc.dg/tm/pr52142.c | 22 ++++++++++++++++++++++ gcc/trans-mem.c | 4 ++++ 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tm/pr52141.c create mode 100644 gcc/testsuite/gcc.dg/tm/pr52142.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f7f2169b9d3..b3d1b9cdaa6 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 8f8899f2475..d7ccf684f64 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 00000000000..c5136f3e064 --- /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 00000000000..21d4a0ca13a --- /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 d760db34b2a..b7320b5ee72 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: -- 2.30.2