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