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