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; +} +