re PR middle-end/78306 ([CilkPlus] "inlining failed in call to always_inline ‘memset’: function not inlinable" with -fcilkplus)

2016-11-17  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78306
	* ipa-inline-analysis.c (initialize_inline_failed): Do not
	inhibit inlining if function calls cilk_spawn.
	(can_inline_edge_p): Likewise.

	* gcc.dg/cilk-plus/pr78306.c: New testcase.

From-SVN: r242537
This commit is contained in:
Richard Biener 2016-11-17 08:42:50 +00:00 committed by Richard Biener
parent f829413178
commit 8ce3fee51b
5 changed files with 42 additions and 8 deletions

View file

@ -1,3 +1,10 @@
2016-11-17 Richard Biener <rguenther@suse.de>
PR tree-optimization/78306
* ipa-inline-analysis.c (initialize_inline_failed): Do not
inhibit inlining if function calls cilk_spawn.
(can_inline_edge_p): Likewise.
2016-11-17 Richard Biener <rguenther@suse.de>
PR middle-end/78305

View file

@ -1507,9 +1507,6 @@ initialize_inline_failed (struct cgraph_edge *e)
e->inline_failed = CIF_BODY_NOT_AVAILABLE;
else if (callee->local.redefined_extern_inline)
e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
else if (cfun && fn_contains_cilk_spawn_p (cfun))
/* We can't inline if the function is spawing a function. */
e->inline_failed = CIF_CILK_SPAWN;
else
e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
gcc_checking_assert (!e->call_stmt_cannot_inline_p

View file

@ -368,11 +368,6 @@ can_inline_edge_p (struct cgraph_edge *e, bool report,
e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
inlinable = false;
}
else if (inline_summaries->get (caller)->contains_cilk_spawn)
{
e->inline_failed = CIF_CILK_SPAWN;
inlinable = false;
}
/* Don't inline a function with mismatched sanitization attributes. */
else if (!sanitize_attrs_match_for_inline_p (caller->decl, callee->decl))
{

View file

@ -1,3 +1,8 @@
2016-11-17 Richard Biener <rguenther@suse.de>
PR tree-optimization/78306
* gcc.dg/cilk-plus/pr78306.c: New testcase.
2016-11-17 Richard Biener <rguenther@suse.de>
PR middle-end/78305

View file

@ -0,0 +1,30 @@
/* { dg-do run } */
/* { dg-options "-O2 -fcilkplus" } */
#define _FORTIFY_SOURCE 2
#include <string.h>
int sum(int low, int high)
{
if(low == high) {
return low;
}
int mid = low + (high-low)/2;
int a = _Cilk_spawn sum(low, mid);
int b = sum(mid+1, high);
// Some very expensive computation here
int foo[64];
memset(foo, 0, 64*sizeof(int)); // <--- Fails
_Cilk_sync;
return a+b;
}
int main(void) {
if (sum(0, 100) != 5050)
__builtin_abort ();
return 0;
}