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