@@ -3307,3 +3307,68 @@ llvm.func @distribute() {
3307
3307
// CHECK: store i64 1, ptr %[[STRIDE]]
3308
3308
// CHECK: %[[TID:.*]] = call i32 @__kmpc_global_thread_num({{.*}})
3309
3309
// CHECK: call void @__kmpc_for_static_init_{{.*}}(ptr @{{.*}}, i32 %[[TID]], i32 92, ptr %[[LASTITER]], ptr %[[LB]], ptr %[[UB]], ptr %[[STRIDE]], i64 1, i64 0)
3310
+
3311
+ // -----
3312
+
3313
+ llvm.func @distribute_wsloop (%lb : i32 , %ub : i32 , %step : i32 ) {
3314
+ omp.parallel {
3315
+ omp.distribute {
3316
+ omp.wsloop {
3317
+ omp.loop_nest (%iv ) : i32 = (%lb ) to (%ub ) step (%step ) {
3318
+ omp.yield
3319
+ }
3320
+ } {omp.composite }
3321
+ } {omp.composite }
3322
+ omp.terminator
3323
+ } {omp.composite }
3324
+ llvm.return
3325
+ }
3326
+
3327
+ // CHECK-LABEL: define void @distribute_wsloop
3328
+ // CHECK: call void{{.*}}@__kmpc_fork_call({{.*}}, ptr @[[OUTLINED_PARALLEL:.*]],
3329
+
3330
+ // CHECK: define internal void @[[OUTLINED_PARALLEL]]({{.*}})
3331
+ // CHECK: %[[ARGS:.*]] = alloca { i32, i32, i32, ptr, ptr, ptr, ptr }
3332
+ // CHECK: %[[LASTITER_ALLOC:.*]] = alloca i32
3333
+ // CHECK: %[[LB_ALLOC:.*]] = alloca i32
3334
+ // CHECK: %[[UB_ALLOC:.*]] = alloca i32
3335
+ // CHECK: %[[STRIDE_ALLOC:.*]] = alloca i32
3336
+ // CHECK: %[[LB_ARG:.*]] = getelementptr {{.*}}, ptr %[[ARGS]], i32 0, i32 3
3337
+ // CHECK: store ptr %[[LB_ALLOC]], ptr %[[LB_ARG]]
3338
+ // CHECK: %[[UB_ARG:.*]] = getelementptr {{.*}}, ptr %[[ARGS]], i32 0, i32 4
3339
+ // CHECK: store ptr %[[UB_ALLOC]], ptr %[[UB_ARG]]
3340
+ // CHECK: %[[STRIDE_ARG:.*]] = getelementptr {{.*}}, ptr %[[ARGS]], i32 0, i32 5
3341
+ // CHECK: store ptr %[[STRIDE_ALLOC]], ptr %[[STRIDE_ARG]]
3342
+ // CHECK: %[[LASTITER_ARG:.*]] = getelementptr {{.*}}, ptr %[[ARGS]], i32 0, i32 6
3343
+ // CHECK: store ptr %[[LASTITER_ALLOC]], ptr %[[LASTITER_ARG]]
3344
+ // CHECK: call void @[[OUTLINED_DISTRIBUTE:.*]](ptr %[[ARGS]])
3345
+
3346
+ // CHECK: define internal void @[[OUTLINED_DISTRIBUTE]](ptr %[[ARGS_STRUCT:.*]])
3347
+ // CHECK: %[[LB_PTR:.*]] = getelementptr {{.*}}, ptr %[[ARGS_STRUCT]], i32 0, i32 3
3348
+ // CHECK: %[[LB:.*]] = load ptr, ptr %[[LB_PTR]]
3349
+ // CHECK: %[[UB_PTR:.*]] = getelementptr {{.*}}, ptr %[[ARGS_STRUCT]], i32 0, i32 4
3350
+ // CHECK: %[[UB:.*]] = load ptr, ptr %[[UB_PTR]]
3351
+ // CHECK: %[[STRIDE_PTR:.*]] = getelementptr {{.*}}, ptr %[[ARGS_STRUCT]], i32 0, i32 5
3352
+ // CHECK: %[[STRIDE:.*]] = load ptr, ptr %[[STRIDE_PTR]]
3353
+ // CHECK: %[[LASTITER_PTR:.*]] = getelementptr {{.*}}, ptr %[[ARGS_STRUCT]], i32 0, i32 6
3354
+ // CHECK: %[[LASTITER:.*]] = load ptr, ptr %[[LASTITER_PTR]]
3355
+ // CHECK: br label %[[DISTRIBUTE_BODY:.*]]
3356
+
3357
+ // CHECK: [[DISTRIBUTE_BODY]]:
3358
+ // CHECK-NEXT: br label %[[DISTRIBUTE_REGION:.*]]
3359
+
3360
+ // CHECK: [[DISTRIBUTE_REGION]]:
3361
+ // CHECK-NEXT: br label %[[WSLOOP_REGION:.*]]
3362
+
3363
+ // CHECK: [[WSLOOP_REGION]]:
3364
+ // CHECK: %omp_loop.tripcount = select {{.*}}
3365
+ // CHECK-NEXT: br label %[[PREHEADER:.*]]
3366
+
3367
+ // CHECK: [[PREHEADER]]:
3368
+ // CHECK: store i32 0, ptr %[[LB]]
3369
+ // CHECK: %[[TRIPCOUNT:.*]] = sub i32 %omp_loop.tripcount, 1
3370
+ // CHECK: store i32 %[[TRIPCOUNT]], ptr %[[UB]]
3371
+ // CHECK: store i32 1, ptr %[[STRIDE]]
3372
+ // CHECK: %[[TID:.*]] = call i32 @__kmpc_global_thread_num({{.*}})
3373
+ // CHECK: %[[DIST_UB:.*]] = alloca i32
3374
+ // CHECK: call void @__kmpc_dist_for_static_init_{{.*}}(ptr @{{.*}}, i32 %[[TID]], i32 34, ptr %[[LASTITER]], ptr %[[LB]], ptr %[[UB]], ptr %[[DIST_UB]], ptr %[[STRIDE]], i32 1, i32 0)
0 commit comments