re PR c++/36523 (OpenMP task construct fails to instantiate copy constructor)

PR c++/36523
	* cgraphunit.c (cgraph_process_new_functions): Don't clear
	node->needed and node->reachable.
	* cgraphbuild.c (record_reference): Handle OMP_PARALLEL and OMP_TASK.
	* omp-low.c (delete_omp_context): Call finalize_task_copyfn.
	(expand_task_call): Don't call expand_task_copyfn.
	(expand_task_copyfn): Renamed to...
	(finalize_task_copyfn): ... this.

	* testsuite/libgomp.c++/task-7.C: New function.

From-SVN: r136977
This commit is contained in:
Jakub Jelinek 2008-06-20 04:18:07 +02:00 committed by Jakub Jelinek
parent c598874b4b
commit 2368a460c8
6 changed files with 84 additions and 33 deletions

View File

@ -1,3 +1,14 @@
2008-06-19 Jakub Jelinek <jakub@redhat.com>
PR c++/36523
* cgraphunit.c (cgraph_process_new_functions): Don't clear
node->needed and node->reachable.
* cgraphbuild.c (record_reference): Handle OMP_PARALLEL and OMP_TASK.
* omp-low.c (delete_omp_context): Call finalize_task_copyfn.
(expand_task_call): Don't call expand_task_copyfn.
(expand_task_copyfn): Renamed to...
(finalize_task_copyfn): ... this.
2008-06-19 Jan Hubicka <jh@suse.cz>
* builtins.c (expand_builtin_nonlocal_goto): Stabilize r_sp before

View File

@ -62,6 +62,24 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
}
break;
case OMP_PARALLEL:
if (flag_unit_at_a_time)
{
if (OMP_PARALLEL_FN (*tp))
cgraph_mark_needed_node (cgraph_node (OMP_PARALLEL_FN (*tp)));
}
break;
case OMP_TASK:
if (flag_unit_at_a_time)
{
if (OMP_TASK_FN (*tp))
cgraph_mark_needed_node (cgraph_node (OMP_TASK_FN (*tp)));
if (OMP_TASK_COPYFN (*tp))
cgraph_mark_needed_node (cgraph_node (OMP_TASK_COPYFN (*tp)));
}
break;
default:
/* Save some cycles by not walking types and declaration as we
won't find anything useful there anyway. */

View File

@ -443,7 +443,6 @@ cgraph_process_new_functions (void)
it into reachable functions list. */
node->next_needed = NULL;
node->needed = node->reachable = false;
cgraph_finalize_function (fndecl, false);
cgraph_mark_reachable_node (node);
output = true;

View File

@ -1188,6 +1188,37 @@ new_omp_context (tree stmt, omp_context *outer_ctx)
return ctx;
}
static void maybe_catch_exception (tree *stmt_p);
/* Finalize task copyfn. */
static void
finalize_task_copyfn (tree task_stmt)
{
struct function *child_cfun;
tree child_fn, old_fn;
child_fn = OMP_TASK_COPYFN (task_stmt);
if (child_fn == NULL_TREE)
return;
child_cfun = DECL_STRUCT_FUNCTION (child_fn);
/* Inform the callgraph about the new function. */
DECL_STRUCT_FUNCTION (child_fn)->curr_properties
= cfun->curr_properties;
old_fn = current_function_decl;
push_cfun (child_cfun);
current_function_decl = child_fn;
gimplify_body (&DECL_SAVED_TREE (child_fn), child_fn, false);
maybe_catch_exception (&BIND_EXPR_BODY (DECL_SAVED_TREE (child_fn)));
pop_cfun ();
current_function_decl = old_fn;
cgraph_add_new_function (child_fn, false);
}
/* Destroy a omp_context data structures. Called through the splay tree
value delete callback. */
@ -1218,6 +1249,9 @@ delete_omp_context (splay_tree_value value)
DECL_ABSTRACT_ORIGIN (t) = NULL;
}
if (is_task_ctx (ctx))
finalize_task_copyfn (ctx->stmt);
XDELETE (ctx);
}
@ -2882,35 +2916,6 @@ expand_parallel_call (struct omp_region *region, basic_block bb,
}
static void maybe_catch_exception (tree *stmt_p);
/* Finalize task copyfn. */
static void
expand_task_copyfn (tree task_stmt)
{
struct function *child_cfun;
tree child_fn, old_fn;
child_fn = OMP_TASK_COPYFN (task_stmt);
child_cfun = DECL_STRUCT_FUNCTION (child_fn);
/* Inform the callgraph about the new function. */
DECL_STRUCT_FUNCTION (child_fn)->curr_properties
= cfun->curr_properties;
old_fn = current_function_decl;
push_cfun (child_cfun);
current_function_decl = child_fn;
gimplify_body (&DECL_SAVED_TREE (child_fn), child_fn, false);
maybe_catch_exception (&BIND_EXPR_BODY (DECL_SAVED_TREE (child_fn)));
pop_cfun ();
current_function_decl = old_fn;
cgraph_add_new_function (child_fn, false);
}
/* Build the function call to GOMP_task to actually
generate the task operation. BB is the block where to insert the code. */
@ -2922,9 +2927,6 @@ expand_task_call (basic_block bb, tree entry_stmt)
clauses = OMP_TASK_CLAUSES (entry_stmt);
if (OMP_TASK_COPYFN (entry_stmt))
expand_task_copyfn (entry_stmt);
c = find_omp_clause (clauses, OMP_CLAUSE_IF);
if (c)
cond = gimple_boolify (OMP_CLAUSE_IF_EXPR (c));

View File

@ -2,6 +2,9 @@
* testsuite/libgomp.c/nqueens-1.c: New test.
PR c++/36523
* testsuite/libgomp.c++/task-7.C: New function.
2008-06-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* configure: Regenerate.

View File

@ -0,0 +1,18 @@
// PR c++/36523
// { dg-do run }
template<typename T>
struct A
{
A() { }
A(const A&) { }
void foo() { }
};
int main()
{
A<int> a;
#pragma omp task firstprivate (a)
a.foo();
return 0;
}