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 ();

Reply via email to