146 lines · plain
1! This test checks lowering of OpenMP DISTRIBUTE PARALLEL DO SIMD composite2! constructs.3 4! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s5! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s6 7! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd_num_threads(8subroutine distribute_parallel_do_simd_num_threads()9 !$omp teams10 11 ! CHECK: omp.parallel num_threads({{.*}}) {12 ! CHECK: omp.distribute {13 ! CHECK-NEXT: omp.wsloop {14 ! CHECK-NEXT: omp.simd private({{.*}}) {15 ! CHECK-NEXT: omp.loop_nest16 !$omp distribute parallel do simd num_threads(10)17 do index_ = 1, 1018 end do19 !$omp end distribute parallel do simd20 21 !$omp end teams22end subroutine distribute_parallel_do_simd_num_threads23 24! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd_dist_schedule(25subroutine distribute_parallel_do_simd_dist_schedule()26 !$omp teams27 28 ! CHECK: omp.parallel {29 ! CHECK: omp.distribute dist_schedule_static dist_schedule_chunk_size({{.*}}) {30 ! CHECK-NEXT: omp.wsloop {31 ! CHECK-NEXT: omp.simd private({{.*}}) {32 ! CHECK-NEXT: omp.loop_nest33 !$omp distribute parallel do simd dist_schedule(static, 4)34 do index_ = 1, 1035 end do36 !$omp end distribute parallel do simd37 38 !$omp end teams39end subroutine distribute_parallel_do_simd_dist_schedule40 41! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd_schedule(42subroutine distribute_parallel_do_simd_schedule()43 !$omp teams44 45 ! CHECK: omp.parallel {46 ! CHECK: omp.distribute {47 ! CHECK-NEXT: omp.wsloop schedule(static = {{.*}}) {48 ! CHECK-NEXT: omp.simd private({{.*}}) {49 ! CHECK-NEXT: omp.loop_nest50 !$omp distribute parallel do simd schedule(static, 4)51 do index_ = 1, 1052 end do53 !$omp end distribute parallel do simd54 55 !$omp end teams56end subroutine distribute_parallel_do_simd_schedule57 58! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd_simdlen(59subroutine distribute_parallel_do_simd_simdlen()60 !$omp teams61 62 ! CHECK: omp.parallel {63 ! CHECK: omp.distribute {64 ! CHECK-NEXT: omp.wsloop {65 ! CHECK-NEXT: omp.simd simdlen(4) private({{.*}}) {66 ! CHECK-NEXT: omp.loop_nest67 !$omp distribute parallel do simd simdlen(4)68 do index_ = 1, 1069 end do70 !$omp end distribute parallel do simd71 72 !$omp end teams73end subroutine distribute_parallel_do_simd_simdlen74 75! CHECK-LABEL: func.func @_QPdistribute_parallel_do_simd_private(76subroutine distribute_parallel_do_simd_private()77 ! CHECK: %[[INDEX_ALLOC:.*]] = fir.alloca i3278 ! CHECK: %[[INDEX:.*]]:2 = hlfir.declare %[[INDEX_ALLOC]]79 ! CHECK: %[[X_ALLOC:.*]] = fir.alloca i6480 ! CHECK: %[[X:.*]]:2 = hlfir.declare %[[X_ALLOC]]81 integer(8) :: x82 83 ! CHECK: omp.teams {84 !$omp teams85 86 ! CHECK: omp.parallel {87 ! CHECK: omp.distribute {88 ! CHECK-NEXT: omp.wsloop {89 ! CHECK-NEXT: omp.simd private(@{{.*}} %[[X]]#0 -> %[[X_ARG:[^,]+]],90 ! CHECK-SAME: @{{.*}} %[[INDEX]]#0 -> %[[INDEX_ARG:.*]] : !fir.ref<i64>, !fir.ref<i32>) {91 ! CHECK-NEXT: omp.loop_nest92 ! CHECK: %[[X_PRIV:.*]]:2 = hlfir.declare %[[X_ARG]]93 ! CHECK: %[[INDEX_PRIV:.*]]:2 = hlfir.declare %[[INDEX_ARG]]94 !$omp distribute parallel do simd private(x)95 do index_ = 1, 1096 end do97 !$omp end distribute parallel do simd98 99 !$omp end teams100end subroutine distribute_parallel_do_simd_private101 102! CHECK-LABEL: func.func @_QPlastprivate_cond_in_composite_construct103subroutine lastprivate_cond_in_composite_construct(x_min, x_max, y_min, y_max)104implicit none105integer :: x_min,x_max,y_min,y_max106integer :: i,j107 108! CHECK: omp.target {{.*}} {109! CHECK: %[[X_MAX_MAPPED:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "{{.*}}x_max"}110! CHECK: omp.teams {111! CHECK: omp.parallel {112! CHECK: omp.distribute {113! CHECK: omp.wsloop {114! CHECK: omp.simd private({{.*}}) {115! CHECK: omp.loop_nest (%[[I_IV:.*]], %[[J_IV:.*]]) : i32 = ({{.*}}) to ({{.*}}) inclusive step ({{.*}}) collapse(2) {116! CHECK: %[[Y_MAX_PRIV:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "{{.*}}y_max"}117 118! CHECK: %[[I_UB:.*]] = fir.load %[[X_MAX_MAPPED]]#0 : !fir.ref<i32>119! CHECK: %[[I_STEP:.*]] = arith.constant 1 : i32120! CHECK: %[[J_UB:.*]] = fir.load %[[Y_MAX_PRIV]]#0 : !fir.ref<i32>121! CHECK: %[[J_STEP:.*]] = arith.constant 1 : i32122 123! CHECK: %[[VAL_55:.*]] = arith.addi %[[I_IV]], %[[I_STEP]] : i32124! CHECK: %[[VAL_56:.*]] = arith.constant 0 : i32125! CHECK: %[[VAL_57:.*]] = arith.cmpi slt, %[[I_STEP]], %[[VAL_56]] : i32126! CHECK: %[[VAL_58:.*]] = arith.cmpi slt, %[[VAL_55]], %[[I_UB]] : i32127! CHECK: %[[VAL_59:.*]] = arith.cmpi sgt, %[[VAL_55]], %[[I_UB]] : i32128! CHECK: %[[VAL_60:.*]] = arith.select %[[VAL_57]], %[[VAL_58]], %[[VAL_59]] : i1129 130! CHECK: %[[VAL_61:.*]] = arith.addi %[[J_IV]], %[[J_STEP]] : i32131! CHECK: %[[VAL_62:.*]] = arith.constant 0 : i32132! CHECK: %[[VAL_63:.*]] = arith.cmpi slt, %[[J_STEP]], %[[VAL_62]] : i32133! CHECK: %[[VAL_64:.*]] = arith.cmpi slt, %[[VAL_61]], %[[J_UB]] : i32134! CHECK: %[[VAL_65:.*]] = arith.cmpi sgt, %[[VAL_61]], %[[J_UB]] : i32135! CHECK: %[[VAL_66:.*]] = arith.select %[[VAL_63]], %[[VAL_64]], %[[VAL_65]] : i1136 137! CHECK: %[[LASTPRIV_CMP:.*]] = arith.andi %[[VAL_60]], %[[VAL_66]] : i1138! CHECK: fir.if %[[LASTPRIV_CMP]] {139 140!$omp target teams distribute parallel do simd collapse(2) private(y_max)141 do i=x_min,x_max142 do j=y_min,y_max143 enddo144 enddo145end subroutine146