Skip to content

Commit 29ba59e

Browse files
committed
Tests
1 parent 5177cad commit 29ba59e

File tree

3 files changed

+191
-13
lines changed

3 files changed

+191
-13
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
! This test checks lowering of OpenMP DO Directive (Worksharing)
2+
! with linear clause
3+
4+
! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - 2>&1 | FileCheck %s
5+
6+
!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFsimple_linearEx"}
7+
!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFsimple_linearEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
8+
!CHECK: %[[const:.*]] = arith.constant 1 : i32
9+
subroutine simple_linear
10+
implicit none
11+
integer :: x, y, i
12+
!CHECK: omp.wsloop linear(%[[X]]#0 = %[[const]] : !fir.ref<i32>) {{.*}}
13+
!$omp do linear(x)
14+
!CHECK: %[[LOAD:.*]] = fir.load %[[X]]#0 : !fir.ref<i32>
15+
!CHECK: %[[const:.*]] = arith.constant 2 : i32
16+
!CHECK: %[[RESULT:.*]] = arith.addi %[[LOAD]], %[[const]] : i32
17+
do i = 1, 10
18+
y = x + 2
19+
end do
20+
!$omp end do
21+
end subroutine
22+
23+
24+
!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_stepEx"}
25+
!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_stepEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
26+
subroutine linear_step
27+
implicit none
28+
integer :: x, y, i
29+
!CHECK: %[[const:.*]] = arith.constant 4 : i32
30+
!CHECK: omp.wsloop linear(%[[X]]#0 = %[[const]] : !fir.ref<i32>) {{.*}}
31+
!$omp do linear(x:4)
32+
!CHECK: %[[LOAD:.*]] = fir.load %[[X]]#0 : !fir.ref<i32>
33+
!CHECK: %[[const:.*]] = arith.constant 2 : i32
34+
!CHECK: %[[RESULT:.*]] = arith.addi %[[LOAD]], %[[const]] : i32
35+
do i = 1, 10
36+
y = x + 2
37+
end do
38+
!$omp end do
39+
end subroutine
40+
41+
!CHECK: %[[A_alloca:.*]] = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFlinear_exprEa"}
42+
!CHECK: %[[A:.*]]:2 = hlfir.declare %[[A_alloca]] {uniq_name = "_QFlinear_exprEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
43+
!CHECK: %[[X_alloca:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFlinear_exprEx"}
44+
!CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_alloca]] {uniq_name = "_QFlinear_exprEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
45+
subroutine linear_expr
46+
implicit none
47+
integer :: x, y, i, a
48+
!CHECK: %[[LOAD_A:.*]] = fir.load %[[A]]#0 : !fir.ref<i32>
49+
!CHECK: %[[const:.*]] = arith.constant 4 : i32
50+
!CHECK: %[[LINEAR_EXPR:.*]] = arith.addi %[[LOAD_A]], %[[const]] : i32
51+
!CHECK: omp.wsloop linear(%[[X]]#0 = %[[LINEAR_EXPR]] : !fir.ref<i32>) {{.*}}
52+
!$omp do linear(x:a+4)
53+
do i = 1, 10
54+
y = x + 2
55+
end do
56+
!$omp end do
57+
end subroutine

mlir/test/Target/LLVMIR/openmp-llvm.mlir

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
362453
llvm.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
699832
llvm.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 {

mlir/test/Target/LLVMIR/openmp-todo.mlir

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ llvm.func @sections_private(%x : !llvm.ptr) {
117117
// -----
118118

119119
llvm.func @simd_linear(%lb : i32, %ub : i32, %step : i32, %x : !llvm.ptr) {
120-
// expected-error@below {{not yet implemented: Unhandled clause linear in omp.simd operation}}
120+
// expected-error@below {{not yet implemented: linear clause support for non alloca linear variables}}
121121
// expected-error@below {{LLVM Translation failed for operation: omp.simd}}
122122
omp.simd linear(%x = %step : !llvm.ptr) {
123123
omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) {
@@ -467,18 +467,6 @@ llvm.func @wsloop_allocate(%lb : i32, %ub : i32, %step : i32, %x : !llvm.ptr) {
467467

468468
// -----
469469

470-
llvm.func @wsloop_linear(%lb : i32, %ub : i32, %step : i32, %x : !llvm.ptr) {
471-
// expected-error@below {{not yet implemented: Unhandled clause linear in omp.wsloop operation}}
472-
// expected-error@below {{LLVM Translation failed for operation: omp.wsloop}}
473-
omp.wsloop linear(%x = %step : !llvm.ptr) {
474-
omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) {
475-
omp.yield
476-
}
477-
}
478-
llvm.return
479-
}
480-
481-
// -----
482470
llvm.func @wsloop_order(%lb : i32, %ub : i32, %step : i32) {
483471
// expected-error@below {{not yet implemented: Unhandled clause order in omp.wsloop operation}}
484472
// expected-error@below {{LLVM Translation failed for operation: omp.wsloop}}

0 commit comments

Comments
 (0)