@@ -389,4 +389,49 @@ struct S1 {
389
389
// CHECK-LABEL: taskinit
390
390
// CHECK: call i8* @__kmpc_omp_task_alloc(
391
391
392
+ template <typename T = void >
393
+ void foobar () {
394
+ float a;
395
+ #pragma omp parallel
396
+ #pragma omp single
397
+ {
398
+ double b;
399
+ #pragma omp task
400
+ a += b;
401
+ }
402
+ }
403
+
404
+ // CHECK: define void @{{.+}}xxxx{{.+}}()
405
+ void xxxx () {
406
+ // CHECK: call void @{{.+}}foobar{{.+}}()
407
+ foobar ();
408
+ }
409
+ // CHECK: define {{.*}}void @{{.+}}foobar{{.+}}()
410
+ // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* {{.+}}, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, float*)* [[PAR_OUTLINED:@.+]] to void (i32*, i32*, ...)*), float* %{{.+}})
411
+
412
+ // CHECK: define internal void [[PAR_OUTLINED]](i32* {{.+}}, i32* {{.+}}, float* {{.*}}[[A_ADDR:%.+]])
413
+ // UNTIEDRT: [[A_ADDR_REF:%.+]] = alloca float*,
414
+ // CHECK: [[B_ADDR:%.+]] = alloca double,
415
+ // UNTIEDRT: [[A_ADDR:%.+]] = load float*, float** [[A_ADDR_REF]],
416
+
417
+ // Copy `a` to the list of shared variables
418
+ // CHECK: [[SHARED_A:%.+]] = getelementptr inbounds %{{.+}}, [[SHAREDS_TY:%.+]]* [[SHAREDS:%.+]], i32 0, i32 0
419
+ // CHECK: store float* [[A_ADDR]], float** [[SHARED_A]],
420
+
421
+ // Allocate task.
422
+ // CHECK: [[RES:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* {{.+}}, i32 {{.+}}, i32 1, i64 48, i64 8, i32 (i32, i8*)* bitcast (i32 (i32, [[T_TASK_TY:%.+]]*)* @{{.+}} to i32 (i32, i8*)*))
423
+ // CHECK: [[TD:%.+]] = bitcast i8* [[RES]] to [[T_TASK_TY]]*
424
+ // Copy shared vars.
425
+ // CHECK: [[TD_TASK:%.+]] = getelementptr inbounds [[T_TASK_TY]], [[T_TASK_TY]]* [[TD]], i32 0, i32 0
426
+ // CHECK: [[TD_TASK_SHARES_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[TD_TASK]], i32 0, i32 0
427
+ // CHECK: [[TD_TASK_SHARES:%.+]] = load i8*, i8** [[TD_TASK_SHARES_REF]],
428
+ // CHECK: [[SHAREDS_BC:%.+]] = bitcast [[SHAREDS_TY]]* [[SHAREDS]] to i8*
429
+ // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TD_TASK_SHARES]], i8* align 8 [[SHAREDS_BC]], i64 8, i1 false)
430
+
431
+ // Copy firstprivate value of `b`.
432
+ // CHECK: [[TD_TASK_PRIVS:%.+]] = getelementptr inbounds [[T_TASK_TY]], [[T_TASK_TY]]* [[TD]], i32 0, i32 1
433
+ // CHECK: [[TD_TASK_PRIVS_B:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[TD_TASK_PRIVS]], i32 0, i32 0
434
+ // CHECK: [[B_VAL:%.+]] = load double, double* [[B_ADDR]],
435
+ // CHECK: store double [[B_VAL]], double* [[TD_TASK_PRIVS_B]],
436
+
392
437
#endif
0 commit comments