xref: /llvm-project/flang/test/Lower/loops2.f90 (revision a88677edc0792534ba3157bf7d7a1b98e470f2fb)
13348c083SValentin Clement! Test loop variables increment
2f35f863aSjeanPerier! RUN: bbc -emit-fir -hlfir=false -o - %s | FileCheck %s
33348c083SValentin Clement
43348c083SValentin Clementmodule test_loop_var
53348c083SValentin Clement  implicit none
63348c083SValentin Clement  integer, pointer:: i_pointer
73348c083SValentin Clement  integer, allocatable :: i_allocatable
83348c083SValentin Clement  real, pointer :: x_pointer
93348c083SValentin Clement  real, allocatable :: x_allocatable
103348c083SValentin Clementcontains
113348c083SValentin Clement! CHECK-LABEL: func @_QMtest_loop_varPtest_pointer
123348c083SValentin Clement  subroutine test_pointer()
133348c083SValentin Clement    do i_pointer=1,10
143348c083SValentin Clement    enddo
153348c083SValentin Clement! CHECK:         %[[VAL_0:.*]] = fir.address_of(@_QMtest_loop_varEi_pointer) : !fir.ref<!fir.box<!fir.ptr<i32>>>
163348c083SValentin Clement! CHECK:         %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
173348c083SValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
18af7edf15SSlava Zakharin! CHECK:         %[[VAL_9:.*]]:2 = fir.do_loop{{.*}}iter_args(%[[IV:.*]] = {{.*}})
19af7edf15SSlava Zakharin! CHECK:           fir.store %[[IV]] to %[[VAL_2]] : !fir.ptr<i32>
203348c083SValentin Clement! CHECK:         }
21af7edf15SSlava Zakharin! CHECK:         fir.store %[[VAL_9]]#1 to %[[VAL_2]] : !fir.ptr<i32>
223348c083SValentin Clement  end subroutine
233348c083SValentin Clement
243348c083SValentin Clement! CHECK-LABEL: func @_QMtest_loop_varPtest_allocatable
253348c083SValentin Clement  subroutine test_allocatable()
263348c083SValentin Clement    do i_allocatable=1,10
273348c083SValentin Clement    enddo
283348c083SValentin Clement! CHECK:         %[[VAL_0:.*]] = fir.address_of(@_QMtest_loop_varEi_allocatable) : !fir.ref<!fir.box<!fir.heap<i32>>>
293348c083SValentin Clement! CHECK:         %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.heap<i32>>>
303348c083SValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.box_addr %[[VAL_1]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
31af7edf15SSlava Zakharin! CHECK:         %[[VAL_9:.*]]:2 = fir.do_loop{{.*}}iter_args(%[[IV:.*]] = {{.*}})
32af7edf15SSlava Zakharin! CHECK:           fir.store %[[IV]] to %[[VAL_2]] : !fir.heap<i32>
333348c083SValentin Clement! CHECK:         }
34af7edf15SSlava Zakharin! CHECK:         fir.store %[[VAL_9]]#1 to %[[VAL_2]] : !fir.heap<i32>
353348c083SValentin Clement  end subroutine
363348c083SValentin Clement
373348c083SValentin Clement! CHECK-LABEL: func @_QMtest_loop_varPtest_real_pointer
383348c083SValentin Clement  subroutine test_real_pointer()
393348c083SValentin Clement    do x_pointer=1,10
403348c083SValentin Clement    enddo
413348c083SValentin Clement! CHECK:         %[[VAL_0:.*]] = fir.alloca index
423348c083SValentin Clement! CHECK:         %[[VAL_1:.*]] = fir.address_of(@_QMtest_loop_varEx_pointer) : !fir.ref<!fir.box<!fir.ptr<f32>>>
433348c083SValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<f32>>>
443348c083SValentin Clement! CHECK:         %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32>
453348c083SValentin Clement! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
463348c083SValentin Clement! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> f32
473348c083SValentin Clement! CHECK:         %[[VAL_8:.*]] = arith.constant 1.000000e+00 : f32
483348c083SValentin Clement
493348c083SValentin Clement! CHECK:         fir.store %[[VAL_5]] to %[[VAL_3]] : !fir.ptr<f32>
503348c083SValentin Clement! CHECK:         br ^bb1
513348c083SValentin Clement! CHECK:       ^bb1:
523348c083SValentin Clement! CHECK:         cond_br %{{.*}}, ^bb2, ^bb3
533348c083SValentin Clement! CHECK:       ^bb2:
543348c083SValentin Clement! CHECK:         %[[VAL_19:.*]] = fir.load %[[VAL_3]] : !fir.ptr<f32>
553dbb055fSLeandro Lupori! CHECK:         %[[VAL_20:.*]] = arith.constant 1.000000e+00 : f32
563dbb055fSLeandro Lupori! CHECK:         %[[VAL_21:.*]] = arith.addf %[[VAL_19]], %[[VAL_20]] {{.*}}: f32
573dbb055fSLeandro Lupori! CHECK:         fir.store %[[VAL_21]] to %[[VAL_3]] : !fir.ptr<f32>
583348c083SValentin Clement! CHECK:         br ^bb1
593348c083SValentin Clement! CHECK:       ^bb3:
603348c083SValentin Clement! CHECK:         return
613348c083SValentin Clement  end subroutine
623348c083SValentin Clement
633348c083SValentin Clement! CHECK-LABEL: func @_QMtest_loop_varPtest_real_allocatable
643348c083SValentin Clement  subroutine test_real_allocatable()
653348c083SValentin Clement    do x_allocatable=1,10
663348c083SValentin Clement    enddo
673348c083SValentin Clement! CHECK:         %[[VAL_0:.*]] = fir.alloca index
683348c083SValentin Clement! CHECK:         %[[VAL_1:.*]] = fir.address_of(@_QMtest_loop_varEx_allocatable) : !fir.ref<!fir.box<!fir.heap<f32>>>
693348c083SValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.heap<f32>>>
703348c083SValentin Clement! CHECK:         %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.heap<f32>>) -> !fir.heap<f32>
713348c083SValentin Clement! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
723348c083SValentin Clement! CHECK:         %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> f32
733348c083SValentin Clement! CHECK:         %[[VAL_8:.*]] = arith.constant 1.000000e+00 : f32
743348c083SValentin Clement
753348c083SValentin Clement! CHECK:         fir.store %[[VAL_5]] to %[[VAL_3]] : !fir.heap<f32>
763348c083SValentin Clement! CHECK:         br ^bb1
773348c083SValentin Clement! CHECK:       ^bb1:
783348c083SValentin Clement! CHECK:         cond_br %{{.*}}, ^bb2, ^bb3
793348c083SValentin Clement! CHECK:       ^bb2:
803348c083SValentin Clement! CHECK:         %[[VAL_19:.*]] = fir.load %[[VAL_3]] : !fir.heap<f32>
813dbb055fSLeandro Lupori! CHECK:         %[[VAL_20:.*]] = arith.constant 1.000000e+00 : f32
823dbb055fSLeandro Lupori! CHECK:         %[[VAL_21:.*]] = arith.addf %[[VAL_19]], %[[VAL_20]] {{.*}}: f32
833dbb055fSLeandro Lupori! CHECK:         fir.store %[[VAL_21]] to %[[VAL_3]] : !fir.heap<f32>
843348c083SValentin Clement! CHECK:         br ^bb1
853348c083SValentin Clement! CHECK:       ^bb3:
863348c083SValentin Clement! CHECK:         return
873348c083SValentin Clement  end subroutine
883348c083SValentin Clement
893348c083SValentin Clement  ! CHECK-LABEL: func @_QMtest_loop_varPtest_pointer_unstructured_loop()
903348c083SValentin Clement  subroutine test_pointer_unstructured_loop()
913348c083SValentin Clement    do i_pointer=1,10
923348c083SValentin Clement      if (i_pointer .gt. 5) exit
933348c083SValentin Clement    enddo
943348c083SValentin Clement! CHECK:         %[[VAL_1:.*]] = fir.address_of(@_QMtest_loop_varEi_pointer) : !fir.ref<!fir.box<!fir.ptr<i32>>>
953348c083SValentin Clement! CHECK:         %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
963348c083SValentin Clement! CHECK:         %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.ptr<i32>>) -> !fir.ptr<i32>
973348c083SValentin Clement! CHECK:         %[[VAL_4:.*]] = arith.constant 1 : i32
983348c083SValentin Clement! CHECK:         %[[VAL_6:.*]] = arith.constant 1 : i32
993348c083SValentin Clement! CHECK:         fir.store %[[VAL_4]] to %[[VAL_3]] : !fir.ptr<i32>
1003348c083SValentin Clement! CHECK:         br ^bb1
1013348c083SValentin Clement! CHECK:       ^bb1:
1023348c083SValentin Clement! CHECK:         cond_br %{{.*}}, ^bb2, ^bb5
1033348c083SValentin Clement! CHECK:       ^bb2:
1043348c083SValentin Clement! CHECK:         cond_br %{{.*}}, ^bb3, ^bb4
1053348c083SValentin Clement! CHECK:       ^bb3:
1063348c083SValentin Clement! CHECK:         br ^bb5
1073348c083SValentin Clement! CHECK:       ^bb4:
1083dbb055fSLeandro Lupori! CHECK:         %[[VAL_20:.*]] = fir.load %[[VAL_3]] : !fir.ptr<i32>
1093dbb055fSLeandro Lupori! CHECK:         %[[VAL_21:.*]] = arith.constant 1 : i32
110*a88677edSYusuke MINATO! CHECK:         %[[VAL_22:.*]] = arith.addi %[[VAL_20]], %[[VAL_21]] overflow<nsw> : i32
1113348c083SValentin Clement! CHECK:         fir.store %[[VAL_22]] to %[[VAL_3]] : !fir.ptr<i32>
1123348c083SValentin Clement! CHECK:         br ^bb1
1133348c083SValentin Clement! CHECK:       ^bb5:
1143348c083SValentin Clement! CHECK:         return
1153348c083SValentin Clement! CHECK:       }
1163348c083SValentin Clement  end subroutine
1173348c083SValentin Clement
1183348c083SValentin Clementend module
1193348c083SValentin Clement
1203348c083SValentin Clement  use test_loop_var
1213348c083SValentin Clement  implicit none
1223348c083SValentin Clement  integer, target :: i_target = -1
1233348c083SValentin Clement  real, target :: x_target = -1.
1243348c083SValentin Clement  i_pointer => i_target
1253348c083SValentin Clement  allocate(i_allocatable)
1263348c083SValentin Clement  i_allocatable = -1
1273348c083SValentin Clement  x_pointer => x_target
1283348c083SValentin Clement  allocate(x_allocatable)
1293348c083SValentin Clement  x_allocatable = -1.
1303348c083SValentin Clement
1313348c083SValentin Clement  call test_pointer()
1323348c083SValentin Clement  call test_allocatable()
1333348c083SValentin Clement  call test_real_pointer()
1343348c083SValentin Clement  call test_real_allocatable()
1353348c083SValentin Clement  ! Expect 11 everywhere
1363348c083SValentin Clement  print *, i_target
1373348c083SValentin Clement  print *, i_allocatable
1383348c083SValentin Clement  print *, x_target
1393348c083SValentin Clement  print *, x_allocatable
1403348c083SValentin Clement
1413348c083SValentin Clement  call test_pointer_unstructured_loop()
1423348c083SValentin Clement  call test_allocatable_unstructured_loop()
1433348c083SValentin Clement  ! Expect 6 everywhere
1443348c083SValentin Clement  print *, i_target
1453348c083SValentin Clementend
146