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