Hello Everyone,
               This patch is for the Cilkplus branch. In C and C++ compilers, 
at optimization -O and -O2, when there are inlined functions inside a function 
that calls a spawn it was giving an error. This patch should fix that.

Thanks,

Balaji V. Iyer.
diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk
index d19a345..0586eea 100644
--- a/gcc/ChangeLog.cilk
+++ b/gcc/ChangeLog.cilk
@@ -1,3 +1,9 @@
+2011-09-20  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * ipa-inline.c(can_inline_edge_p): Added a check for function
+       that spawns.
+       * ipa-inline-analysis.c (initialize_inline_failed): Likewise.
+
 2011-09-09  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * tree.c (walk_tree_1): Handled the "cilk_for" case.
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index f925416..f2ae0e1 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -1043,6 +1043,9 @@ initialize_inline_failed (struct cgraph_edge *e)
     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
   else if (e->call_stmt && gimple_call_cannot_inline_p (e->call_stmt))
     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
+  else if (flag_enable_cilk && cfun && cfun->calls_spawn)
+    /* can't inline if the function is spawing a function */
+    e->inline_failed = CIF_BODY_NOT_AVAILABLE;
   else
     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
 }
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index c10a618..47c2abf 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -260,6 +260,12 @@ can_inline_edge_p (struct cgraph_edge *e, bool report)
       e->inline_failed = CIF_BODY_NOT_AVAILABLE;
       inlinable = false;
     }
+  else if (flag_enable_cilk && caller_cfun && caller_cfun->calls_spawn)
+    {
+      /* we can't inline if the caller_cfun spawns a function */
+      e->inline_failed = CIF_BODY_NOT_AVAILABLE;
+      inlinable = false;
+    }
   else if (!inline_summary (callee)->inlinable)
     {
       e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
diff --git a/gcc/testsuite/ChangeLog.cilk b/gcc/testsuite/ChangeLog.cilk
index 5301fff..28884f5 100644
--- a/gcc/testsuite/ChangeLog.cilk
+++ b/gcc/testsuite/ChangeLog.cilk
@@ -1,3 +1,10 @@
+2011-09-20  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * gcc.dg/cilk-plus/spawner_inline.c: New.
+       * gcc.dg/cilk-plus/spawnee_inline.c: New.
+       * g++.dg/cilk-plus/spawner_inline.cpp: New.
+       * g++.dg/cilk-plus/spawnee_inline.cpp: New.
+
 2011-09-09  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp: New.
diff --git a/gcc/testsuite/g++.dg/cilk-plus/spawnee_inline.cpp 
b/gcc/testsuite/g++.dg/cilk-plus/spawnee_inline.cpp
new file mode 100644
index 0000000..1f36716
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cilk-plus/spawnee_inline.cpp
@@ -0,0 +1,43 @@
+#include <iostream>
+#include <cstdio>
+#include <cstdlib>
+
+int fib (char *n_char)
+{
+  int n;
+  char n_char_minus_one[20], n_char_minus_two[20];
+  if (n_char)
+    n = atoi (n_char);
+  else
+    n = 10;
+  
+  if (n < 2)
+    return n;
+  else
+    {     
+      int x, y;
+      sprintf(n_char_minus_one,"%d", n-1); 
+      sprintf(n_char_minus_two,"%d", n-2); 
+      x = cilk_spawn fib (n_char_minus_one);
+      y = cilk_spawn fib (n_char_minus_two);
+      cilk_sync;
+      return (x+y);
+    }
+}
+int main (int argc, char *argv[])
+{
+  int n, result;
+  if (argc == 2)
+    {
+      result = cilk_spawn fib (argv[1]);
+      cilk_sync; 
+      std::cout << "Result = " << result << std::endl;
+    }
+  else
+    {
+      result = cilk_spawn fib(NULL);
+      cilk_sync; 
+      std::cout << "Result = " << result << std::endl;
+    }
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/cilk-plus/spawner_inline.cpp 
b/gcc/testsuite/g++.dg/cilk-plus/spawner_inline.cpp
new file mode 100644
index 0000000..07044e7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cilk-plus/spawner_inline.cpp
@@ -0,0 +1,32 @@
+#include <iostream>
+#include <cstdlib>
+
+
+int fib (int n)
+{
+  if (n < 2)
+    return n;
+  else
+    {
+      int x, y;
+      x = cilk_spawn fib (n-1);
+      y = cilk_spawn fib (n-2);
+      cilk_sync;
+      return (x+y);
+      return 5;
+    }
+}
+
+int main (int argc, char *argv[])
+{
+  int n, result;
+  
+  if (argc == 2)
+    n = atoi(argv[1]);
+  else
+    n = 10;
+  result = cilk_spawn fib(n);
+  cilk_sync; 
+  std::cout << "Result = " << result << std::endl;
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/cilk-plus/spawnee_inline.c 
b/gcc/testsuite/gcc.dg/cilk-plus/spawnee_inline.c
new file mode 100644
index 0000000..5bc5177
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cilk-plus/spawnee_inline.c
@@ -0,0 +1,42 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+int fib (char *n_char)
+{
+  int n;
+  char n_char_minus_one[20], n_char_minus_two[20];
+  if (n_char)
+    n = atoi (n_char);
+  else
+    n = 10;
+  
+  if (n < 2)
+    return n;
+  else
+    {     
+      int x, y;
+      sprintf(n_char_minus_one,"%d", n-1); 
+      sprintf(n_char_minus_two,"%d", n-2); 
+      x = cilk_spawn fib (n_char_minus_one);
+      y = cilk_spawn fib (n_char_minus_two);
+      cilk_sync;
+      return (x+y);
+    }
+}
+int main (int argc, char *argv[])
+{
+  int n, result;
+  if (argc == 2)
+    {
+      result = cilk_spawn fib (argv[1]);
+      cilk_sync; 
+      printf ("Result: %d\n", result);
+    }
+  else
+    {
+      result = cilk_spawn fib(NULL);
+      cilk_sync; 
+      printf ("Result: %d\n", result);
+    }
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/cilk-plus/spawner_inline.c 
b/gcc/testsuite/gcc.dg/cilk-plus/spawner_inline.c
new file mode 100644
index 0000000..4c0e8b5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cilk-plus/spawner_inline.c
@@ -0,0 +1,33 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+
+int fib (int n)
+{
+  if (n<2)
+    return n;
+  else
+    {
+      int x, y;
+      x = cilk_spawn fib (n-1);
+      y = cilk_spawn fib (n-2);
+      cilk_sync;
+      return (x+y);
+      return 5;
+    }
+}
+
+int main (int argc, char *argv[])
+{
+  int n, result;
+  
+  if (argc == 2)
+    n = atoi(argv[1]);
+  else
+    n = 10;
+  result = cilk_spawn fib(n);
+  cilk_sync; 
+  printf ("Result: %d\n", result);
+  return 0;
+}
+

Reply via email to