@@ -358,6 +358,97 @@ llvm.func @wsloop_simple(%arg0: !llvm.ptr) {
358358
359359// -----
360360
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+
361452// CHECK-LABEL: @wsloop_inclusive_1
362453llvm.func @wsloop_inclusive_1 (%arg0: !llvm.ptr ) {
363454 %0 = llvm.mlir.constant (42 : index ) : i64
@@ -695,6 +786,48 @@ llvm.func @simd_simple(%lb : i64, %ub : i64, %step : i64, %arg0: !llvm.ptr) {
695786
696787// -----
697788
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+
698831// CHECK-LABEL: @simd_simple_multiple
699832llvm.func @simd_simple_multiple (%lb1 : i64 , %ub1 : i64 , %step1 : i64 , %lb2 : i64 , %ub2 : i64 , %step2 : i64 , %arg0: !llvm.ptr , %arg1: !llvm.ptr ) {
700833 omp.simd {
0 commit comments