brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.7 KiB · d353528 Raw
274 lines · plain
1! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false -o - %s | FileCheck %s2! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -flang-deprecated-no-hlfir -o - %s | FileCheck %s3! RUN: %flang_fc1 -mllvm --use-desc-for-alloc=false -emit-fir -flang-deprecated-no-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW4 5! Simple tests for structured ordered loops with loop-control.6! Tests the structure of the loop, storage to index variable and return and7! storage of the final value of the index variable.8 9! NO-NSW-NOT: overflow<nsw>10 11! Test a simple loop with the final value of the index variable read outside the loop12! CHECK-LABEL: simple_loop13subroutine simple_loop14  ! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_loopEi"}15  integer :: i16 17  ! CHECK: %[[C1:.*]] = arith.constant 1 : i3218  ! CHECK: %[[C1_CVT:.*]] = fir.convert %c1_i32 : (i32) -> index19  ! CHECK: %[[C5:.*]] = arith.constant 5 : i3220  ! CHECK: %[[C5_CVT:.*]] = fir.convert %c5_i32 : (i32) -> index21  ! CHECK: %[[C1:.*]] = arith.constant 1 : index22  ! CHECK: %[[LB:.*]] = fir.convert %[[C1_CVT]] : (index) -> i3223  ! CHECK: %[[LI_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =24  ! CHECK-SAME: %[[C1_CVT]] to %[[C5_CVT]] step %[[C1]]25  ! CHECK-SAME: iter_args(%[[IV:.*]] = %[[LB]]) -> (i32) {26  do i=1,527  ! CHECK:   fir.store %[[IV]] to %[[I_REF]] : !fir.ref<i32>28  ! CHECK:   %[[STEPCAST:.*]] = fir.convert %[[C1]] : (index) -> i3229  ! CHECK:   %[[IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>30  ! CHECK:   %[[IVINC:.*]] = arith.addi %[[IVLOAD]], %[[STEPCAST]] overflow<nsw> : i3231  ! CHECK:  fir.result %[[IVINC]] : i3232  ! CHECK: }33  end do34  ! CHECK: fir.store %[[LI_RES]] to %[[I_REF]] : !fir.ref<i32>35  ! CHECK: %[[I:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>36  ! CHECK: %{{.*}} = fir.call @_FortranAioOutputInteger32(%{{.*}}, %[[I]]) {{.*}}: (!fir.ref<i8>, i32) -> i137  print *, i38end subroutine39 40! Test a 2-nested loop with a body composed of a reduction. Values are read from a 2d array.41! CHECK-LABEL: nested_loop42subroutine nested_loop43  ! CHECK: %[[ARR_REF:.*]] = fir.alloca !fir.array<5x5xi32> {bindc_name = "arr", uniq_name = "_QFnested_loopEarr"}44  ! CHECK: %[[ASUM_REF:.*]] = fir.alloca i32 {bindc_name = "asum", uniq_name = "_QFnested_loopEasum"}45  ! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_loopEi"}46  ! CHECK: %[[J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_loopEj"}47  integer :: asum, arr(5,5)48  integer :: i, j49  asum = 050  ! CHECK: %[[S_I:.*]] = arith.constant 1 : i3251  ! CHECK: %[[S_I_CVT:.*]] = fir.convert %[[S_I]] : (i32) -> index52  ! CHECK: %[[E_I:.*]] = arith.constant 5 : i3253  ! CHECK: %[[E_I_CVT:.*]] = fir.convert %[[E_I]] : (i32) -> index54  ! CHECK: %[[ST_I:.*]] = arith.constant 1 : index55  ! CHECK: %[[I_LB:.*]] = fir.convert %[[S_I_CVT]] : (index) -> i3256  ! CHECK: %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =57  ! CHECK-SAME: %[[S_I_CVT]] to %[[E_I_CVT]] step %[[ST_I]]58  ! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {59  do i=1,560    ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>61    ! CHECK: %[[S_J:.*]] = arith.constant 1 : i3262    ! CHECK: %[[S_J_CVT:.*]] = fir.convert %[[S_J]] : (i32) -> index63    ! CHECK: %[[E_J:.*]] = arith.constant 5 : i3264    ! CHECK: %[[E_J_CVT:.*]] = fir.convert %[[E_J]] : (i32) -> index65    ! CHECK: %[[ST_J:.*]] = arith.constant 1 : index66    ! CHECK: %[[J_LB:.*]] = fir.convert %[[S_J_CVT]] : (index) -> i3267    ! CHECK: %[[J_RES:.*]] = fir.do_loop %[[LJ:[^ ]*]] =68    ! CHECK-SAME: %[[S_J_CVT]] to %[[E_J_CVT]] step %[[ST_J]]69    ! CHECK-SAME: iter_args(%[[J_IV:.*]] = %[[J_LB]]) -> (i32) {70    do j=1,571      ! CHECK: fir.store %[[J_IV]] to %[[J_REF]] : !fir.ref<i32>72      ! CHECK: %[[ASUM:.*]] = fir.load %[[ASUM_REF]] : !fir.ref<i32>73      ! CHECK: %[[I:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>74      ! CHECK: %[[I_CVT:.*]] = fir.convert %[[I]] : (i32) -> i6475      ! CHECK: %[[C1_I:.*]] = arith.constant 1 : i6476      ! CHECK: %[[I_INDX:.*]] = arith.subi %[[I_CVT]], %[[C1_I]] : i6477      ! CHECK: %[[J:.*]] = fir.load %[[J_REF]] : !fir.ref<i32>78      ! CHECK: %[[J_CVT:.*]] = fir.convert %[[J]] : (i32) -> i6479      ! CHECK: %[[C1_J:.*]] = arith.constant 1 : i6480      ! CHECK: %[[J_INDX:.*]] = arith.subi %[[J_CVT]], %[[C1_J]] : i6481      ! CHECK: %[[ARR_IJ_REF:.*]] = fir.coordinate_of %[[ARR_REF]], %[[I_INDX]], %[[J_INDX]] : (!fir.ref<!fir.array<5x5xi32>>, i64, i64) -> !fir.ref<i32>82      ! CHECK: %[[ARR_VAL:.*]] = fir.load %[[ARR_IJ_REF]] : !fir.ref<i32>83      ! CHECK: %[[ASUM_NEW:.*]] = arith.addi %[[ASUM]], %[[ARR_VAL]] : i3284      ! CHECK: fir.store %[[ASUM_NEW]] to %[[ASUM_REF]] : !fir.ref<i32>85      asum = asum + arr(i,j)86      ! CHECK: %[[J_STEPCAST:.*]] = fir.convert %[[ST_J]] : (index) -> i3287      ! CHECK: %[[J_IVLOAD:.*]] = fir.load %[[J_REF]] : !fir.ref<i32>88      ! CHECK: %[[J_IVINC:.*]] = arith.addi %[[J_IVLOAD]], %[[J_STEPCAST]] overflow<nsw> : i3289      ! CHECK: fir.result %[[J_IVINC]] : i3290    ! CHECK: }91    end do92    ! CHECK: fir.store %[[J_RES]] to %[[J_REF]] : !fir.ref<i32>93    ! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_I]] : (index) -> i3294    ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>95    ! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i3296    ! CHECK: fir.result %[[I_IVINC]] : i3297  ! CHECK: }98  end do99  ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>100end subroutine101 102! Test a downcounting loop103! CHECK-LABEL: down_counting_loop104subroutine down_counting_loop()105  integer :: i106  ! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFdown_counting_loopEi"}107 108  ! CHECK: %[[C5:.*]] = arith.constant 5 : i32109  ! CHECK: %[[C5_CVT:.*]] = fir.convert %[[C5]] : (i32) -> index110  ! CHECK: %[[C1:.*]] = arith.constant 1 : i32111  ! CHECK: %[[C1_CVT:.*]] = fir.convert %[[C1]] : (i32) -> index112  ! CHECK: %[[CMINUS1:.*]] = arith.constant -1 : i32113  ! CHECK: %[[CMINUS1_STEP_CVT:.*]] = fir.convert %[[CMINUS1]] : (i32) -> index114  ! CHECK: %[[I_LB:.*]] = fir.convert %[[C5_CVT]] : (index) -> i32115  ! CHECK: %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =116  ! CHECK-SAME: %[[C5_CVT]] to %[[C1_CVT]] step %[[CMINUS1_STEP_CVT]]117  ! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {118  do i=5,1,-1119  ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>120  ! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[CMINUS1_STEP_CVT]] : (index) -> i32121  ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>122  ! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32123  ! CHECK: fir.result %[[I_IVINC]] : i32124  ! CHECK: }125  end do126  ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>127end subroutine128 129! Test a general loop with a variable step130! CHECK-LABEL: loop_with_variable_step131! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}, %[[E_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "e"}, %[[ST_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "st"}) {132subroutine loop_with_variable_step(s,e,st)133  integer :: s, e, st134  ! CHECK: %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFloop_with_variable_stepEi"}135  ! CHECK: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<i32>136  ! CHECK: %[[S_CVT:.*]] = fir.convert %[[S]] : (i32) -> index137  ! CHECK: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<i32>138  ! CHECK: %[[E_CVT:.*]] = fir.convert %[[E]] : (i32) -> index139  ! CHECK: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<i32>140  ! CHECK: %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i32) -> index141  ! CHECK: %[[I_LB:.*]] = fir.convert %[[S_CVT]] : (index) -> i32142  ! CHECK: %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =143  ! CHECK-SAME: %[[S_CVT]] to %[[E_CVT]] step %[[ST_CVT]]144  ! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {145  do i=s,e,st146  ! CHECK:  fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i32>147  ! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_CVT]] : (index) -> i32148  ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i32>149  ! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32150  ! CHECK:  fir.result %[[I_IVINC]] : i32151  ! CHECK: }152  end do153  ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i32>154end subroutine155 156! Test usage of pointer variables as index, start, end and step variables157! CHECK-LABEL: loop_with_pointer_variables158! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "s", fir.target}, %[[E_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "e", fir.target}, %[[ST_REF:.*]]: !fir.ref<i32> {fir.bindc_name = "st", fir.target}) {159subroutine loop_with_pointer_variables(s,e,st)160! CHECK:  %[[E_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEeptr.addr"}161! CHECK:  %[[I_REF:.*]] = fir.alloca i32 {bindc_name = "i", fir.target, uniq_name = "_QFloop_with_pointer_variablesEi"}162! CHECK:  %[[I_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEiptr.addr"}163! CHECK:  %[[S_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEsptr.addr"}164! CHECK:  %[[ST_PTR_REF:.*]] = fir.alloca !fir.ptr<i32> {uniq_name = "_QFloop_with_pointer_variablesEstptr.addr"}165  integer, target :: i166  integer, target :: s, e, st167  integer, pointer :: iptr, sptr, eptr, stptr168 169! CHECK:  %[[I_PTR:.*]] = fir.convert %[[I_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>170! CHECK:  fir.store %[[I_PTR]] to %[[I_PTR_REF]] : !fir.ref<!fir.ptr<i32>>171! CHECK:  %[[S_PTR:.*]] = fir.convert %[[S_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>172! CHECK:  fir.store %[[S_PTR]] to %[[S_PTR_REF]] : !fir.ref<!fir.ptr<i32>>173! CHECK:  %[[E_PTR:.*]] = fir.convert %[[E_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>174! CHECK:  fir.store %[[E_PTR]] to %[[E_PTR_REF]] : !fir.ref<!fir.ptr<i32>>175! CHECK:  %[[ST_PTR:.*]] = fir.convert %[[ST_REF]] : (!fir.ref<i32>) -> !fir.ptr<i32>176! CHECK:  fir.store %[[ST_PTR]] to %[[ST_PTR_REF]] : !fir.ref<!fir.ptr<i32>>177  iptr => i178  sptr => s179  eptr => e180  stptr => st181 182! CHECK:  %[[I_PTR:.*]] = fir.load %[[I_PTR_REF]] : !fir.ref<!fir.ptr<i32>>183! CHECK:  %[[S_PTR:.*]] = fir.load %[[S_PTR_REF]] : !fir.ref<!fir.ptr<i32>>184! CHECK:  %[[S:.*]] = fir.load %[[S_PTR]] : !fir.ptr<i32>185! CHECK:  %[[S_CVT:.*]] = fir.convert %[[S]] : (i32) -> index186! CHECK:  %[[E_PTR:.*]] = fir.load %[[E_PTR_REF]] : !fir.ref<!fir.ptr<i32>>187! CHECK:  %[[E:.*]] = fir.load %[[E_PTR]] : !fir.ptr<i32>188! CHECK:  %[[E_CVT:.*]] = fir.convert %[[E]] : (i32) -> index189! CHECK:  %[[ST_PTR:.*]] = fir.load %[[ST_PTR_REF]] : !fir.ref<!fir.ptr<i32>>190! CHECK:  %[[ST:.*]] = fir.load %[[ST_PTR]] : !fir.ptr<i32>191! CHECK:  %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i32) -> index192! CHECK:  %[[I_LB:.*]] = fir.convert %[[S_CVT]] : (index) -> i32193! CHECK:  %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =194! CHECK-SAME: %[[S_CVT]] to %[[E_CVT]] step %[[ST_CVT]]195! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i32) {196  do iptr=sptr,eptr,stptr197! CHECK:    fir.store %[[I_IV]] to %[[I_PTR]] : !fir.ptr<i32>198! CHECK:    %[[I_STEPCAST:.*]] = fir.convert %[[ST_CVT]] : (index) -> i32199! CHECK:    %[[I_IVLOAD:.*]] = fir.load %[[I_PTR]] : !fir.ptr<i32>200! CHECK:    %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i32201! CHECK:    fir.result %[[I_IVINC]] : i32202  end do203! CHECK:  }204! CHECK:  fir.store %[[I_RES]] to %[[I_PTR]] : !fir.ptr<i32>205end subroutine206 207! Test usage of non-default integer kind for loop control and loop index variable208! CHECK-LABEL: loop_with_non_default_integer209! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "s"}, %[[E_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "e"}, %[[ST_REF:.*]]: !fir.ref<i64> {fir.bindc_name = "st"}) {210subroutine loop_with_non_default_integer(s,e,st)211  ! CHECK: %[[I_REF:.*]] = fir.alloca i64 {bindc_name = "i", uniq_name = "_QFloop_with_non_default_integerEi"}212  integer(kind=8):: i213  ! CHECK: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<i64>214  ! CHECK: %[[S_CVT:.*]] = fir.convert %[[S]] : (i64) -> index215  ! CHECK: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<i64>216  ! CHECK: %[[E_CVT:.*]] = fir.convert %[[E]] : (i64) -> index217  ! CHECK: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<i64>218  ! CHECK: %[[ST_CVT:.*]] = fir.convert %[[ST]] : (i64) -> index219  integer(kind=8) :: s, e, st220 221  ! CHECK: %[[I_LB:.*]] = fir.convert %[[S_CVT]] : (index) -> i64222  ! CHECK: %[[I_RES:.*]] = fir.do_loop %[[LI:[^ ]*]] =223  ! CHECK-SAME: %[[S_CVT]] to %[[E_CVT]] step %[[ST_CVT]]224  ! CHECK-SAME: iter_args(%[[I_IV:.*]] = %[[I_LB]]) -> (i64) {225  do i=s,e,st226    ! CHECK: fir.store %[[I_IV]] to %[[I_REF]] : !fir.ref<i64>227    ! CHECK: %[[I_STEPCAST:.*]] = fir.convert %[[ST_CVT]] : (index) -> i64228    ! CHECK: %[[I_IVLOAD:.*]] = fir.load %[[I_REF]] : !fir.ref<i64>229    ! CHECK: %[[I_IVINC:.*]] = arith.addi %[[I_IVLOAD]], %[[I_STEPCAST]] overflow<nsw> : i64230    ! CHECK: fir.result %[[I_IVINC]] : i64231  end do232  ! CHECK: }233  ! CHECK: fir.store %[[I_RES]] to %[[I_REF]] : !fir.ref<i64>234end subroutine235 236! Test real loop control.237! CHECK-LABEL: loop_with_real_control238! CHECK-SAME: (%[[S_REF:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}, %[[E_REF:.*]]: !fir.ref<f32> {fir.bindc_name = "e"}, %[[ST_REF:.*]]: !fir.ref<f32> {fir.bindc_name = "st"}) {239subroutine loop_with_real_control(s,e,st)240  ! CHECK-DAG: %[[INDEX_REF:.*]] = fir.alloca index241  ! CHECK-DAG: %[[X_REF:.*]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFloop_with_real_controlEx"}242  ! CHECK-DAG: %[[S:.*]] = fir.load %[[S_REF]] : !fir.ref<f32>243  ! CHECK-DAG: %[[E:.*]] = fir.load %[[E_REF]] : !fir.ref<f32>244  ! CHECK-DAG: %[[ST:.*]] = fir.load %[[ST_REF]] : !fir.ref<f32>245  ! CHECK: fir.store %[[ST]] to %[[ST_VAR:.*]] : !fir.ref<f32>246  real :: x, s, e, st247 248  ! CHECK: %[[DIFF:.*]] = arith.subf %[[E]], %[[S]] {{.*}}: f32249  ! CHECK: %[[RANGE:.*]] = arith.addf %[[DIFF]], %[[ST]] {{.*}}: f32250  ! CHECK: %[[HIGH:.*]] = arith.divf %[[RANGE]], %[[ST]] {{.*}}: f32251  ! CHECK: %[[HIGH_INDEX:.*]] = fir.convert %[[HIGH]] : (f32) -> index252  ! CHECK: fir.store %[[HIGH_INDEX]] to %[[INDEX_REF]] : !fir.ref<index>253  ! CHECK: fir.store %[[S]] to %[[X_REF]] : !fir.ref<f32>254 255  ! CHECK: br ^[[HDR:.*]]256  ! CHECK: ^[[HDR]]:  // 2 preds: ^{{.*}}, ^[[EXIT:.*]]257  ! CHECK-DAG: %[[INDEX:.*]] = fir.load %[[INDEX_REF]] : !fir.ref<index>258  ! CHECK-DAG: %[[C0:.*]] = arith.constant 0 : index259  ! CHECK: %[[COND:.*]] = arith.cmpi sgt, %[[INDEX]], %[[C0]] : index260  ! CHECK: cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]261  do x=s,e,st262    ! CHECK: ^[[BODY]]:  // pred: ^[[HDR]]263    ! CHECK-DAG: %[[INDEX2:.*]] = fir.load %[[INDEX_REF]] : !fir.ref<index>264    ! CHECK-DAG: %[[C1:.*]] = arith.constant 1 : index265    ! CHECK: %[[INC:.*]] = arith.subi %[[INDEX2]], %[[C1]] : index266    ! CHECK: fir.store %[[INC]] to %[[INDEX_REF]] : !fir.ref<index>267    ! CHECK: %[[X2:.*]] = fir.load %[[X_REF]] : !fir.ref<f32>268    ! CHECK: %[[ST_VAL:.*]] = fir.load %[[ST_VAR]] : !fir.ref<f32>269    ! CHECK: %[[XINC:.*]] = arith.addf %[[X2]], %[[ST_VAL]] {{.*}}: f32270    ! CHECK: fir.store %[[XINC]] to %[[X_REF]] : !fir.ref<f32>271    ! CHECK: br ^[[HDR]]272  end do273end subroutine274