1! RUN: bbc -emit-fir %s -o - | FileCheck %s
2
3! CHECK-LABEL: system_clock_test
4subroutine system_clock_test()
5  integer(4) :: c
6  integer(8) :: m
7  real :: r
8  ! CHECK-DAG: %[[c:.*]] = fir.alloca i32 {bindc_name = "c"
9  ! CHECK-DAG: %[[m:.*]] = fir.alloca i64 {bindc_name = "m"
10  ! CHECK-DAG: %[[r:.*]] = fir.alloca f32 {bindc_name = "r"
11  ! CHECK: %[[c4:.*]] = arith.constant 4 : i32
12  ! CHECK: %[[Count:.*]] = fir.call @_FortranASystemClockCount(%[[c4]]) : (i32) -> i64
13  ! CHECK: %[[Count1:.*]] = fir.convert %[[Count]] : (i64) -> i32
14  ! CHECK: fir.store %[[Count1]] to %[[c]] : !fir.ref<i32>
15  ! CHECK: %[[c8:.*]] = arith.constant 8 : i32
16  ! CHECK: %[[Rate:.*]] = fir.call @_FortranASystemClockCountRate(%[[c8]]) : (i32) -> i64
17  ! CHECK: %[[Rate1:.*]] = fir.convert %[[Rate]] : (i64) -> f32
18  ! CHECK: fir.store %[[Rate1]] to %[[r]] : !fir.ref<f32>
19  ! CHECK: %[[c8_2:.*]] = arith.constant 8 : i32
20  ! CHECK: %[[Max:.*]] = fir.call @_FortranASystemClockCountMax(%[[c8_2]]) : (i32) -> i64
21  ! CHECK: fir.store %[[Max]] to %[[m]] : !fir.ref<i64>
22  call system_clock(c, r, m)
23! print*, c, r, m
24  ! CHECK-NOT: fir.call
25  ! CHECK: %[[c8_3:.*]] = arith.constant 8 : i32
26  ! CHECK: %[[Rate:.*]] = fir.call @_FortranASystemClockCountRate(%[[c8_3]]) : (i32) -> i64
27  ! CHECK: fir.store %[[Rate]] to %[[m]] : !fir.ref<i64>
28  call system_clock(count_rate=m)
29  ! CHECK-NOT: fir.call
30! print*, m
31end subroutine
32
33! CHECK-LABEL: @_QPss
34subroutine ss(count)
35  ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca !fir.box<!fir.heap<i64>> {bindc_name = "count_max", uniq_name = "_QFssEcount_max"}
36  ! CHECK:   %[[V_1:[0-9]+]] = fir.alloca !fir.heap<i64> {uniq_name = "_QFssEcount_max.addr"}
37  ! CHECK:   %[[V_2:[0-9]+]] = fir.zero_bits !fir.heap<i64>
38  ! CHECK:   fir.store %[[V_2]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
39  ! CHECK:   %[[V_3:[0-9]+]] = fir.alloca !fir.box<!fir.ptr<i64>> {bindc_name = "count_rate", uniq_name = "_QFssEcount_rate"}
40  ! CHECK:   %[[V_4:[0-9]+]] = fir.alloca !fir.ptr<i64> {uniq_name = "_QFssEcount_rate.addr"}
41  ! CHECK:   %[[V_5:[0-9]+]] = fir.zero_bits !fir.ptr<i64>
42  ! CHECK:   fir.store %[[V_5]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
43  ! CHECK:   %[[V_6:[0-9]+]] = fir.alloca i64 {bindc_name = "count_rate_", fir.target, uniq_name = "_QFssEcount_rate_"}
44  ! CHECK:   %[[V_7:[0-9]+]] = fir.convert %[[V_6]] : (!fir.ref<i64>) -> !fir.ptr<i64>
45  ! CHECK:   fir.store %[[V_7]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
46  ! CHECK:   %[[V_8:[0-9]+]] = fir.allocmem i64 {uniq_name = "_QFssEcount_max.alloc"}
47  ! CHECK:   fir.store %[[V_8]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
48  ! CHECK:   %[[V_9:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
49  ! CHECK:   %[[V_10:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
50  ! CHECK:   %[[V_11:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
51  ! CHECK:   fir.if %[[V_11]] {
52  ! CHECK:     %[[V_29:[0-9]+]] = fir.call @_FortranASystemClockCount(%c8{{.*}}_i32) : (i32) -> i64
53  ! CHECK:     fir.store %[[V_29]] to %arg0 : !fir.ref<i64>
54  ! CHECK:   }
55  ! CHECK:   %[[V_12:[0-9]+]] = fir.convert %[[V_9]] : (!fir.ptr<i64>) -> i64
56  ! CHECK:   %[[V_13:[0-9]+]] = arith.cmpi ne, %[[V_12]], %c0{{.*}}_i64 : i64
57  ! CHECK:   fir.if %[[V_13]] {
58  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) : (i32) -> i64
59  ! CHECK:     fir.store %[[V_29]] to %[[V_9]] : !fir.ptr<i64>
60  ! CHECK:   }
61  ! CHECK:   %[[V_14:[0-9]+]] = fir.convert %[[V_10]] : (!fir.heap<i64>) -> i64
62  ! CHECK:   %[[V_15:[0-9]+]] = arith.cmpi ne, %[[V_14]], %c0{{.*}}_i64_0 : i64
63  ! CHECK:   fir.if %[[V_15]] {
64  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) : (i32) -> i64
65  ! CHECK:     fir.store %[[V_29]] to %[[V_10]] : !fir.heap<i64>
66  ! CHECK:   }
67  ! CHECK:   %[[V_16:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
68  ! CHECK:   fir.if %[[V_16]] {
69  ! CHECK:     %[[V_31:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput
70  ! CHECK:     %[[V_32:[0-9]+]] = fir.load %arg0 : !fir.ref<i64>
71  ! CHECK:     %[[V_33:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_32]]) : (!fir.ref<i8>, i64) -> i1
72  ! CHECK:     %[[V_34:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
73  ! CHECK:     %[[V_35:[0-9]+]] = fir.load %[[V_34]] : !fir.ptr<i64>
74  ! CHECK:     %[[V_36:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_35]]) : (!fir.ref<i8>, i64) -> i1
75  ! CHECK:     %[[V_37:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
76  ! CHECK:     %[[V_38:[0-9]+]] = fir.load %[[V_37]] : !fir.heap<i64>
77  ! CHECK:     %[[V_39:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_38]]) : (!fir.ref<i8>, i64) -> i1
78  ! CHECK:     %[[V_40:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_31]]) : (!fir.ref<i8>) -> i32
79  ! CHECK:   } else {
80  ! CHECK:     %[[V_29]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
81  ! CHECK:     %[[V_30:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
82  ! CHECK:     %[[V_31]] = fir.convert %[[V_29]] : (!fir.ptr<i64>) -> i64
83  ! CHECK:     %[[V_32]] = arith.cmpi ne, %[[V_31]], %c0{{.*}}_i64_3 : i64
84  ! CHECK:     fir.if %[[V_32]] {
85  ! CHECK:       %[[V_45:[0-9]+]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) : (i32) -> i64
86  ! CHECK:       fir.store %[[V_45]] to %[[V_29]] : !fir.ptr<i64>
87  ! CHECK:     }
88  ! CHECK:     %[[V_33]] = fir.convert %[[V_30]] : (!fir.heap<i64>) -> i64
89  ! CHECK:     %[[V_34]] = arith.cmpi ne, %[[V_33]], %c0{{.*}}_i64_4 : i64
90  ! CHECK:     fir.if %[[V_34]] {
91  ! CHECK:       %[[V_45]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) : (i32) -> i64
92  ! CHECK:       fir.store %[[V_45]] to %[[V_30]] : !fir.heap<i64>
93  ! CHECK:     }
94  ! CHECK:     %[[V_37]] = fir.call @_FortranAioBeginExternalListOutput
95  ! CHECK:     %[[V_38]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
96  ! CHECK:     %[[V_39]] = fir.load %[[V_38]] : !fir.ptr<i64>
97  ! CHECK:     %[[V_40]] = fir.call @_FortranAioOutputInteger64(%[[V_37]], %[[V_39]]) : (!fir.ref<i8>, i64) -> i1
98  ! CHECK:     %[[V_41:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
99  ! CHECK:     %[[V_42:[0-9]+]] = fir.load %[[V_41]] : !fir.heap<i64>
100  ! CHECK:     %[[V_43:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_37]], %[[V_42]]) : (!fir.ref<i8>, i64) -> i1
101  ! CHECK:     %[[V_44:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_37]]) : (!fir.ref<i8>) -> i32
102  ! CHECK:   }
103  ! CHECK:   %[[V_17:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
104  ! CHECK:   fir.if %[[V_17]] {
105  ! CHECK:     %[[V_29]] = fir.convert %c0{{.*}}_i32 : (i32) -> i64
106  ! CHECK:     fir.store %[[V_29]] to %arg0 : !fir.ref<i64>
107  ! CHECK:   } else {
108  ! CHECK:   }
109  ! CHECK:   %[[V_18:[0-9]+]] = fir.zero_bits !fir.ptr<i64>
110  ! CHECK:   fir.store %[[V_18]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
111  ! CHECK:   %[[V_19:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
112  ! CHECK:   fir.freemem %[[V_19]] : !fir.heap<i64>
113  ! CHECK:   %[[V_20:[0-9]+]] = fir.zero_bits !fir.heap<i64>
114  ! CHECK:   fir.store %[[V_20]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
115  ! CHECK:   %[[V_21:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
116  ! CHECK:   %[[V_22:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
117  ! CHECK:   %[[V_23:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
118  ! CHECK:   fir.if %[[V_23]] {
119  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCount(%c8{{.*}}_i32) : (i32) -> i64
120  ! CHECK:     fir.store %[[V_29]] to %arg0 : !fir.ref<i64>
121  ! CHECK:   }
122  ! CHECK:   %[[V_24:[0-9]+]] = fir.convert %[[V_21]] : (!fir.ptr<i64>) -> i64
123  ! CHECK:   %[[V_25:[0-9]+]] = arith.cmpi ne, %[[V_24]], %c0{{.*}}_i64_1 : i64
124  ! CHECK:   fir.if %[[V_25]] {
125  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) : (i32) -> i64
126  ! CHECK:     fir.store %[[V_29]] to %[[V_21]] : !fir.ptr<i64>
127  ! CHECK:   }
128  ! CHECK:   %[[V_26:[0-9]+]] = fir.convert %[[V_22]] : (!fir.heap<i64>) -> i64
129  ! CHECK:   %[[V_27:[0-9]+]] = arith.cmpi ne, %[[V_26]], %c0{{.*}}_i64_2 : i64
130  ! CHECK:   fir.if %[[V_27]] {
131  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) : (i32) -> i64
132  ! CHECK:     fir.store %[[V_29]] to %[[V_22]] : !fir.heap<i64>
133  ! CHECK:   }
134  ! CHECK:   %[[V_28:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
135  ! CHECK:   fir.if %[[V_28]] {
136  ! CHECK:     %[[V_31]] = fir.call @_FortranAioBeginExternalListOutput
137  ! CHECK:     %[[V_32]] = fir.load %arg0 : !fir.ref<i64>
138  ! CHECK:     %[[V_33]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_32]]) : (!fir.ref<i8>, i64) -> i1
139  ! CHECK:     %[[V_34]] = fir.call @_FortranAioEndIoStatement(%[[V_31]]) : (!fir.ref<i8>) -> i32
140  ! CHECK:   } else {
141  ! CHECK:   }
142  ! CHECK:   return
143  ! CHECK: }
144
145  integer(8), optional :: count
146  integer(8), target :: count_rate_
147  integer(8), pointer :: count_rate
148  integer(8), allocatable :: count_max
149
150  count_rate => count_rate_
151  allocate(count_max)
152  call system_clock(count, count_rate, count_max)
153  if (present(count)) then
154    print*, count, count_rate, count_max
155  else
156    call system_clock(count_rate=count_rate, count_max=count_max)
157    print*, count_rate, count_max
158  endif
159
160  if (present(count)) count = 0
161  count_rate => null()
162  deallocate(count_max)
163  call system_clock(count, count_rate, count_max)
164  if (present(count)) print*, count
165end
166