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:
parent
c598874b4b
commit
2368a460c8
|
@ -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>
|
2008-06-19 Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
* builtins.c (expand_builtin_nonlocal_goto): Stabilize r_sp before
|
* builtins.c (expand_builtin_nonlocal_goto): Stabilize r_sp before
|
||||||
|
|
|
@ -62,6 +62,24 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
/* Save some cycles by not walking types and declaration as we
|
/* Save some cycles by not walking types and declaration as we
|
||||||
won't find anything useful there anyway. */
|
won't find anything useful there anyway. */
|
||||||
|
|
|
@ -443,7 +443,6 @@ cgraph_process_new_functions (void)
|
||||||
it into reachable functions list. */
|
it into reachable functions list. */
|
||||||
|
|
||||||
node->next_needed = NULL;
|
node->next_needed = NULL;
|
||||||
node->needed = node->reachable = false;
|
|
||||||
cgraph_finalize_function (fndecl, false);
|
cgraph_finalize_function (fndecl, false);
|
||||||
cgraph_mark_reachable_node (node);
|
cgraph_mark_reachable_node (node);
|
||||||
output = true;
|
output = true;
|
||||||
|
|
|
@ -1188,6 +1188,37 @@ new_omp_context (tree stmt, omp_context *outer_ctx)
|
||||||
return 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
|
/* Destroy a omp_context data structures. Called through the splay tree
|
||||||
value delete callback. */
|
value delete callback. */
|
||||||
|
|
||||||
|
@ -1218,6 +1249,9 @@ delete_omp_context (splay_tree_value value)
|
||||||
DECL_ABSTRACT_ORIGIN (t) = NULL;
|
DECL_ABSTRACT_ORIGIN (t) = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_task_ctx (ctx))
|
||||||
|
finalize_task_copyfn (ctx->stmt);
|
||||||
|
|
||||||
XDELETE (ctx);
|
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
|
/* Build the function call to GOMP_task to actually
|
||||||
generate the task operation. BB is the block where to insert the code. */
|
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);
|
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);
|
c = find_omp_clause (clauses, OMP_CLAUSE_IF);
|
||||||
if (c)
|
if (c)
|
||||||
cond = gimple_boolify (OMP_CLAUSE_IF_EXPR (c));
|
cond = gimple_boolify (OMP_CLAUSE_IF_EXPR (c));
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
|
|
||||||
* testsuite/libgomp.c/nqueens-1.c: New test.
|
* 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>
|
2008-06-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||||
|
|
||||||
* configure: Regenerate.
|
* configure: Regenerate.
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue