[openacc] Fix ICE verifying gimple
diff mbox series

Message ID d5b866af-3781-abe5-9561-a33ac32f4913@codesourcery.com
State New
Headers show
Series
  • [openacc] Fix ICE verifying gimple
Related show

Commit Message

Andrew Stubbs Nov. 22, 2019, 11:06 a.m. UTC
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?

Patch
diff mbox series

Normalize GOACC_parallel_keyed async parameter.

2019-11-22  Andrew Stubbs  <ams@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 ();