xref: /llvm-project/flang/test/Lower/Intrinsics/system_clock.f90 (revision 8586d0330e36b22496f9ba5ed116bc1aac5a1f28)
1*f35f863aSjeanPerier! RUN: bbc --use-desc-for-alloc=false -emit-fir -hlfir=false %s -o - | FileCheck %s
2264d9662SValentin Clement
3264d9662SValentin Clement! CHECK-LABEL: system_clock_test
4264d9662SValentin Clementsubroutine system_clock_test()
5264d9662SValentin Clement  integer(4) :: c
6264d9662SValentin Clement  integer(8) :: m
7264d9662SValentin Clement  real :: r
8264d9662SValentin Clement  ! CHECK-DAG: %[[c:.*]] = fir.alloca i32 {bindc_name = "c"
9264d9662SValentin Clement  ! CHECK-DAG: %[[m:.*]] = fir.alloca i64 {bindc_name = "m"
10264d9662SValentin Clement  ! CHECK-DAG: %[[r:.*]] = fir.alloca f32 {bindc_name = "r"
11264d9662SValentin Clement  ! CHECK: %[[c4:.*]] = arith.constant 4 : i32
124cc9437aSTom Eccles  ! CHECK: %[[Count:.*]] = fir.call @_FortranASystemClockCount(%[[c4]]) {{.*}}: (i32) -> i64
13264d9662SValentin Clement  ! CHECK: %[[Count1:.*]] = fir.convert %[[Count]] : (i64) -> i32
14264d9662SValentin Clement  ! CHECK: fir.store %[[Count1]] to %[[c]] : !fir.ref<i32>
15264d9662SValentin Clement  ! CHECK: %[[c8:.*]] = arith.constant 8 : i32
164cc9437aSTom Eccles  ! CHECK: %[[Rate:.*]] = fir.call @_FortranASystemClockCountRate(%[[c8]]) {{.*}}: (i32) -> i64
17264d9662SValentin Clement  ! CHECK: %[[Rate1:.*]] = fir.convert %[[Rate]] : (i64) -> f32
18264d9662SValentin Clement  ! CHECK: fir.store %[[Rate1]] to %[[r]] : !fir.ref<f32>
19264d9662SValentin Clement  ! CHECK: %[[c8_2:.*]] = arith.constant 8 : i32
204cc9437aSTom Eccles  ! CHECK: %[[Max:.*]] = fir.call @_FortranASystemClockCountMax(%[[c8_2]]) {{.*}}: (i32) -> i64
21264d9662SValentin Clement  ! CHECK: fir.store %[[Max]] to %[[m]] : !fir.ref<i64>
22264d9662SValentin Clement  call system_clock(c, r, m)
23264d9662SValentin Clement! print*, c, r, m
24264d9662SValentin Clement  ! CHECK-NOT: fir.call
25264d9662SValentin Clement  ! CHECK: %[[c8_3:.*]] = arith.constant 8 : i32
264cc9437aSTom Eccles  ! CHECK: %[[Rate:.*]] = fir.call @_FortranASystemClockCountRate(%[[c8_3]]) {{.*}}: (i32) -> i64
27264d9662SValentin Clement  ! CHECK: fir.store %[[Rate]] to %[[m]] : !fir.ref<i64>
28264d9662SValentin Clement  call system_clock(count_rate=m)
29264d9662SValentin Clement  ! CHECK-NOT: fir.call
30264d9662SValentin Clement! print*, m
31264d9662SValentin Clementend subroutine
3270ade047Svdonaldson
3370ade047Svdonaldson! CHECK-LABEL: @_QPss
3470ade047Svdonaldsonsubroutine ss(count)
3570ade047Svdonaldson  ! CHECK:   %[[V_0:[0-9]+]] = fir.alloca !fir.box<!fir.heap<i64>> {bindc_name = "count_max", uniq_name = "_QFssEcount_max"}
3670ade047Svdonaldson  ! CHECK:   %[[V_1:[0-9]+]] = fir.alloca !fir.heap<i64> {uniq_name = "_QFssEcount_max.addr"}
3770ade047Svdonaldson  ! CHECK:   %[[V_2:[0-9]+]] = fir.zero_bits !fir.heap<i64>
3870ade047Svdonaldson  ! CHECK:   fir.store %[[V_2]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
3970ade047Svdonaldson  ! CHECK:   %[[V_3:[0-9]+]] = fir.alloca !fir.box<!fir.ptr<i64>> {bindc_name = "count_rate", uniq_name = "_QFssEcount_rate"}
4070ade047Svdonaldson  ! CHECK:   %[[V_4:[0-9]+]] = fir.alloca !fir.ptr<i64> {uniq_name = "_QFssEcount_rate.addr"}
4170ade047Svdonaldson  ! CHECK:   %[[V_5:[0-9]+]] = fir.zero_bits !fir.ptr<i64>
4270ade047Svdonaldson  ! CHECK:   fir.store %[[V_5]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
4370ade047Svdonaldson  ! CHECK:   %[[V_6:[0-9]+]] = fir.alloca i64 {bindc_name = "count_rate_", fir.target, uniq_name = "_QFssEcount_rate_"}
4470ade047Svdonaldson  ! CHECK:   %[[V_7:[0-9]+]] = fir.convert %[[V_6]] : (!fir.ref<i64>) -> !fir.ptr<i64>
4570ade047Svdonaldson  ! CHECK:   fir.store %[[V_7]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
46cc14bf22STom Eccles  ! CHECK:   %[[V_8:[0-9]+]] = fir.allocmem i64 {fir.must_be_heap = true, uniq_name = "_QFssEcount_max.alloc"}
4770ade047Svdonaldson  ! CHECK:   fir.store %[[V_8]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
4870ade047Svdonaldson  ! CHECK:   %[[V_9:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
4970ade047Svdonaldson  ! CHECK:   %[[V_10:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
5070ade047Svdonaldson  ! CHECK:   %[[V_11:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
5170ade047Svdonaldson  ! CHECK:   fir.if %[[V_11]] {
524cc9437aSTom Eccles  ! CHECK:     %[[V_29:[0-9]+]] = fir.call @_FortranASystemClockCount(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
5370ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %arg0 : !fir.ref<i64>
5470ade047Svdonaldson  ! CHECK:   }
5570ade047Svdonaldson  ! CHECK:   %[[V_12:[0-9]+]] = fir.convert %[[V_9]] : (!fir.ptr<i64>) -> i64
562cb31fe8SjeanPerier  ! CHECK:   %[[V_13:[0-9]+]] = arith.cmpi ne, %[[V_12]], %c0{{.*}} : i64
5770ade047Svdonaldson  ! CHECK:   fir.if %[[V_13]] {
582cb31fe8SjeanPerier  ! CHECK:     %[[V_29:[0-9]+]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
5970ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %[[V_9]] : !fir.ptr<i64>
6070ade047Svdonaldson  ! CHECK:   }
6170ade047Svdonaldson  ! CHECK:   %[[V_14:[0-9]+]] = fir.convert %[[V_10]] : (!fir.heap<i64>) -> i64
622cb31fe8SjeanPerier  ! CHECK:   %[[V_15:[0-9]+]] = arith.cmpi ne, %[[V_14]], %c0{{.*}} : i64
6370ade047Svdonaldson  ! CHECK:   fir.if %[[V_15]] {
644cc9437aSTom Eccles  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
6570ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %[[V_10]] : !fir.heap<i64>
6670ade047Svdonaldson  ! CHECK:   }
6770ade047Svdonaldson  ! CHECK:   %[[V_16:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
6870ade047Svdonaldson  ! CHECK:   fir.if %[[V_16]] {
6970ade047Svdonaldson  ! CHECK:     %[[V_31:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput
7070ade047Svdonaldson  ! CHECK:     %[[V_32:[0-9]+]] = fir.load %arg0 : !fir.ref<i64>
714cc9437aSTom Eccles  ! CHECK:     %[[V_33:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_32]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
7270ade047Svdonaldson  ! CHECK:     %[[V_34:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
7370ade047Svdonaldson  ! CHECK:     %[[V_35:[0-9]+]] = fir.load %[[V_34]] : !fir.ptr<i64>
744cc9437aSTom Eccles  ! CHECK:     %[[V_36:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_35]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
7570ade047Svdonaldson  ! CHECK:     %[[V_37:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
7670ade047Svdonaldson  ! CHECK:     %[[V_38:[0-9]+]] = fir.load %[[V_37]] : !fir.heap<i64>
774cc9437aSTom Eccles  ! CHECK:     %[[V_39:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_38]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
784cc9437aSTom Eccles  ! CHECK:     %[[V_40:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_31]]) {{.*}}: (!fir.ref<i8>) -> i32
7970ade047Svdonaldson  ! CHECK:   } else {
802cb31fe8SjeanPerier  ! CHECK:     %[[V_29:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
8170ade047Svdonaldson  ! CHECK:     %[[V_30:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
822cb31fe8SjeanPerier  ! CHECK:     %[[V_31:[0-9]+]] = fir.convert %[[V_29]] : (!fir.ptr<i64>) -> i64
832cb31fe8SjeanPerier  ! CHECK:     %[[V_32:[0-9]+]] = arith.cmpi ne, %[[V_31]], %c0{{.*}} : i64
8470ade047Svdonaldson  ! CHECK:     fir.if %[[V_32]] {
854cc9437aSTom Eccles  ! CHECK:       %[[V_45:[0-9]+]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
8670ade047Svdonaldson  ! CHECK:       fir.store %[[V_45]] to %[[V_29]] : !fir.ptr<i64>
8770ade047Svdonaldson  ! CHECK:     }
882cb31fe8SjeanPerier  ! CHECK:     %[[V_33:[0-9]+]] = fir.convert %[[V_30]] : (!fir.heap<i64>) -> i64
892cb31fe8SjeanPerier  ! CHECK:     %[[V_34:[0-9]+]] = arith.cmpi ne, %[[V_33]], %c0{{.*}} : i64
9070ade047Svdonaldson  ! CHECK:     fir.if %[[V_34]] {
914cc9437aSTom Eccles  ! CHECK:       %[[V_45]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
9270ade047Svdonaldson  ! CHECK:       fir.store %[[V_45]] to %[[V_30]] : !fir.heap<i64>
9370ade047Svdonaldson  ! CHECK:     }
942cb31fe8SjeanPerier  ! CHECK:     %[[V_37:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput
952cb31fe8SjeanPerier  ! CHECK:     %[[V_38:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
962cb31fe8SjeanPerier  ! CHECK:     %[[V_39:[0-9]+]] = fir.load %[[V_38]] : !fir.ptr<i64>
972cb31fe8SjeanPerier  ! CHECK:     %[[V_40:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_37]], %[[V_39]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
9870ade047Svdonaldson  ! CHECK:     %[[V_41:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
9970ade047Svdonaldson  ! CHECK:     %[[V_42:[0-9]+]] = fir.load %[[V_41]] : !fir.heap<i64>
1004cc9437aSTom Eccles  ! CHECK:     %[[V_43:[0-9]+]] = fir.call @_FortranAioOutputInteger64(%[[V_37]], %[[V_42]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
1014cc9437aSTom Eccles  ! CHECK:     %[[V_44:[0-9]+]] = fir.call @_FortranAioEndIoStatement(%[[V_37]]) {{.*}}: (!fir.ref<i8>) -> i32
10270ade047Svdonaldson  ! CHECK:   }
10370ade047Svdonaldson  ! CHECK:   %[[V_17:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
10470ade047Svdonaldson  ! CHECK:   fir.if %[[V_17]] {
105b90ebbc5SPeter Klausler  ! CHECK:     %[[C_0:c[0-9a-z_]+]] = arith.constant 0 : i64
106b90ebbc5SPeter Klausler  ! CHECK:     fir.store %[[C_0]] to %arg0 : !fir.ref<i64>
10770ade047Svdonaldson  ! CHECK:   }
10870ade047Svdonaldson  ! CHECK:   %[[V_18:[0-9]+]] = fir.zero_bits !fir.ptr<i64>
10970ade047Svdonaldson  ! CHECK:   fir.store %[[V_18]] to %[[V_4]] : !fir.ref<!fir.ptr<i64>>
11070ade047Svdonaldson  ! CHECK:   %[[V_19:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
11170ade047Svdonaldson  ! CHECK:   fir.freemem %[[V_19]] : !fir.heap<i64>
11270ade047Svdonaldson  ! CHECK:   %[[V_20:[0-9]+]] = fir.zero_bits !fir.heap<i64>
11370ade047Svdonaldson  ! CHECK:   fir.store %[[V_20]] to %[[V_1]] : !fir.ref<!fir.heap<i64>>
11470ade047Svdonaldson  ! CHECK:   %[[V_21:[0-9]+]] = fir.load %[[V_4]] : !fir.ref<!fir.ptr<i64>>
11570ade047Svdonaldson  ! CHECK:   %[[V_22:[0-9]+]] = fir.load %[[V_1]] : !fir.ref<!fir.heap<i64>>
11670ade047Svdonaldson  ! CHECK:   %[[V_23:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
11770ade047Svdonaldson  ! CHECK:   fir.if %[[V_23]] {
1184cc9437aSTom Eccles  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCount(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
11970ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %arg0 : !fir.ref<i64>
12070ade047Svdonaldson  ! CHECK:   }
12170ade047Svdonaldson  ! CHECK:   %[[V_24:[0-9]+]] = fir.convert %[[V_21]] : (!fir.ptr<i64>) -> i64
1222cb31fe8SjeanPerier  ! CHECK:   %[[V_25:[0-9]+]] = arith.cmpi ne, %[[V_24]], %c0{{.*}} : i64
12370ade047Svdonaldson  ! CHECK:   fir.if %[[V_25]] {
1244cc9437aSTom Eccles  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountRate(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
12570ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %[[V_21]] : !fir.ptr<i64>
12670ade047Svdonaldson  ! CHECK:   }
12770ade047Svdonaldson  ! CHECK:   %[[V_26:[0-9]+]] = fir.convert %[[V_22]] : (!fir.heap<i64>) -> i64
1282cb31fe8SjeanPerier  ! CHECK:   %[[V_27:[0-9]+]] = arith.cmpi ne, %[[V_26]], %c0{{.*}} : i64
12970ade047Svdonaldson  ! CHECK:   fir.if %[[V_27]] {
1304cc9437aSTom Eccles  ! CHECK:     %[[V_29]] = fir.call @_FortranASystemClockCountMax(%c8{{.*}}_i32) {{.*}}: (i32) -> i64
13170ade047Svdonaldson  ! CHECK:     fir.store %[[V_29]] to %[[V_22]] : !fir.heap<i64>
13270ade047Svdonaldson  ! CHECK:   }
13370ade047Svdonaldson  ! CHECK:   %[[V_28:[0-9]+]] = fir.is_present %arg0 : (!fir.ref<i64>) -> i1
13470ade047Svdonaldson  ! CHECK:   fir.if %[[V_28]] {
13570ade047Svdonaldson  ! CHECK:     %[[V_31]] = fir.call @_FortranAioBeginExternalListOutput
13670ade047Svdonaldson  ! CHECK:     %[[V_32]] = fir.load %arg0 : !fir.ref<i64>
1374cc9437aSTom Eccles  ! CHECK:     %[[V_33]] = fir.call @_FortranAioOutputInteger64(%[[V_31]], %[[V_32]]) {{.*}}: (!fir.ref<i8>, i64) -> i1
1384cc9437aSTom Eccles  ! CHECK:     %[[V_34]] = fir.call @_FortranAioEndIoStatement(%[[V_31]]) {{.*}}: (!fir.ref<i8>) -> i32
13970ade047Svdonaldson  ! CHECK:   }
14070ade047Svdonaldson  ! CHECK:   return
14170ade047Svdonaldson  ! CHECK: }
14270ade047Svdonaldson
14370ade047Svdonaldson  integer(8), optional :: count
14470ade047Svdonaldson  integer(8), target :: count_rate_
14570ade047Svdonaldson  integer(8), pointer :: count_rate
14670ade047Svdonaldson  integer(8), allocatable :: count_max
14770ade047Svdonaldson
14870ade047Svdonaldson  count_rate => count_rate_
14970ade047Svdonaldson  allocate(count_max)
15070ade047Svdonaldson  call system_clock(count, count_rate, count_max)
15170ade047Svdonaldson  if (present(count)) then
15270ade047Svdonaldson    print*, count, count_rate, count_max
15370ade047Svdonaldson  else
15470ade047Svdonaldson    call system_clock(count_rate=count_rate, count_max=count_max)
15570ade047Svdonaldson    print*, count_rate, count_max
15670ade047Svdonaldson  endif
15770ade047Svdonaldson
15870ade047Svdonaldson  if (present(count)) count = 0
15970ade047Svdonaldson  count_rate => null()
16070ade047Svdonaldson  deallocate(count_max)
16170ade047Svdonaldson  call system_clock(count, count_rate, count_max)
16270ade047Svdonaldson  if (present(count)) print*, count
16370ade047Svdonaldsonend
164