1! This test checks lowering of OpenMP DO Directive (Worksharing). 2 3! RUN: bbc -fopenmp -emit-fir %s -o - | FileCheck %s 4 5! CHECK-LABEL: func @_QPsimple_parallel_do() 6subroutine simple_parallel_do 7 integer :: i 8 ! CHECK: omp.parallel 9 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i32 10 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i32 11 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i32 12 ! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) 13 !$OMP PARALLEL DO 14 do i=1, 9 15 ! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32> 16 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32> 17 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1 18 print*, i 19 end do 20 ! CHECK: omp.yield 21 ! CHECK: omp.terminator 22 !$OMP END PARALLEL DO 23end subroutine 24 25! CHECK-LABEL: func @_QPparallel_do_with_parallel_clauses 26! CHECK-SAME: %[[COND_REF:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"}, %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"} 27subroutine parallel_do_with_parallel_clauses(cond, nt) 28 logical :: cond 29 integer :: nt 30 integer :: i 31 ! CHECK: %[[COND:.*]] = fir.load %[[COND_REF]] : !fir.ref<!fir.logical<4>> 32 ! CHECK: %[[COND_CVT:.*]] = fir.convert %[[COND]] : (!fir.logical<4>) -> i1 33 ! CHECK: %[[NT:.*]] = fir.load %[[NT_REF]] : !fir.ref<i32> 34 ! CHECK: omp.parallel if(%[[COND_CVT]] : i1) num_threads(%[[NT]] : i32) proc_bind(close) 35 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i32 36 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i32 37 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i32 38 ! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) 39 !$OMP PARALLEL DO IF(cond) NUM_THREADS(nt) PROC_BIND(close) 40 do i=1, 9 41 ! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32> 42 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32> 43 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1 44 print*, i 45 end do 46 ! CHECK: omp.yield 47 ! CHECK: omp.terminator 48 !$OMP END PARALLEL DO 49end subroutine 50 51! CHECK-LABEL: func @_QPparallel_do_with_clauses 52! CHECK-SAME: %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"} 53subroutine parallel_do_with_clauses(nt) 54 integer :: nt 55 integer :: i 56 ! CHECK: %[[NT:.*]] = fir.load %[[NT_REF]] : !fir.ref<i32> 57 ! CHECK: omp.parallel num_threads(%[[NT]] : i32) 58 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i32 59 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i32 60 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i32 61 ! CHECK: omp.wsloop schedule(dynamic) for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) 62 !$OMP PARALLEL DO NUM_THREADS(nt) SCHEDULE(dynamic) 63 do i=1, 9 64 ! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32> 65 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32> 66 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1 67 print*, i 68 end do 69 ! CHECK: omp.yield 70 ! CHECK: omp.terminator 71 !$OMP END PARALLEL DO 72end subroutine 73 74! CHECK-LABEL: func @_QPparallel_do_with_privatisation_clauses 75! CHECK-SAME: %[[COND_REF:.*]]: !fir.ref<!fir.logical<4>> {fir.bindc_name = "cond"}, %[[NT_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "nt"} 76subroutine parallel_do_with_privatisation_clauses(cond,nt) 77 logical :: cond 78 integer :: nt 79 integer :: i 80 ! CHECK: omp.parallel 81 ! CHECK: %[[PRIVATE_COND_REF:.*]] = fir.alloca !fir.logical<4> {bindc_name = "cond", pinned, uniq_name = "_QFparallel_do_with_privatisation_clausesEcond"} 82 ! CHECK: %[[PRIVATE_NT_REF:.*]] = fir.alloca i32 {bindc_name = "nt", pinned, uniq_name = "_QFparallel_do_with_privatisation_clausesEnt"} 83 ! CHECK: %[[NT_VAL:.*]] = fir.load %[[NT_REF]] : !fir.ref<i32> 84 ! CHECK: fir.store %[[NT_VAL]] to %[[PRIVATE_NT_REF]] : !fir.ref<i32> 85 ! CHECK: %[[WS_LB:.*]] = arith.constant 1 : i32 86 ! CHECK: %[[WS_UB:.*]] = arith.constant 9 : i32 87 ! CHECK: %[[WS_STEP:.*]] = arith.constant 1 : i32 88 ! CHECK: omp.wsloop for (%[[I:.*]]) : i32 = (%[[WS_LB]]) to (%[[WS_UB]]) inclusive step (%[[WS_STEP]]) 89 !$OMP PARALLEL DO PRIVATE(cond) FIRSTPRIVATE(nt) 90 do i=1, 9 91 ! CHECK: fir.store %[[I]] to %[[IV_ADDR:.*]] : !fir.ref<i32> 92 ! CHECK: %[[LOAD_IV:.*]] = fir.load %[[IV_ADDR]] : !fir.ref<i32> 93 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[LOAD_IV]]) : (!fir.ref<i8>, i32) -> i1 94 ! CHECK: %[[PRIVATE_COND_VAL:.*]] = fir.load %[[PRIVATE_COND_REF]] : !fir.ref<!fir.logical<4>> 95 ! CHECK: %[[PRIVATE_COND_VAL_CVT:.*]] = fir.convert %[[PRIVATE_COND_VAL]] : (!fir.logical<4>) -> i1 96 ! CHECK: fir.call @_FortranAioOutputLogical({{.*}}, %[[PRIVATE_COND_VAL_CVT]]) : (!fir.ref<i8>, i1) -> i1 97 ! CHECK: %[[PRIVATE_NT_VAL:.*]] = fir.load %[[PRIVATE_NT_REF]] : !fir.ref<i32> 98 ! CHECK: fir.call @_FortranAioOutputInteger32({{.*}}, %[[PRIVATE_NT_VAL]]) : (!fir.ref<i8>, i32) -> i1 99 print*, i, cond, nt 100 end do 101 ! CHECK: omp.yield 102 ! CHECK: omp.terminator 103 !$OMP END PARALLEL DO 104end subroutine 105