xref: /llvm-project/flang/test/Lower/do_concurrent.f90 (revision 06984825061f1bf7c70087833a8d4f6d9feb2865)
1*06984825SKareem Ergawy! RUN: %flang_fc1 -emit-hlfir -o - %s | FileCheck %s
2*06984825SKareem Ergawy
3*06984825SKareem Ergawy! Simple tests for structured concurrent loops with loop-control.
4*06984825SKareem Ergawy
5*06984825SKareem Ergawypure function bar(n, m)
6*06984825SKareem Ergawy   implicit none
7*06984825SKareem Ergawy   integer, intent(in) :: n, m
8*06984825SKareem Ergawy   integer :: bar
9*06984825SKareem Ergawy   bar = n + m
10*06984825SKareem Ergawyend function
11*06984825SKareem Ergawy
12*06984825SKareem Ergawy!CHECK-LABEL: sub1
13*06984825SKareem Ergawysubroutine sub1(n)
14*06984825SKareem Ergawy   implicit none
15*06984825SKareem Ergawy   integer :: n, m, i, j, k
16*06984825SKareem Ergawy   integer, dimension(n) :: a
17*06984825SKareem Ergawy!CHECK: %[[LB1:.*]] = arith.constant 1 : i32
18*06984825SKareem Ergawy!CHECK: %[[LB1_CVT:.*]] = fir.convert %[[LB1]] : (i32) -> index
19*06984825SKareem Ergawy!CHECK: %[[UB1:.*]] = fir.load %{{.*}}#0 : !fir.ref<i32>
20*06984825SKareem Ergawy!CHECK: %[[UB1_CVT:.*]] = fir.convert %[[UB1]] : (i32) -> index
21*06984825SKareem Ergawy
22*06984825SKareem Ergawy!CHECK: %[[LB2:.*]] = arith.constant 1 : i32
23*06984825SKareem Ergawy!CHECK: %[[LB2_CVT:.*]] = fir.convert %[[LB2]] : (i32) -> index
24*06984825SKareem Ergawy!CHECK: %[[UB2:.*]] = fir.call @_QPbar(%{{.*}}, %{{.*}}) proc_attrs<pure> fastmath<contract> : (!fir.ref<i32>, !fir.ref<i32>) -> i32
25*06984825SKareem Ergawy!CHECK: %[[UB2_CVT:.*]] = fir.convert %[[UB2]] : (i32) -> index
26*06984825SKareem Ergawy
27*06984825SKareem Ergawy!CHECK: %[[LB3:.*]] = arith.constant 5 : i32
28*06984825SKareem Ergawy!CHECK: %[[LB3_CVT:.*]] = fir.convert %[[LB3]] : (i32) -> index
29*06984825SKareem Ergawy!CHECK: %[[UB3:.*]] = arith.constant 10 : i32
30*06984825SKareem Ergawy!CHECK: %[[UB3_CVT:.*]] = fir.convert %[[UB3]] : (i32) -> index
31*06984825SKareem Ergawy
32*06984825SKareem Ergawy!CHECK: fir.do_loop %{{.*}} = %[[LB1_CVT]] to %[[UB1_CVT]] step %{{.*}} unordered
33*06984825SKareem Ergawy!CHECK: fir.do_loop %{{.*}} = %[[LB2_CVT]] to %[[UB2_CVT]] step %{{.*}} unordered
34*06984825SKareem Ergawy!CHECK: fir.do_loop %{{.*}} = %[[LB3_CVT]] to %[[UB3_CVT]] step %{{.*}} unordered
35*06984825SKareem Ergawy
36*06984825SKareem Ergawy   do concurrent(i=1:n, j=1:bar(n*m, n/m), k=5:10)
37*06984825SKareem Ergawy      a(i) = n
38*06984825SKareem Ergawy   end do
39*06984825SKareem Ergawyend subroutine
40*06984825SKareem Ergawy
41*06984825SKareem Ergawy!CHECK-LABEL: sub2
42*06984825SKareem Ergawysubroutine sub2(n)
43*06984825SKareem Ergawy   implicit none
44*06984825SKareem Ergawy   integer :: n, m, i, j
45*06984825SKareem Ergawy   integer, dimension(n) :: a
46*06984825SKareem Ergawy!CHECK: %[[LB1:.*]] = arith.constant 1 : i32
47*06984825SKareem Ergawy!CHECK: %[[LB1_CVT:.*]] = fir.convert %[[LB1]] : (i32) -> index
48*06984825SKareem Ergawy!CHECK: %[[UB1:.*]] = fir.load %5#0 : !fir.ref<i32>
49*06984825SKareem Ergawy!CHECK: %[[UB1_CVT:.*]] = fir.convert %[[UB1]] : (i32) -> index
50*06984825SKareem Ergawy!CHECK: fir.do_loop %{{.*}} = %[[LB1_CVT]] to %[[UB1_CVT]] step %{{.*}} unordered
51*06984825SKareem Ergawy!CHECK: %[[LB2:.*]] = arith.constant 1 : i32
52*06984825SKareem Ergawy!CHECK: %[[LB2_CVT:.*]] = fir.convert %[[LB2]] : (i32) -> index
53*06984825SKareem Ergawy!CHECK: %[[UB2:.*]] = fir.call @_QPbar(%{{.*}}, %{{.*}}) proc_attrs<pure> fastmath<contract> : (!fir.ref<i32>, !fir.ref<i32>) -> i32
54*06984825SKareem Ergawy!CHECK: %[[UB2_CVT:.*]] = fir.convert %[[UB2]] : (i32) -> index
55*06984825SKareem Ergawy!CHECK: fir.do_loop %{{.*}} = %[[LB2_CVT]] to %[[UB2_CVT]] step %{{.*}} unordered
56*06984825SKareem Ergawy   do concurrent(i=1:n)
57*06984825SKareem Ergawy      do concurrent(j=1:bar(n*m, n/m))
58*06984825SKareem Ergawy         a(i) = n
59*06984825SKareem Ergawy      end do
60*06984825SKareem Ergawy   end do
61*06984825SKareem Ergawyend subroutine
62*06984825SKareem Ergawy
63*06984825SKareem Ergawy
64*06984825SKareem Ergawy!CHECK-LABEL: unstructured
65*06984825SKareem Ergawysubroutine unstructured(inner_step)
66*06984825SKareem Ergawy  integer(4) :: i, j, inner_step
67*06984825SKareem Ergawy
68*06984825SKareem Ergawy!CHECK-NOT: cf.br
69*06984825SKareem Ergawy!CHECK-NOT: cf.cond_br
70*06984825SKareem Ergawy!CHECK:     %[[LB1:.*]] = arith.constant 1 : i32
71*06984825SKareem Ergawy!CHECK:     %[[LB1_CVT:.*]] = fir.convert %c1_i32 : (i32) -> i16
72*06984825SKareem Ergawy!CHECK:     %[[UB1:.*]] = arith.constant 5 : i32
73*06984825SKareem Ergawy!CHECK:     %[[UB1_CVT:.*]] = fir.convert %c5_i32 : (i32) -> i16
74*06984825SKareem Ergawy!CHECK:     %[[STP1:.*]] = arith.constant 1 : i16
75*06984825SKareem Ergawy
76*06984825SKareem Ergawy!CHECK-NOT: cf.br
77*06984825SKareem Ergawy!CHECK-NOT: cf.cond_br
78*06984825SKareem Ergawy!CHECK:     %[[LB2:.*]] = arith.constant 3 : i32
79*06984825SKareem Ergawy!CHECK:     %[[LB2_CVT:.*]] = fir.convert %[[LB2]] : (i32) -> i16
80*06984825SKareem Ergawy!CHECK:     %[[UB2:.*]] = arith.constant 9 : i32
81*06984825SKareem Ergawy!CHECK:     %[[UB2_CVT:.*]] = fir.convert %[[UB2]] : (i32) -> i16
82*06984825SKareem Ergawy!CHECK:     %[[STP2:.*]] = fir.load %{{.*}}#0 : !fir.ref<i32>
83*06984825SKareem Ergawy!CHECK:     %[[STP2_CVT:.*]] = fir.convert %[[STP2]] : (i32) -> i16
84*06984825SKareem Ergawy!CHECK:     fir.store %[[STP2_CVT]] to %{{.*}} : !fir.ref<i16>
85*06984825SKareem Ergawy!CHECK:     cf.br ^[[I_LOOP_HEADER:.*]]
86*06984825SKareem Ergawy
87*06984825SKareem Ergawy!CHECK: ^[[I_LOOP_HEADER]]:
88*06984825SKareem Ergawy!CHECK-NEXT: %{{.*}} = fir.load %{{.*}} : !fir.ref<i16>
89*06984825SKareem Ergawy!CHECK-NEXT: %{{.*}} = arith.constant 0 : i16
90*06984825SKareem Ergawy!CHECK-NEXT: %{{.*}} = arith.cmpi sgt, %{{.*}}, %{{.*}}: i16
91*06984825SKareem Ergawy!CHECK-NEXT: cf.cond_br %{{.*}}, ^[[J_LOOP_HEADER:.*]], ^{{.*}}
92*06984825SKareem Ergawy
93*06984825SKareem Ergawy!CHECK: ^[[J_LOOP_HEADER]]:
94*06984825SKareem Ergawy!CHECK-NEXT: %[[RANGE:.*]] = arith.subi %[[UB2_CVT]], %[[LB2_CVT]] : i16
95*06984825SKareem Ergawy!CHECK-NEXT: %{{.*}} = arith.addi %[[RANGE]], %[[STP2_CVT]] : i16
96*06984825SKareem Ergawy!CHECK-NEXT: %{{.*}} = arith.divsi %{{.*}}, %[[STP2_CVT]] : i16
97*06984825SKareem Ergawy  do concurrent (integer(2)::i=1:5, j=3:9:inner_step, i.ne.3)
98*06984825SKareem Ergawy    goto (7, 7) i+1
99*06984825SKareem Ergawy    print*, 'E:', i, j
100*06984825SKareem Ergawy  7 continue
101*06984825SKareem Ergawy  enddo
102*06984825SKareem Ergawyend subroutine unstructured
103