brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.5 KiB · 9c7d874 Raw
254 lines · plain
1! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s2! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -o - %s | FileCheck %s3! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir -fwrapv -o - %s | FileCheck %s --check-prefix=NO-NSW4 5! Tests for unstructured loops.6 7! NO-NSW-NOT: overflow<nsw>8 9! Test a simple unstructured loop. Test for the existence of,10! -> The initialization of the trip-count and loop-variable11! -> The branch to the body or the exit inside the header12! -> The increment of the trip-count and the loop-variable inside the body13subroutine simple_unstructured()14  integer :: i15  do i=1,10016    goto 40417    404 continue18  end do19end subroutine20! CHECK-LABEL: simple_unstructured21! CHECK:   %[[TRIP_VAR_REF:.*]] = fir.alloca i3222! CHECK:   %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructuredEi"}23! CHECK:   %[[ONE:.*]] = arith.constant 1 : i3224! CHECK:   %[[HUNDRED:.*]] = arith.constant 100 : i3225! CHECK:   %[[STEP_ONE:.*]] = arith.constant 1 : i3226! CHECK:   %[[TMP1:.*]] = arith.subi %[[HUNDRED]], %[[ONE]] : i3227! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP_ONE]] : i3228! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP_ONE]] : i3229! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>30! CHECK:   fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>31! CHECK:   cf.br ^[[HEADER:.*]]32! CHECK: ^[[HEADER]]:33! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>34! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i3235! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i3236! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]37! CHECK: ^[[BODY]]:38! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>39! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i3240! CHECK:   %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i3241! CHECK:   fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>42! CHECK:   %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>43! CHECK:   %[[STEP_ONE_2:.*]] = arith.constant 1 : i3244! CHECK:   %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP_ONE_2]] overflow<nsw> : i3245! CHECK:   fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>46! CHECK:   cf.br ^[[HEADER]]47! CHECK: ^[[EXIT]]:48! CHECK:   return49 50! Test an unstructured loop with a step. Mostly similar to the previous one.51! Only difference is a non-unit step.52subroutine simple_unstructured_with_step()53  integer :: i54  do i=1,100,255    goto 40456    404 continue57  end do58end subroutine59! CHECK-LABEL: simple_unstructured_with_step60! CHECK:   %[[TRIP_VAR_REF:.*]] = fir.alloca i3261! CHECK:   %[[LOOP_VAR_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_unstructured_with_stepEi"}62! CHECK:   %[[ONE:.*]] = arith.constant 1 : i3263! CHECK:   %[[HUNDRED:.*]] = arith.constant 100 : i3264! CHECK:   %[[STEP:.*]] = arith.constant 2 : i3265! CHECK:   %[[TMP1:.*]] = arith.subi %[[HUNDRED]], %[[ONE]] : i3266! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[STEP]] : i3267! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[STEP]] : i3268! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>69! CHECK:   fir.store %[[ONE]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>70! CHECK:   cf.br ^[[HEADER:.*]]71! CHECK: ^[[HEADER]]:72! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>73! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i3274! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i3275! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]76! CHECK: ^[[BODY]]:77! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_REF]] : !fir.ref<i32>78! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i3279! CHECK:   %[[TRIP_VAR_NEXT:.*]] = arith.subi %[[TRIP_VAR]], %[[ONE_1]] : i3280! CHECK:   fir.store %[[TRIP_VAR_NEXT]] to %[[TRIP_VAR_REF]] : !fir.ref<i32>81! CHECK:   %[[LOOP_VAR:.*]] = fir.load %[[LOOP_VAR_REF]] : !fir.ref<i32>82! CHECK:   %[[STEP_2:.*]] = arith.constant 2 : i3283! CHECK:   %[[LOOP_VAR_NEXT:.*]] = arith.addi %[[LOOP_VAR]], %[[STEP_2]] overflow<nsw> : i3284! CHECK:   fir.store %[[LOOP_VAR_NEXT]] to %[[LOOP_VAR_REF]] : !fir.ref<i32>85! CHECK:   cf.br ^[[HEADER]]86! CHECK: ^[[EXIT]]:87! CHECK:   return88 89! Test a three nested unstructured loop. Three nesting is the basic case where90! we have loops that are neither innermost or outermost.91subroutine nested_unstructured()92  integer :: i, j, k93  do i=1,10094    do j=1,20095      do k=1,30096        goto 40497        404 continue98      end do99    end do100  end do101end subroutine102! CHECK-LABEL: nested_unstructured103! CHECK:   %[[TRIP_VAR_K_REF:.*]] = fir.alloca i32104! CHECK:   %[[TRIP_VAR_J_REF:.*]] = fir.alloca i32105! CHECK:   %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32106! CHECK:   %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_unstructuredEi"}107! CHECK:   %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_unstructuredEj"}108! CHECK:   %[[LOOP_VAR_K_REF:.*]] = fir.alloca i32 {bindc_name = "k", uniq_name = "_QFnested_unstructuredEk"}109! CHECK:   %[[I_START:.*]] = arith.constant 1 : i32110! CHECK:   %[[I_END:.*]] = arith.constant 100 : i32111! CHECK:   %[[I_STEP:.*]] = arith.constant 1 : i32112! CHECK:   %[[TMP1:.*]] = arith.subi %[[I_END]], %[[I_START]] : i32113! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32114! CHECK:   %[[TRIP_COUNT_I:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32115! CHECK:   fir.store %[[TRIP_COUNT_I]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>116! CHECK:   fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>117! CHECK:   cf.br ^[[HEADER_I:.*]]118! CHECK: ^[[HEADER_I]]:119! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>120! CHECK:   %[[ZERO_1:.*]] = arith.constant 0 : i32121! CHECK:   %[[COND_I:.*]] = arith.cmpi sgt, %[[TRIP_VAR_I]], %[[ZERO_1]] : i32122! CHECK:   cf.cond_br %[[COND_I]], ^[[BODY_I:.*]], ^[[EXIT_I:.*]]123! CHECK: ^[[BODY_I]]:124! CHECK:   %[[J_START:.*]] = arith.constant 1 : i32125! CHECK:   %[[J_END:.*]] = arith.constant 200 : i32126! CHECK:   %[[J_STEP:.*]] = arith.constant 1 : i32127! CHECK:   %[[TMP3:.*]] = arith.subi %[[J_END]], %[[J_START]] : i32128! CHECK:   %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[J_STEP]] : i32129! CHECK:   %[[TRIP_COUNT_J:.*]] = arith.divsi %[[TMP4]], %[[J_STEP]] : i32130! CHECK:   fir.store %[[TRIP_COUNT_J]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>131! CHECK:   fir.store %[[J_START]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>132! CHECK:   cf.br ^[[HEADER_J:.*]]133! CHECK: ^[[HEADER_J]]:134! CHECK:   %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>135! CHECK:   %[[ZERO_2:.*]] = arith.constant 0 : i32136! CHECK:   %[[COND_J:.*]] = arith.cmpi sgt, %[[TRIP_VAR_J]], %[[ZERO_2]] : i32137! CHECK:   cf.cond_br %[[COND_J]], ^[[BODY_J:.*]], ^[[EXIT_J:.*]]138! CHECK: ^[[BODY_J]]:139! CHECK:   %[[K_START:.*]] = arith.constant 1 : i32140! CHECK:   %[[K_END:.*]] = arith.constant 300 : i32141! CHECK:   %[[K_STEP:.*]] = arith.constant 1 : i32142! CHECK:   %[[TMP3:.*]] = arith.subi %[[K_END]], %[[K_START]] : i32143! CHECK:   %[[TMP4:.*]] = arith.addi %[[TMP3]], %[[K_STEP]] : i32144! CHECK:   %[[TRIP_COUNT_K:.*]] = arith.divsi %[[TMP4]], %[[K_STEP]] : i32145! CHECK:   fir.store %[[TRIP_COUNT_K]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>146! CHECK:   fir.store %[[K_START]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>147! CHECK:   cf.br ^[[HEADER_K:.*]]148! CHECK: ^[[HEADER_K]]:149! CHECK:   %[[TRIP_VAR_K:.*]] = fir.load %[[TRIP_VAR_K_REF]] : !fir.ref<i32>150! CHECK:   %[[ZERO_2:.*]] = arith.constant 0 : i32151! CHECK:   %[[COND_K:.*]] = arith.cmpi sgt, %[[TRIP_VAR_K]], %[[ZERO_2]] : i32152! CHECK:   cf.cond_br %[[COND_K]], ^[[BODY_K:.*]], ^[[EXIT_K:.*]]153! CHECK: ^[[BODY_K]]:154! CHECK:   %[[TRIP_VAR_K:.*]] = fir.load %[[TRIP_VAR_K_REF]] : !fir.ref<i32>155! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32156! CHECK:   %[[TRIP_VAR_K_NEXT:.*]] = arith.subi %[[TRIP_VAR_K]], %[[ONE_1]] : i32157! CHECK:   fir.store %[[TRIP_VAR_K_NEXT]] to %[[TRIP_VAR_K_REF]] : !fir.ref<i32>158! CHECK:   %[[LOOP_VAR_K:.*]] = fir.load %[[LOOP_VAR_K_REF]] : !fir.ref<i32>159! CHECK:   %[[K_STEP_2:.*]] = arith.constant 1 : i32160! CHECK:   %[[LOOP_VAR_K_NEXT:.*]] = arith.addi %[[LOOP_VAR_K]], %[[K_STEP_2]] overflow<nsw> : i32161! CHECK:   fir.store %[[LOOP_VAR_K_NEXT]] to %[[LOOP_VAR_K_REF]] : !fir.ref<i32>162! CHECK:   cf.br ^[[HEADER_K]]163! CHECK: ^[[EXIT_K]]:164! CHECK:   %[[TRIP_VAR_J:.*]] = fir.load %[[TRIP_VAR_J_REF]] : !fir.ref<i32>165! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32166! CHECK:   %[[TRIP_VAR_J_NEXT:.*]] = arith.subi %[[TRIP_VAR_J]], %[[ONE_1]] : i32167! CHECK:   fir.store %[[TRIP_VAR_J_NEXT]] to %[[TRIP_VAR_J_REF]] : !fir.ref<i32>168! CHECK:   %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_REF]] : !fir.ref<i32>169! CHECK:   %[[J_STEP_2:.*]] = arith.constant 1 : i32170! CHECK:   %[[LOOP_VAR_J_NEXT:.*]] = arith.addi %[[LOOP_VAR_J]], %[[J_STEP_2]] overflow<nsw> : i32171! CHECK:   fir.store %[[LOOP_VAR_J_NEXT]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>172! CHECK:   cf.br ^[[HEADER_J]]173! CHECK: ^[[EXIT_J]]:174! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>175! CHECK:   %[[ONE_1:.*]] = arith.constant 1 : i32176! CHECK:   %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[ONE_1]] : i32177! CHECK:   fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>178! CHECK:   %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>179! CHECK:   %[[I_STEP_2:.*]] = arith.constant 1 : i32180! CHECK:   %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %[[I_STEP_2]] overflow<nsw> : i32181! CHECK:   fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>182! CHECK:   cf.br ^[[HEADER_I]]183! CHECK: ^[[EXIT_I]]:184! CHECK:   return185 186! Test the existence of a structured loop inside an unstructured loop.187! Only minimal checks are inserted for the structured loop.188subroutine nested_structured_in_unstructured()189  integer :: i, j190  do i=1,100191    do j=1,100192    end do193    goto 404194    404 continue195  end do196end subroutine197! CHECK-LABEL: nested_structured_in_unstructured198! CHECK:   %[[TRIP_VAR_I_REF:.*]] = fir.alloca i32199! CHECK:   %[[LOOP_VAR_I_REF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFnested_structured_in_unstructuredEi"}200! CHECK:   %[[LOOP_VAR_J_REF:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFnested_structured_in_unstructuredEj"}201! CHECK:   %[[I_START:.*]] = arith.constant 1 : i32202! CHECK:   %[[I_END:.*]] = arith.constant 100 : i32203! CHECK:   %[[I_STEP:.*]] = arith.constant 1 : i32204! CHECK:   %[[TMP1:.*]] = arith.subi %[[I_END]], %[[I_START]] : i32205! CHECK:   %[[TMP2:.*]] = arith.addi %[[TMP1]], %[[I_STEP]] : i32206! CHECK:   %[[TRIP_COUNT:.*]] = arith.divsi %[[TMP2]], %[[I_STEP]] : i32207! CHECK:   fir.store %[[TRIP_COUNT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>208! CHECK:   fir.store %[[I_START]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>209! CHECK:   cf.br ^[[HEADER:.*]]210! CHECK: ^[[HEADER]]:211! CHECK:   %[[TRIP_VAR:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>212! CHECK:   %[[ZERO:.*]] = arith.constant 0 : i32213! CHECK:   %[[COND:.*]] = arith.cmpi sgt, %[[TRIP_VAR]], %[[ZERO]] : i32214! CHECK:   cf.cond_br %[[COND]], ^[[BODY:.*]], ^[[EXIT:.*]]215! CHECK: ^[[BODY]]:216! CHECK:   %{{.*}} = fir.do_loop %[[J_INDEX:[^ ]*]] =217! CHECK-SAME: %{{.*}} to %{{.*}} step %[[ST:[^ ]*]]218! CHECK-SAME: iter_args(%[[J_IV:.*]] = %{{.*}}) -> (i32) {219! CHECK:     fir.store %[[J_IV]] to %[[LOOP_VAR_J_REF]] : !fir.ref<i32>220! CHECK:     %[[LOOP_VAR_J:.*]] = fir.load %[[LOOP_VAR_J_REF]] : !fir.ref<i32>221! CHECK:     %[[LOOP_VAR_J_NEXT:.*]] = arith.addi %[[LOOP_VAR_J]], %{{[^ ]*}} overflow<nsw> : i32222! CHECK:   }223! CHECK:   %[[TRIP_VAR_I:.*]] = fir.load %[[TRIP_VAR_I_REF]] : !fir.ref<i32>224! CHECK:   %[[C1_3:.*]] = arith.constant 1 : i32225! CHECK:   %[[TRIP_VAR_I_NEXT:.*]] = arith.subi %[[TRIP_VAR_I]], %[[C1_3]] : i32226! CHECK:   fir.store %[[TRIP_VAR_I_NEXT]] to %[[TRIP_VAR_I_REF]] : !fir.ref<i32>227! CHECK:   %[[LOOP_VAR_I:.*]] = fir.load %[[LOOP_VAR_I_REF]] : !fir.ref<i32>228! CHECK:   %[[I_STEP_2:.*]] = arith.constant 1 : i32229! CHECK:   %[[LOOP_VAR_I_NEXT:.*]] = arith.addi %[[LOOP_VAR_I]], %[[I_STEP_2]] overflow<nsw> : i32230! CHECK:   fir.store %[[LOOP_VAR_I_NEXT]] to %[[LOOP_VAR_I_REF]] : !fir.ref<i32>231! CHECK:   cf.br ^[[HEADER]]232! CHECK: ^[[EXIT]]:233! CHECK:   return234 235subroutine unstructured_do_concurrent236  logical :: success237  do concurrent (i=1:10) local(success)238    success = .false.239    error stop "fail"240  enddo241end242! CHECK-LABEL: func.func @_QPunstructured_do_concurrent243! CHECK:         %[[ITER_VAR:.*]] = fir.alloca i32244 245! CHECK:       ^[[HEADER]]:246! CHECK:         %{{.*}} = fir.load %[[ITER_VAR]] : !fir.ref<i32>247! CHECK:         cf.cond_br %{{.*}}, ^[[BODY:.*]], ^[[EXIT:.*]]248 249! CHECK:       ^[[BODY]]:250! CHECK-NEXT:    %{{.*}} = fir.alloca !fir.logical<4> {bindc_name = "success", {{.*}}}251 252! CHECK:       ^[[EXIT]]:253! CHECK-NEXT:    return254