@@ -358,6 +358,97 @@ llvm.func @wsloop_simple(%arg0: !llvm.ptr) {
358
358
359
359
// -----
360
360
361
+ // CHECK-LABEL: wsloop_linear
362
+
363
+ // CHECK: {{.*}} = alloca i32, i64 1, align 4
364
+ // CHECK: %[[Y:.*]] = alloca i32, i64 1, align 4
365
+ // CHECK: %[[X:.*]] = alloca i32, i64 1, align 4
366
+
367
+ // CHECK: entry:
368
+ // CHECK: %[[LINEAR_VAR:.*]] = alloca i32, align 4
369
+ // CHECK: %[[LINEAR_RESULT:.*]] = alloca i32, align 4
370
+ // CHECK: br label %omp_loop.preheader
371
+
372
+
373
+ // CHECK: omp_loop.preheader:
374
+ // CHECK: %[[LOAD:.*]] = load i32, ptr %[[X]], align 4
375
+ // CHECK: store i32 %[[LOAD]], ptr %[[LINEAR_VAR]], align 4
376
+ // CHECK: %omp_global_thread_num = call i32 @__kmpc_global_thread_num(ptr @2)
377
+ // CHECK: call void @__kmpc_barrier(ptr @1, i32 %omp_global_thread_num)
378
+
379
+ // CHECK: omp_loop.body:
380
+ // CHECK: %[[LOOP_IV:.*]] = add i32 %omp_loop.iv, {{.*}}
381
+ // CHECK: %[[LINEAR_LOAD:.*]] = load i32, ptr %[[LINEAR_VAR]], align 4
382
+ // CHECK: %[[MUL:.*]] = mul i32 %[[LOOP_IV]], 1
383
+ // CHECK: %[[ADD:.*]] = add i32 %[[LINEAR_LOAD]], %[[MUL]]
384
+ // CHECK: store i32 %[[ADD]], ptr %[[LINEAR_RESULT]], align 4
385
+ // CHECK: br label %omp.loop_nest.region
386
+
387
+ // CHECK: omp.loop_nest.region:
388
+ // CHECK: %[[LINEAR_LOAD:.*]] = load i32, ptr %[[LINEAR_RESULT]], align 4
389
+ // CHECK: %[[ADD:.*]] = add i32 %[[LINEAR_LOAD]], 2
390
+ // CHECK: store i32 %[[ADD]], ptr %[[Y]], align 4
391
+
392
+ // CHECK: omp_loop.exit:
393
+ // CHECK: call void @__kmpc_for_static_fini(ptr @2, i32 %omp_global_thread_num4)
394
+ // CHECK: %omp_global_thread_num5 = call i32 @__kmpc_global_thread_num(ptr @2)
395
+ // CHECK: call void @__kmpc_barrier(ptr @3, i32 %omp_global_thread_num5)
396
+ // CHECK: br label %omp_loop.linear_finalization
397
+
398
+
399
+ // CHECK: omp_loop.linear_finalization:
400
+ // CHECK: %[[LAST_ITER:.*]] = load i32, ptr %p.lastiter, align 4
401
+ // CHECK: %[[CMP:.*]] = icmp ne i32 %[[LAST_ITER]], 0
402
+ // CHECK: br i1 %[[CMP]], label %omp_loop.linear_lastiter_exit, label %omp_loop.linear_exit
403
+
404
+ // CHECK: omp_loop.linear_lastiter_exit:
405
+ // CHECK: %[[LINEAR_RESULT_LOAD:.*]] = load i32, ptr %[[LINEAR_RESULT]], align 4
406
+ // CHECK: store i32 %[[LINEAR_RESULT_LOAD]], ptr %[[X]], align 4
407
+ // CHECK: br label %omp_loop.linear_exit
408
+
409
+
410
+ // CHECK: omp_loop.linear_exit:
411
+ // CHECK: %omp_global_thread_num6 = call i32 @__kmpc_global_thread_num(ptr @2)
412
+ // CHECK: call void @__kmpc_barrier(ptr @1, i32 %omp_global_thread_num6)
413
+ // CHECK: br label %omp_loop.after
414
+
415
+ llvm.func @wsloop_linear () {
416
+ %0 = llvm.mlir.constant (1 : i64 ) : i64
417
+ %1 = llvm.alloca %0 x i32 {bindc_name = " i" , pinned } : (i64 ) -> !llvm.ptr
418
+ %2 = llvm.mlir.constant (1 : i64 ) : i64
419
+ %3 = llvm.alloca %2 x i32 {bindc_name = " y" } : (i64 ) -> !llvm.ptr
420
+ %4 = llvm.mlir.constant (1 : i64 ) : i64
421
+ %5 = llvm.alloca %4 x i32 {bindc_name = " x" } : (i64 ) -> !llvm.ptr
422
+ %6 = llvm.mlir.constant (1 : i64 ) : i64
423
+ %7 = llvm.alloca %6 x i32 {bindc_name = " i" } : (i64 ) -> !llvm.ptr
424
+ %8 = llvm.mlir.constant (2 : i32 ) : i32
425
+ %9 = llvm.mlir.constant (10 : i32 ) : i32
426
+ %10 = llvm.mlir.constant (1 : i32 ) : i32
427
+ %11 = llvm.mlir.constant (1 : i64 ) : i64
428
+ %12 = llvm.mlir.constant (1 : i64 ) : i64
429
+ %13 = llvm.mlir.constant (1 : i64 ) : i64
430
+ %14 = llvm.mlir.constant (1 : i64 ) : i64
431
+ omp.wsloop linear (%5 = %10 : !llvm.ptr ) {
432
+ omp.loop_nest (%arg0 ) : i32 = (%10 ) to (%9 ) inclusive step (%10 ) {
433
+ llvm.store %arg0 , %1 : i32 , !llvm.ptr
434
+ %15 = llvm.load %5 : !llvm.ptr -> i32
435
+ %16 = llvm.add %15 , %8 : i32
436
+ llvm.store %16 , %3 : i32 , !llvm.ptr
437
+ %17 = llvm.add %arg0 , %10 : i32
438
+ %18 = llvm.icmp " sgt" %17 , %9 : i32
439
+ llvm.cond_br %18 , ^bb1 , ^bb2
440
+ ^bb1 : // pred: ^bb0
441
+ llvm.store %17 , %1 : i32 , !llvm.ptr
442
+ llvm.br ^bb2
443
+ ^bb2 : // 2 preds: ^bb0, ^bb1
444
+ omp.yield
445
+ }
446
+ }
447
+ llvm.return
448
+ }
449
+
450
+ // -----
451
+
361
452
// CHECK-LABEL: @wsloop_inclusive_1
362
453
llvm.func @wsloop_inclusive_1 (%arg0: !llvm.ptr ) {
363
454
%0 = llvm.mlir.constant (42 : index ) : i64
@@ -695,6 +786,48 @@ llvm.func @simd_simple(%lb : i64, %ub : i64, %step : i64, %arg0: !llvm.ptr) {
695
786
696
787
// -----
697
788
789
+ // CHECK-LABEL: @simd_linear
790
+
791
+ // CHECK: entry:
792
+ // CHECK: %[[LINEAR_VAR:.*]] = alloca i32, align 4
793
+ // CHECK: %[[LINEAR_RESULT:.*]] = alloca i32, align 4
794
+ // CHECK: br label %omp.simd.region
795
+
796
+ // CHECK: omp.simd.region:
797
+ // CHECK: br label %omp_loop.preheader
798
+
799
+ // CHECK: omp_loop.preheader:
800
+ // CHECK: %[[ORIG_VAL:.*]] = load i32, ptr {{.*}}, align 4
801
+ // CHECK: store i32 %[[ORIG_VAL]], ptr %[[LINEAR_VAR]], align 4
802
+ // CHECK: br label %omp_loop.header
803
+
804
+ // CHECK: omp_loop.body:
805
+ // CHECK: %[[LINEAR_LOAD:.*]] = load i32, ptr %[[LINEAR_VAR]], align 4
806
+ // CHECK: %[[MUL:.*]] = mul i32 %omp_loop.iv, 2
807
+ // CHECK: %[[ADD:.*]] = add i32 %[[LINEAR_LOAD]], %[[MUL]]
808
+ // CHECK: store i32 %[[ADD]], ptr %[[LINEAR_RESULT]], align 4
809
+ // CHECK: br label %omp.loop_nest.region
810
+
811
+ llvm.func @simd_linear () {
812
+ %0 = llvm.mlir.constant (1 : i64 ) : i64
813
+ %1 = llvm.alloca %0 x i32 {bindc_name = " x" } : (i64 ) -> !llvm.ptr
814
+ %2 = llvm.mlir.constant (1 : i64 ) : i64
815
+ %3 = llvm.alloca %2 x i32 {bindc_name = " i" } : (i64 ) -> !llvm.ptr
816
+ %4 = llvm.mlir.constant (10 : i32 ) : i32
817
+ %5 = llvm.mlir.constant (1 : i32 ) : i32
818
+ %6 = llvm.mlir.constant (2 : i32 ) : i32
819
+ %7 = llvm.mlir.constant (1 : i64 ) : i64
820
+ %8 = llvm.mlir.constant (1 : i64 ) : i64
821
+ omp.simd linear (%1 = %6 : !llvm.ptr ) {
822
+ omp.loop_nest (%arg1 ) : i32 = (%5 ) to (%4 ) inclusive step (%5 ) {
823
+ omp.yield
824
+ }
825
+ }
826
+ llvm.return
827
+ }
828
+
829
+ // -----
830
+
698
831
// CHECK-LABEL: @simd_simple_multiple
699
832
llvm.func @simd_simple_multiple (%lb1 : i64 , %ub1 : i64 , %step1 : i64 , %lb2 : i64 , %ub2 : i64 , %step2 : i64 , %arg0: !llvm.ptr , %arg1: !llvm.ptr ) {
700
833
omp.simd {
0 commit comments