This test case causes an ICE (reformatted for email):
void test(int k)
{
unsigned int x = 1;
#pragma acc parallel loop async(x)
for (int i = 0; i < k; i++) { }
}
t.c: In function 'test':
t.c:4:9: error: invalid argument to gimple call
4 | #pragma acc parallel loop async(x)
| ^~~
(int) x
__builtin_GOACC_parallel_keyed (-1, test._omp_fn.0, 1,
&.omp_data_arr.3, &.omp_data_sizes.4,
&.omp_data_kinds.5, 536936447,
(int) x, 0);
during GIMPLE pass: ompexp
dump file: t.c.013t.ompexp
t.c:4:9: internal compiler error: verify_gimple failed
The problem is that "x" needs to be cast to "int" (from "unsigned int")
before calling the function, and that's not valid in a gimple call.
The attached patch assigns the "(int) x" to a temporary and passes that
to the function instead.
OK to commit?
--
Andrew Stubbs
CodeSourcery / Mentor Graphics
Normalize GOACC_parallel_keyed async parameter.
2019-11-22 Andrew Stubbs <a...@codesourcery.com>
gcc/
* omp-expand.c (expand_omp_target): Pass sync parameter to
GOACC_parallel_keyed via a temporary variable.
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index 6f945011cf5..08f95587e95 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -8418,7 +8418,12 @@ expand_omp_target (struct omp_region *region)
i_async));
}
if (t_async)
- args.safe_push (t_async);
+ {
+ tree tmp = create_tmp_var (TREE_TYPE (t_async));
+ gimple *stmt = gimple_build_assign (tmp, t_async);
+ gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
+ args.safe_push (tmp);
+ }
/* Save the argument index, and ... */
unsigned t_wait_idx = args.length ();