Only apply adjust_args in OpenMP dispatch if variant substitution occurs
This is a followup to
084ea8ad58
OpenMP: middle-end support for dispatch + adjust_args.
This patch fixes a bug that caused arguments in an OpenMP dispatch call to be
modified even when no variant substitution occurred.
gcc/ChangeLog:
* gimplify.cc (gimplify_call_expr): Create variable
variant_substituted_p to control whether adjust_args applies.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/adjust-args-4.c: New test.
This commit is contained in:
parent
405c99c172
commit
aa688dd630
2 changed files with 33 additions and 4 deletions
|
@ -3857,7 +3857,8 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
|
|||
enum gimplify_status ret;
|
||||
int i, nargs;
|
||||
gcall *call;
|
||||
bool builtin_va_start_p = false, omp_dispatch_p = false;
|
||||
bool builtin_va_start_p = false, omp_dispatch_p = false,
|
||||
variant_substituted_p = false;
|
||||
location_t loc = EXPR_LOCATION (*expr_p);
|
||||
|
||||
gcc_assert (TREE_CODE (*expr_p) == CALL_EXPR);
|
||||
|
@ -4035,7 +4036,10 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
|
|||
{
|
||||
tree variant = omp_resolve_declare_variant (fndecl);
|
||||
if (variant != fndecl)
|
||||
CALL_EXPR_FN (*expr_p) = build1 (ADDR_EXPR, fnptrtype, variant);
|
||||
{
|
||||
CALL_EXPR_FN (*expr_p) = build1 (ADDR_EXPR, fnptrtype, variant);
|
||||
variant_substituted_p = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* There is a sequence point before the call, so any side effects in
|
||||
|
@ -4325,8 +4329,9 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
|
|||
}
|
||||
}
|
||||
|
||||
if ((need_device_ptr && !is_device_ptr)
|
||||
|| (need_device_addr && !has_device_addr))
|
||||
if (variant_substituted_p
|
||||
&& ((need_device_ptr && !is_device_ptr)
|
||||
|| (need_device_addr && !has_device_addr)))
|
||||
{
|
||||
if (dispatch_device_num == NULL_TREE)
|
||||
{
|
||||
|
|
24
gcc/testsuite/c-c++-common/gomp/adjust-args-4.c
Normal file
24
gcc/testsuite/c-c++-common/gomp/adjust-args-4.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-fdump-tree-gimple" } */
|
||||
|
||||
/* Ensure that adjust_args is only applied when variant substitution happens. */
|
||||
|
||||
void h(int *);
|
||||
void f(int *);
|
||||
#pragma omp declare variant(f) match(construct={dispatch}) adjust_args(need_device_ptr : x)
|
||||
void g(int *x);
|
||||
|
||||
void foo(int *y)
|
||||
{
|
||||
#pragma omp dispatch
|
||||
h(y);
|
||||
#pragma omp dispatch
|
||||
f(y);
|
||||
#pragma omp dispatch
|
||||
g(y);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "h \\(y\\);" 1 "gimple" } } */
|
||||
/* { dg-final { scan-tree-dump-times "f \\(y\\);" 1 "gimple" } } */
|
||||
/* { dg-final { scan-tree-dump-times "D\.\[0-9]+ = __builtin_omp_get_mapped_ptr \\(y, D\.\[0-9]+\\);" 1 "gimple" } } */
|
||||
/* { dg-final { scan-tree-dump-times "f \\(D\.\[0-9]+\\);" 1 "gimple" } } */
|
Loading…
Add table
Reference in a new issue