]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
+ PR middle-end/52142
authoraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 00:29:06 +0000 (00:29 +0000)
committeraldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Feb 2012 00:29:06 +0000 (00:29 +0000)
+       * 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

gcc/ChangeLog
gcc/ipa-inline.c
gcc/testsuite/gcc.dg/tm/pr52141.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tm/pr52142.c [new file with mode: 0644]
gcc/trans-mem.c

index f7f2169b9d33e5a21d749f78f5b15ea823e3d585..b3d1b9cdaa6fa127899f0a1d6cf6be0b29ae43e6 100644 (file)
@@ -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
index 8f8899f2475da9128e0b40ab3463ae52086da558..d7ccf684f646580ae92e29cc296e30dc028e64e2 100644 (file)
@@ -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 (file)
index 0000000..c5136f3
--- /dev/null
@@ -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 (file)
index 0000000..21d4a0c
--- /dev/null
@@ -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" } } */
index d760db34b2aee0a44674659e72fe63c5940a65b3..b7320b5ee7243e6e3e13e13ec01c5c70e312f843 100644 (file)
@@ -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: