1870f4421SPeixin-Qiao! This test checks lowering of OpenMP DO Directive(Worksharing) for different 2870f4421SPeixin-Qiao! types of loop iteration variable, lower bound, upper bound, and step. 3870f4421SPeixin-Qiao 4870f4421SPeixin-Qiao!REQUIRES: shell 5870f4421SPeixin-Qiao!RUN: bbc -fopenmp -emit-fir %s -o - 2>&1 | FileCheck %s 6870f4421SPeixin-Qiao 7870f4421SPeixin-Qiao!CHECK: OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed into 64 bits. 8870f4421SPeixin-Qiao 9870f4421SPeixin-Qiaoprogram wsloop_variable 10870f4421SPeixin-Qiao integer(kind=1) :: i1_lb, i1_ub 11870f4421SPeixin-Qiao integer(kind=2) :: i2, i2_ub, i2_s 12870f4421SPeixin-Qiao integer(kind=4) :: i4_s 13870f4421SPeixin-Qiao integer(kind=8) :: i8, i8_s 14870f4421SPeixin-Qiao integer(kind=16) :: i16, i16_lb 15870f4421SPeixin-Qiao real :: x 16870f4421SPeixin-Qiao 17dc4bf2c3SMats Petersson!CHECK: %[[TMP0:.*]] = arith.constant 1 : i32 18dc4bf2c3SMats Petersson!CHECK: %[[TMP1:.*]] = arith.constant 100 : i32 19dc4bf2c3SMats Petersson!CHECK: %[[TMP2:.*]] = fir.convert %[[TMP0]] : (i32) -> i64 20dc4bf2c3SMats Petersson!CHECK: %[[TMP3:.*]] = fir.convert %{{.*}} : (i8) -> i64 21dc4bf2c3SMats Petersson!CHECK: %[[TMP4:.*]] = fir.convert %{{.*}} : (i16) -> i64 22dc4bf2c3SMats Petersson!CHECK: %[[TMP5:.*]] = fir.convert %{{.*}} : (i128) -> i64 23dc4bf2c3SMats Petersson!CHECK: %[[TMP6:.*]] = fir.convert %[[TMP1]] : (i32) -> i64 24dc4bf2c3SMats Petersson!CHECK: %[[TMP7:.*]] = fir.convert %{{.*}} : (i32) -> i64 25*1795f8cdSPeixin-Qiao!CHECK: omp.wsloop for (%[[ARG0:.*]], %[[ARG1:.*]]) : i64 = (%[[TMP2]], %[[TMP5]]) to (%[[TMP3]], %[[TMP6]]) inclusive step (%[[TMP4]], %[[TMP7]]) { 26dc4bf2c3SMats Petersson!CHECK: fir.store %[[ARG0]] to %[[STORE_IV0:.*]] : !fir.ref<i64> 27dc4bf2c3SMats Petersson!CHECK: fir.store %[[ARG1]] to %[[STORE_IV1:.*]] : !fir.ref<i64> 28dc4bf2c3SMats Petersson!CHECK: %[[LOAD_IV0:.*]] = fir.load %[[STORE_IV0]] : !fir.ref<i64> 29dc4bf2c3SMats Petersson!CHECK: %[[LOAD_IV1:.*]] = fir.load %[[STORE_IV1]] : !fir.ref<i64> 30dc4bf2c3SMats Petersson!CHECK: %[[TMP10:.*]] = arith.addi %[[LOAD_IV0]], %[[LOAD_IV1]] : i64 31dc4bf2c3SMats Petersson!CHECK: %[[TMP11:.*]] = fir.convert %[[TMP10]] : (i64) -> f32 32dc4bf2c3SMats Petersson!CHECK: fir.store %[[TMP11]] to %{{.*}} : !fir.ref<f32> 33870f4421SPeixin-Qiao!CHECK: omp.yield 34870f4421SPeixin-Qiao!CHECK: } 35870f4421SPeixin-Qiao 36870f4421SPeixin-Qiao !$omp do collapse(2) 37870f4421SPeixin-Qiao do i2 = 1, i1_ub, i2_s 38870f4421SPeixin-Qiao do i8 = i16_lb, 100, i4_s 39870f4421SPeixin-Qiao x = i2 + i8 40870f4421SPeixin-Qiao end do 41870f4421SPeixin-Qiao end do 42870f4421SPeixin-Qiao !$omp end do 43870f4421SPeixin-Qiao 44dc4bf2c3SMats Petersson!CHECK: %[[TMP12:.*]] = arith.constant 1 : i32 45dc4bf2c3SMats Petersson!CHECK: %[[TMP13:.*]] = fir.convert %{{.*}} : (i8) -> i32 46dc4bf2c3SMats Petersson!CHECK: %[[TMP14:.*]] = fir.convert %{{.*}} : (i64) -> i32 47dc4bf2c3SMats Petersson!CHECK: omp.wsloop for (%[[ARG0:.*]]) : i32 = (%[[TMP12]]) to (%[[TMP13]]) inclusive step (%[[TMP14]]) { 48dc4bf2c3SMats Petersson!CHECK: fir.store %[[ARG0]] to %[[STORE3:.*]] : !fir.ref<i32> 49dc4bf2c3SMats Petersson!CHECK: %[[LOAD3:.*]] = fir.load %[[STORE3]] : !fir.ref<i32> 50dc4bf2c3SMats Petersson!CHECK: %[[TMP16:.*]] = fir.convert %[[LOAD3]] : (i32) -> f32 51dc4bf2c3SMats Petersson 52dc4bf2c3SMats Petersson!CHECK: fir.store %[[TMP16]] to %{{.*}} : !fir.ref<f32> 53870f4421SPeixin-Qiao!CHECK: omp.yield 54870f4421SPeixin-Qiao!CHECK: } 55870f4421SPeixin-Qiao 56870f4421SPeixin-Qiao !$omp do 57870f4421SPeixin-Qiao do i2 = 1, i1_ub, i8_s 58870f4421SPeixin-Qiao x = i2 59870f4421SPeixin-Qiao end do 60870f4421SPeixin-Qiao !$omp end do 61870f4421SPeixin-Qiao 62dc4bf2c3SMats Petersson!CHECK: %[[TMP17:.*]] = fir.convert %{{.*}} : (i8) -> i64 63dc4bf2c3SMats Petersson!CHECK: %[[TMP18:.*]] = fir.convert %{{.*}} : (i16) -> i64 64dc4bf2c3SMats Petersson!CHECK: %[[TMP19:.*]] = fir.convert %{{.*}} : (i32) -> i64 65dc4bf2c3SMats Petersson!CHECK: omp.wsloop for (%[[ARG1:.*]]) : i64 = (%[[TMP17]]) to (%[[TMP18]]) inclusive step (%[[TMP19]]) { 66dc4bf2c3SMats Petersson!CHECK: fir.store %[[ARG1]] to %[[STORE4:.*]] : !fir.ref<i64> 67dc4bf2c3SMats Petersson!CHECK: %[[LOAD4:.*]] = fir.load %[[STORE4]] : !fir.ref<i64> 68dc4bf2c3SMats Petersson!CHECK: %[[TMP21:.*]] = fir.convert %[[LOAD4]] : (i64) -> f32 69dc4bf2c3SMats Petersson!CHECK: fir.store %[[TMP21]] to %{{.*}} : !fir.ref<f32> 70870f4421SPeixin-Qiao!CHECK: omp.yield 71870f4421SPeixin-Qiao!CHECK: } 72870f4421SPeixin-Qiao 73870f4421SPeixin-Qiao !$omp do 74870f4421SPeixin-Qiao do i16 = i1_lb, i2_ub, i4_s 75870f4421SPeixin-Qiao x = i16 76870f4421SPeixin-Qiao end do 77870f4421SPeixin-Qiao !$omp end do 78870f4421SPeixin-Qiao 79870f4421SPeixin-Qiaoend program wsloop_variable 80870f4421SPeixin-Qiao 81870f4421SPeixin-Qiao!CHECK-LABEL: func.func @_QPwsloop_variable_sub() { 82870f4421SPeixin-Qiao!CHECK: %[[VAL_0:.*]] = fir.alloca i128 {bindc_name = "i16_lb", uniq_name = "_QFwsloop_variable_subEi16_lb"} 83870f4421SPeixin-Qiao!CHECK: %[[VAL_1:.*]] = fir.alloca i8 {bindc_name = "i1_ub", uniq_name = "_QFwsloop_variable_subEi1_ub"} 84870f4421SPeixin-Qiao!CHECK: %[[VAL_2:.*]] = fir.alloca i16 {bindc_name = "i2", uniq_name = "_QFwsloop_variable_subEi2"} 85870f4421SPeixin-Qiao!CHECK: %[[VAL_3:.*]] = fir.alloca i16 {bindc_name = "i2_s", uniq_name = "_QFwsloop_variable_subEi2_s"} 86870f4421SPeixin-Qiao!CHECK: %[[VAL_4:.*]] = fir.alloca i32 {bindc_name = "i4_s", uniq_name = "_QFwsloop_variable_subEi4_s"} 87870f4421SPeixin-Qiao!CHECK: %[[VAL_5:.*]] = fir.alloca i64 {bindc_name = "i8", uniq_name = "_QFwsloop_variable_subEi8"} 88870f4421SPeixin-Qiao!CHECK: %[[VAL_6:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFwsloop_variable_subEx"} 89870f4421SPeixin-Qiao!CHECK: %[[VAL_7:.*]] = arith.constant 1 : i32 90870f4421SPeixin-Qiao!CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_1]] : !fir.ref<i8> 91870f4421SPeixin-Qiao!CHECK: %[[VAL_9:.*]] = fir.load %[[VAL_3]] : !fir.ref<i16> 92870f4421SPeixin-Qiao!CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_8]] : (i8) -> i32 93870f4421SPeixin-Qiao!CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_9]] : (i16) -> i32 94dc4bf2c3SMats Petersson!CHECK: omp.wsloop for (%[[ARG0:.*]]) : i32 = (%[[VAL_7]]) to (%[[VAL_10]]) inclusive step (%[[VAL_11]]) { 95dc4bf2c3SMats Petersson!CHECK: fir.store %[[ARG0]] to %[[STORE_IV:.*]] : !fir.ref<i32> 96870f4421SPeixin-Qiao!CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_0]] : !fir.ref<i128> 97870f4421SPeixin-Qiao!CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_13]] : (i128) -> index 98870f4421SPeixin-Qiao!CHECK: %[[VAL_15:.*]] = arith.constant 100 : i32 99870f4421SPeixin-Qiao!CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> index 100870f4421SPeixin-Qiao!CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_4]] : !fir.ref<i32> 101870f4421SPeixin-Qiao!CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i32) -> index 102870f4421SPeixin-Qiao!CHECK: %[[VAL_19:.*]] = fir.do_loop %[[VAL_20:.*]] = %[[VAL_14]] to %[[VAL_16]] step %[[VAL_18]] -> index { 103870f4421SPeixin-Qiao!CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (index) -> i64 104870f4421SPeixin-Qiao!CHECK: fir.store %[[VAL_21]] to %[[VAL_5]] : !fir.ref<i64> 105dc4bf2c3SMats Petersson!CHECK: %[[LOAD_IV:.*]] = fir.load %[[STORE_IV]] : !fir.ref<i32> 106dc4bf2c3SMats Petersson!CHECK: %[[VAL_22:.*]] = fir.convert %[[LOAD_IV]] : (i32) -> i64 107870f4421SPeixin-Qiao!CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_5]] : !fir.ref<i64> 108870f4421SPeixin-Qiao!CHECK: %[[VAL_24:.*]] = arith.addi %[[VAL_22]], %[[VAL_23]] : i64 109870f4421SPeixin-Qiao!CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i64) -> f32 110870f4421SPeixin-Qiao!CHECK: fir.store %[[VAL_25]] to %[[VAL_6]] : !fir.ref<f32> 111870f4421SPeixin-Qiao!CHECK: %[[VAL_26:.*]] = arith.addi %[[VAL_20]], %[[VAL_18]] : index 112870f4421SPeixin-Qiao!CHECK: fir.result %[[VAL_26]] : index 113870f4421SPeixin-Qiao!CHECK: } 114870f4421SPeixin-Qiao!CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_28:.*]] : (index) -> i64 115870f4421SPeixin-Qiao!CHECK: fir.store %[[VAL_27]] to %[[VAL_5]] : !fir.ref<i64> 116870f4421SPeixin-Qiao!CHECK: omp.yield 117870f4421SPeixin-Qiao!CHECK: } 118870f4421SPeixin-Qiao!CHECK: return 119870f4421SPeixin-Qiao!CHECK: } 120870f4421SPeixin-Qiao 121870f4421SPeixin-Qiaosubroutine wsloop_variable_sub 122870f4421SPeixin-Qiao integer(kind=1) :: i1_ub 123870f4421SPeixin-Qiao integer(kind=2) :: i2, i2_s 124870f4421SPeixin-Qiao integer(kind=4) :: i4_s 125870f4421SPeixin-Qiao integer(kind=8) :: i8 126870f4421SPeixin-Qiao integer(kind=16) :: i16_lb 127870f4421SPeixin-Qiao real :: x 128870f4421SPeixin-Qiao 129870f4421SPeixin-Qiao !$omp do 130870f4421SPeixin-Qiao do i2 = 1, i1_ub, i2_s 131870f4421SPeixin-Qiao do i8 = i16_lb, 100, i4_s 132870f4421SPeixin-Qiao x = i2 + i8 133870f4421SPeixin-Qiao end do 134870f4421SPeixin-Qiao end do 135870f4421SPeixin-Qiao !$omp end do 136870f4421SPeixin-Qiao 137870f4421SPeixin-Qiaoend 138