1*3348c083SValentin Clement! Test array-value-copy 2*3348c083SValentin Clement 3*3348c083SValentin Clement! RUN: bbc %s -o - | FileCheck %s 4*3348c083SValentin Clement 5*3348c083SValentin Clement! Copy not needed 6*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest1( 7*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 8*3348c083SValentin Clement! CHECK-NOT: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 9*3348c083SValentin Clement! CHECK-NOT: fir.freemem % 10*3348c083SValentin Clement! CHECK: return 11*3348c083SValentin Clement! CHECK: } 12*3348c083SValentin Clementsubroutine test1(a) 13*3348c083SValentin Clement integer :: a(3) 14*3348c083SValentin Clement 15*3348c083SValentin Clement a = a + 1 16*3348c083SValentin Clementend subroutine test1 17*3348c083SValentin Clement 18*3348c083SValentin Clement! Copy not needed 19*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest2( 20*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 21*3348c083SValentin Clement! CHECK-NOT: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 22*3348c083SValentin Clement! CHECK-NOT: fir.freemem % 23*3348c083SValentin Clement! CHECK: return 24*3348c083SValentin Clement! CHECK: } 25*3348c083SValentin Clementsubroutine test2(a, b) 26*3348c083SValentin Clement integer :: a(3), b(3) 27*3348c083SValentin Clement 28*3348c083SValentin Clement a = b + 1 29*3348c083SValentin Clementend subroutine test2 30*3348c083SValentin Clement 31*3348c083SValentin Clement! Copy not needed 32*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest3( 33*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 34*3348c083SValentin Clement! CHECK-NOT: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 35*3348c083SValentin Clement! CHECK-NOT: fir.freemem % 36*3348c083SValentin Clement! CHECK: return 37*3348c083SValentin Clement! CHECK: } 38*3348c083SValentin Clementsubroutine test3(a) 39*3348c083SValentin Clement integer :: a(3) 40*3348c083SValentin Clement 41*3348c083SValentin Clement forall (i=1:3) 42*3348c083SValentin Clement a(i) = a(i) + 1 43*3348c083SValentin Clement end forall 44*3348c083SValentin Clementend subroutine test3 45*3348c083SValentin Clement 46*3348c083SValentin Clement! Make a copy. (Crossing dependence) 47*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest4( 48*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 49*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 50*3348c083SValentin Clement! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<3xi32>> 51*3348c083SValentin Clement! CHECK: return 52*3348c083SValentin Clement! CHECK: } 53*3348c083SValentin Clementsubroutine test4(a) 54*3348c083SValentin Clement integer :: a(3) 55*3348c083SValentin Clement 56*3348c083SValentin Clement forall (i=1:3) 57*3348c083SValentin Clement a(i) = a(4-i) + 1 58*3348c083SValentin Clement end forall 59*3348c083SValentin Clementend subroutine test4 60*3348c083SValentin Clement 61*3348c083SValentin Clement! Make a copy. (Carried dependence) 62*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest5( 63*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 64*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 65*3348c083SValentin Clement! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<3xi32>> 66*3348c083SValentin Clement! CHECK: return 67*3348c083SValentin Clement! CHECK: } 68*3348c083SValentin Clementsubroutine test5(a) 69*3348c083SValentin Clement integer :: a(3) 70*3348c083SValentin Clement 71*3348c083SValentin Clement forall (i=2:3) 72*3348c083SValentin Clement a(i) = a(i-1) + 14 73*3348c083SValentin Clement end forall 74*3348c083SValentin Clementend subroutine test5 75*3348c083SValentin Clement 76*3348c083SValentin Clement! Make a copy. (Carried dependence) 77*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest6( 78*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 79*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 80*3348c083SValentin Clement! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<3x!fir.type<_QFtest6Tt{m:!fir.array<3xi32>}>>> 81*3348c083SValentin Clement! CHECK: return 82*3348c083SValentin Clement! CHECK: } 83*3348c083SValentin Clementsubroutine test6(a) 84*3348c083SValentin Clement type t 85*3348c083SValentin Clement integer :: m(3) 86*3348c083SValentin Clement end type t 87*3348c083SValentin Clement type(t) :: a(3) 88*3348c083SValentin Clement 89*3348c083SValentin Clement forall (i=2:3) 90*3348c083SValentin Clement a(i)%m = a(i-1)%m + 14 91*3348c083SValentin Clement end forall 92*3348c083SValentin Clementend subroutine test6 93*3348c083SValentin Clement 94*3348c083SValentin Clement! Make a copy. (Overlapping partial CHARACTER update.) 95*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest7( 96*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 97*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 98*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 99*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 100*3348c083SValentin Clement! CHECK: fir.freemem %{{.*}} : !fir.heap<!fir.array<3x!fir.char<1,8>>> 101*3348c083SValentin Clement! CHECK: return 102*3348c083SValentin Clement! CHECK: } 103*3348c083SValentin Clementsubroutine test7(a) 104*3348c083SValentin Clement character(8) :: a(3) 105*3348c083SValentin Clement 106*3348c083SValentin Clement a(:)(2:5) = a(:)(3:6) 107*3348c083SValentin Clementend subroutine test7 108*3348c083SValentin Clement 109*3348c083SValentin Clement! Do not make a copy. 110*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest8( 111*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 112*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 113*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 114*3348c083SValentin Clement! CHECK-NOT: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 115*3348c083SValentin Clement! CHECK-NOT: fir.freemem % 116*3348c083SValentin Clement! CHECK: return 117*3348c083SValentin Clement! CHECK: } 118*3348c083SValentin Clementsubroutine test8(a,b) 119*3348c083SValentin Clement character(8) :: a(3), b(3) 120*3348c083SValentin Clement 121*3348c083SValentin Clement a(:)(2:5) = b(:)(3:6) 122*3348c083SValentin Clementend subroutine test8 123*3348c083SValentin Clement 124*3348c083SValentin Clement! Do make a copy. Assume vector subscripts cause dependences. 125*3348c083SValentin Clement! CHECK-LABEL: func @_QPtest9( 126*3348c083SValentin Clement! CHECK-SAME: %[[a:[^:]+]]: !fir.ref<!fir.array<?x?xf32>> 127*3348c083SValentin Clement! CHECK: %[[und:.*]] = fir.undefined index 128*3348c083SValentin Clement! CHECK: %[[slice:.*]] = fir.slice %[[und]], %[[und]], %[[und]], 129*3348c083SValentin Clement! CHECK: %[[heap:.*]] = fir.allocmem !fir.array<?x?xf32>, %{{.*}}, %{{.*}} 130*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 131*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 132*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 133*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 134*3348c083SValentin Clement! CHECK: = fir.array_coor %[[a]](%{{.*}}) [%[[slice]]] %{{.*}}, %{{.*}} : (!fir.ref<!fir.array<?x?xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32> 135*3348c083SValentin Clement! CHECK: = fir.array_coor %[[heap]](%{{.*}}) [%[[slice]]] %{{.*}}, %{{.*}} : (!fir.heap<!fir.array<?x?xf32>>, !fir.shape<2>, !fir.slice<2>, index, index) -> !fir.ref<f32> 136*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 137*3348c083SValentin Clement! CHECK: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 138*3348c083SValentin Clement! CHECK-NOT: ^bb{{[0-9]+}}(%{{.*}}: index, %{{.*}}: index): 139*3348c083SValentin Clement! CHECK: fir.freemem %[[heap]] 140*3348c083SValentin Clementsubroutine test9(a,v1,v2,n) 141*3348c083SValentin Clement real :: a(n,n) 142*3348c083SValentin Clement integer :: v1(n), v2(n) 143*3348c083SValentin Clement a(v1,:) = a(v2,:) 144*3348c083SValentin Clementend subroutine test9 145