From 14090f0225ef81d96a52954e87de9b22e11de48d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 10:01:49 -0600
Subject: [PATCH 1/6] rtlib: Implement cpu_time()

---
 src/runtime/impure/lfortran_intrinsic_math.f90 | 13 +++++++++++++
 src/runtime/impure/lfortran_intrinsics.c       |  9 +++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/runtime/impure/lfortran_intrinsic_math.f90 b/src/runtime/impure/lfortran_intrinsic_math.f90
index e246b4e3e9..e3a4f97fc7 100644
--- a/src/runtime/impure/lfortran_intrinsic_math.f90
+++ b/src/runtime/impure/lfortran_intrinsic_math.f90
@@ -990,4 +990,17 @@ end interface
 r = c_zatanh(x)
 end function
 
+! cpu_time ---------------------------------------------------------------------
+
+pure subroutine cpu_time(t)
+real(dp), intent(out) :: t
+interface
+    pure subroutine c_cpu_time(t) bind(c, name="_lfortran_cpu_time")
+    import :: c_double
+    real(c_double), intent(out) :: t
+    end subroutine
+end interface
+call c_cpu_time(t)
+end subroutine
+
 end module
diff --git a/src/runtime/impure/lfortran_intrinsics.c b/src/runtime/impure/lfortran_intrinsics.c
index 8a346a5be9..c3f0351461 100644
--- a/src/runtime/impure/lfortran_intrinsics.c
+++ b/src/runtime/impure/lfortran_intrinsics.c
@@ -566,6 +566,8 @@ LFORTRAN_API void _lfortran_string_init(int size_plus_one, char *s) {
     s[size] = '\0';
 }
 
+// bit  ------------------------------------------------------------------------
+
 LFORTRAN_API int32_t _lfortran_iand32(int32_t x, int32_t y) {
     return x & y;
 }
@@ -605,3 +607,10 @@ LFORTRAN_API int32_t _lfortran_btest32(int32_t i, int pos) {
 LFORTRAN_API int64_t _lfortran_btest64(int64_t i, int pos) {
     return i & (1LL << pos);
 }
+
+// cpu_time  -------------------------------------------------------------------
+
+LFORTRAN_API void _lfortran_cpu_time(double *t) {
+    // TODO:
+    *t = 5.0;
+}
-- 
GitLab


From 771e54e4fbe77360ec08efba78d0409bcefbe94c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 10:14:47 -0600
Subject: [PATCH 2/6] Add a test for cpu_time

---
 integration_tests/cpu_time_01.f90 | 9 +++++++++
 1 file changed, 9 insertions(+)
 create mode 100644 integration_tests/cpu_time_01.f90

diff --git a/integration_tests/cpu_time_01.f90 b/integration_tests/cpu_time_01.f90
new file mode 100644
index 0000000000..0e304e76cd
--- /dev/null
+++ b/integration_tests/cpu_time_01.f90
@@ -0,0 +1,9 @@
+program cpu_time_01
+use iso_fortran_env, only: dp=>real64
+implicit none
+real(dp) :: t1, t2
+call cpu_time(t1)
+print *, "Some computation"
+call cpu_time(t2)
+print *, "Total time: ", t2-t1
+end program
-- 
GitLab


From 5e1934e9a1aedc5d4f78c80de3bb1ed5a9c2c9e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 10:42:20 -0600
Subject: [PATCH 3/6] ASR: handle cpu_time()

---
 src/lfortran/semantics/ast_body_visitor.cpp | 2 +-
 src/lfortran/semantics/ast_common_visitor.h | 5 +++--
 src/lfortran/semantics/comptime_eval.h      | 3 +++
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/lfortran/semantics/ast_body_visitor.cpp b/src/lfortran/semantics/ast_body_visitor.cpp
index 9c5358c277..9e00842ec6 100644
--- a/src/lfortran/semantics/ast_body_visitor.cpp
+++ b/src/lfortran/semantics/ast_body_visitor.cpp
@@ -782,7 +782,7 @@ public:
             original_sym = current_scope->resolve_symbol(sub_name);
         }
         if (!original_sym) {
-            throw SemanticError("Subroutine '" + sub_name + "' not declared", x.base.base.loc);
+            original_sym = resolve_intrinsic_function(x.base.base.loc, sub_name);
         }
         Vec<ASR::expr_t*> args = visit_expr_list(x.m_args, x.n_args);
         Vec<ASR::expr_t*> args_with_mdt;
diff --git a/src/lfortran/semantics/ast_common_visitor.h b/src/lfortran/semantics/ast_common_visitor.h
index f1e639ce6e..161d405d02 100644
--- a/src/lfortran/semantics/ast_common_visitor.h
+++ b/src/lfortran/semantics/ast_common_visitor.h
@@ -1113,10 +1113,11 @@ public:
                 + "' not found in the module '" + module_name + "'",
                 loc);
         } else if (! (ASR::is_a<ASR::GenericProcedure_t>(*t)
-                    || ASR::is_a<ASR::Function_t>(*t))) {
+                    || ASR::is_a<ASR::Function_t>(*t)
+                    || ASR::is_a<ASR::Subroutine_t>(*t))) {
             throw SemanticError("The symbol '" + remote_sym
                 + "' found in the module '" + module_name + "', "
-                + "but it is not a function or a generic function.",
+                + "but it is not a function, subroutine or a generic procedure.",
                 loc);
         }
         char *fn_name = ASRUtils::symbol_name(t);
diff --git a/src/lfortran/semantics/comptime_eval.h b/src/lfortran/semantics/comptime_eval.h
index 7658bb0038..29b977ee6b 100644
--- a/src/lfortran/semantics/comptime_eval.h
+++ b/src/lfortran/semantics/comptime_eval.h
@@ -104,6 +104,9 @@ struct IntrinsicProcedures {
             {"minval", {m_array, &not_implemented, false}},
             {"maxval", {m_array, &not_implemented, false}},
             {"sum", {m_array, &not_implemented, false}},
+
+            // Subroutines
+            {"cpu_time", {m_math, &not_implemented, false}},
         };
     }
 
-- 
GitLab


From d6e134c23fc88bf543816c1b604a6d22b5b6911d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 10:54:22 -0600
Subject: [PATCH 4/6] LLVM: handle intrinsic subroutines

---
 src/lfortran/codegen/asr_to_llvm.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/lfortran/codegen/asr_to_llvm.cpp b/src/lfortran/codegen/asr_to_llvm.cpp
index 360f5c01d5..87b404b9c5 100644
--- a/src/lfortran/codegen/asr_to_llvm.cpp
+++ b/src/lfortran/codegen/asr_to_llvm.cpp
@@ -1834,7 +1834,8 @@ public:
 
     void visit_Subroutine(const ASR::Subroutine_t &x) {
         if (x.m_abi != ASR::abiType::Source &&
-            x.m_abi != ASR::abiType::Interactive) {
+            x.m_abi != ASR::abiType::Interactive &&
+            x.m_abi != ASR::abiType::Intrinsic) {
                 return;
         }
         instantiate_subroutine(x);
@@ -3690,6 +3691,8 @@ public:
             h = get_hash((ASR::asr_t*)s);
         } else if (s->m_abi == ASR::abiType::BindC) {
             h = get_hash((ASR::asr_t*)s);
+        } else if (s->m_abi == ASR::abiType::Intrinsic) {
+            h = get_hash((ASR::asr_t*)s);
         } else {
             throw CodeGenError("ABI type not implemented yet in SubroutineCall.");
         }
-- 
GitLab


From 16cae1884d906811191b948b9b688829462f3586 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 11:05:19 -0600
Subject: [PATCH 5/6] Update tests

---
 tests/reference/asr-intrinsics_04-524ec3a.json    |  2 +-
 tests/reference/asr-intrinsics_04-524ec3a.stdout  |  2 +-
 tests/reference/llvm-associate_04-014f05c.json    |  2 +-
 tests/reference/llvm-associate_04-014f05c.stdout  | 11 +++++++++++
 tests/reference/llvm-intrinsics_02-89bd643.json   |  2 +-
 tests/reference/llvm-intrinsics_02-89bd643.stdout | 11 +++++++++++
 tests/reference/llvm-intrinsics_03-234fe2e.json   |  2 +-
 tests/reference/llvm-intrinsics_03-234fe2e.stdout | 11 +++++++++++
 tests/reference/llvm-intrinsics_04-a26f62c.json   |  2 +-
 tests/reference/llvm-intrinsics_04-a26f62c.stdout | 11 +++++++++++
 tests/reference/llvm-intrinsics_05-d3cf5f5.json   |  2 +-
 tests/reference/llvm-intrinsics_05-d3cf5f5.stdout | 11 +++++++++++
 tests/reference/llvm-intrinsics_06-91045e5.json   |  2 +-
 tests/reference/llvm-intrinsics_06-91045e5.stdout | 11 +++++++++++
 tests/reference/llvm-sin_03-aebf02d.json          |  2 +-
 tests/reference/llvm-sin_03-aebf02d.stdout        | 11 +++++++++++
 16 files changed, 86 insertions(+), 9 deletions(-)

diff --git a/tests/reference/asr-intrinsics_04-524ec3a.json b/tests/reference/asr-intrinsics_04-524ec3a.json
index 91aa23762a..cb69c82cdf 100644
--- a/tests/reference/asr-intrinsics_04-524ec3a.json
+++ b/tests/reference/asr-intrinsics_04-524ec3a.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "asr-intrinsics_04-524ec3a.stdout",
-    "stdout_hash": "2442cf6efbe45feb8d3e31bd50dbd4d5f3399e37a7726fff0a892a1f",
+    "stdout_hash": "efae586a6c772e958b0f999dfc2445003d0e9b6fc0037d7129d19cfb",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/asr-intrinsics_04-524ec3a.stdout b/tests/reference/asr-intrinsics_04-524ec3a.stdout
index a127a7b347..f361430b95 100644
--- a/tests/reference/asr-intrinsics_04-524ec3a.stdout
+++ b/tests/reference/asr-intrinsics_04-524ec3a.stdout
@@ -1 +1 @@
-(TranslationUnit (SymbolTable 1 {intrinsics_04: (Program (SymbolTable 2 {abs: (ExternalSymbol 2 abs 6 abs lfortran_intrinsic_math [] abs Private), abs@dabs: (ExternalSymbol 2 abs@dabs 6 dabs lfortran_intrinsic_math [] dabs Private), dp: (ExternalSymbol 2 dp 4 real64 lfortran_intrinsic_iso_fortran_env [] real64 Public), real: (ExternalSymbol 2 real 164 real lfortran_intrinsic_array [] real Private), tan: (ExternalSymbol 2 tan 6 tan lfortran_intrinsic_math [] tan Private), tan@dtan: (ExternalSymbol 2 tan@dtan 6 dtan lfortran_intrinsic_math [] dtan Private), tan@ztan: (ExternalSymbol 2 tan@ztan 6 ztan lfortran_intrinsic_math [] ztan Private), x: (Variable 2 x Local () () Default (Real 8 []) Source Public Required .false.), z: (Variable 2 z Local () () Default (Complex 8 []) Source Public Required .false.)}) intrinsics_04 [iso_fortran_env] [(= (Var 2 x) (ConstantReal 1.500000 (Real 8 [])) ()) (= (Var 2 x) (FunctionCall 2 tan@dtan 2 tan [(Var 2 x)] [] (Real 8 []) () ()) ()) (Print () [(Var 2 x)]) (If (Compare (FunctionCall 2 abs@dabs 2 abs [(BinOp (Var 2 x) Sub (ConstantReal 14.101420 (Real 8 [])) (Real 8 []) () ())] [] (Real 8 []) () ()) Gt (ConstantReal 0.000000 (Real 8 [])) (Logical 4 []) () ()) [(ErrorStop ())] []) (= (Var 2 z) (ComplexConstructor (ConstantReal 1.500000 (Real 8 [])) (ConstantReal 3.500000 (Real 8 [])) (Complex 8 []) (ConstantComplex 1.500000 3.500000 (Complex 8 []))) ()) (= (Var 2 z) (FunctionCall 2 tan@ztan 2 tan [(Var 2 z)] [] (Complex 8 []) () ()) ()) (Print () [(Var 2 z)]) (If (Compare (FunctionCall 2 abs@dabs 2 abs [(BinOp (ImplicitCast (Var 2 z) ComplexToReal (Real 8 []) ()) Sub (ConstantReal 0.000258 (Real 8 [])) (Real 8 []) () ())] [] (Real 8 []) () ()) Gt (ConstantReal 0.000000 (Real 8 [])) (Logical 4 []) () ()) [(ErrorStop ())] [])]), iso_c_binding: (IntrinsicModule lfortran_intrinsic_iso_c_binding), iso_fortran_env: (IntrinsicModule lfortran_intrinsic_iso_fortran_env), lfortran_intrinsic_array: (IntrinsicModule lfortran_intrinsic_array), lfortran_intrinsic_math: (IntrinsicModule lfortran_intrinsic_math)}) [])
+(TranslationUnit (SymbolTable 1 {intrinsics_04: (Program (SymbolTable 2 {abs: (ExternalSymbol 2 abs 6 abs lfortran_intrinsic_math [] abs Private), abs@dabs: (ExternalSymbol 2 abs@dabs 6 dabs lfortran_intrinsic_math [] dabs Private), dp: (ExternalSymbol 2 dp 4 real64 lfortran_intrinsic_iso_fortran_env [] real64 Public), real: (ExternalSymbol 2 real 166 real lfortran_intrinsic_array [] real Private), tan: (ExternalSymbol 2 tan 6 tan lfortran_intrinsic_math [] tan Private), tan@dtan: (ExternalSymbol 2 tan@dtan 6 dtan lfortran_intrinsic_math [] dtan Private), tan@ztan: (ExternalSymbol 2 tan@ztan 6 ztan lfortran_intrinsic_math [] ztan Private), x: (Variable 2 x Local () () Default (Real 8 []) Source Public Required .false.), z: (Variable 2 z Local () () Default (Complex 8 []) Source Public Required .false.)}) intrinsics_04 [iso_fortran_env] [(= (Var 2 x) (ConstantReal 1.500000 (Real 8 [])) ()) (= (Var 2 x) (FunctionCall 2 tan@dtan 2 tan [(Var 2 x)] [] (Real 8 []) () ()) ()) (Print () [(Var 2 x)]) (If (Compare (FunctionCall 2 abs@dabs 2 abs [(BinOp (Var 2 x) Sub (ConstantReal 14.101420 (Real 8 [])) (Real 8 []) () ())] [] (Real 8 []) () ()) Gt (ConstantReal 0.000000 (Real 8 [])) (Logical 4 []) () ()) [(ErrorStop ())] []) (= (Var 2 z) (ComplexConstructor (ConstantReal 1.500000 (Real 8 [])) (ConstantReal 3.500000 (Real 8 [])) (Complex 8 []) (ConstantComplex 1.500000 3.500000 (Complex 8 []))) ()) (= (Var 2 z) (FunctionCall 2 tan@ztan 2 tan [(Var 2 z)] [] (Complex 8 []) () ()) ()) (Print () [(Var 2 z)]) (If (Compare (FunctionCall 2 abs@dabs 2 abs [(BinOp (ImplicitCast (Var 2 z) ComplexToReal (Real 8 []) ()) Sub (ConstantReal 0.000258 (Real 8 [])) (Real 8 []) () ())] [] (Real 8 []) () ()) Gt (ConstantReal 0.000000 (Real 8 [])) (Logical 4 []) () ()) [(ErrorStop ())] [])]), iso_c_binding: (IntrinsicModule lfortran_intrinsic_iso_c_binding), iso_fortran_env: (IntrinsicModule lfortran_intrinsic_iso_fortran_env), lfortran_intrinsic_array: (IntrinsicModule lfortran_intrinsic_array), lfortran_intrinsic_math: (IntrinsicModule lfortran_intrinsic_math)}) [])
diff --git a/tests/reference/llvm-associate_04-014f05c.json b/tests/reference/llvm-associate_04-014f05c.json
index e6cd8958b4..40d99e4940 100644
--- a/tests/reference/llvm-associate_04-014f05c.json
+++ b/tests/reference/llvm-associate_04-014f05c.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-associate_04-014f05c.stdout",
-    "stdout_hash": "aaf1cb376b3601a012b55c2863eaa77e44a838eab65ebd8d5b43b1e8",
+    "stdout_hash": "feac76e35714b3f375b93df5e840d8667d70e11264c9dcc2166e3832",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-associate_04-014f05c.stdout b/tests/reference/llvm-associate_04-014f05c.stdout
index 9b7c5b56ed..06e953b190 100644
--- a/tests/reference/llvm-associate_04-014f05c.stdout
+++ b/tests/reference/llvm-associate_04-014f05c.stdout
@@ -12,6 +12,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define float @__module_lfortran_intrinsic_math_scos(float* %x) {
 .entry:
   %r = alloca float, align 4
diff --git a/tests/reference/llvm-intrinsics_02-89bd643.json b/tests/reference/llvm-intrinsics_02-89bd643.json
index b7a89a795b..04d1c20a43 100644
--- a/tests/reference/llvm-intrinsics_02-89bd643.json
+++ b/tests/reference/llvm-intrinsics_02-89bd643.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-intrinsics_02-89bd643.stdout",
-    "stdout_hash": "e3df4c9d0a39dfca431b67eddddb185101fcc4883b881e7472c1e6e7",
+    "stdout_hash": "3a58e8a827331a89573aed813ed7d415725533098c26925b0f723730",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-intrinsics_02-89bd643.stdout b/tests/reference/llvm-intrinsics_02-89bd643.stdout
index 8c6a56415b..40e56ac4cf 100644
--- a/tests/reference/llvm-intrinsics_02-89bd643.stdout
+++ b/tests/reference/llvm-intrinsics_02-89bd643.stdout
@@ -10,6 +10,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define float @__module_lfortran_intrinsic_math_ssin(float* %x) {
 .entry:
   %r = alloca float, align 4
diff --git a/tests/reference/llvm-intrinsics_03-234fe2e.json b/tests/reference/llvm-intrinsics_03-234fe2e.json
index f082cad200..a1b723997f 100644
--- a/tests/reference/llvm-intrinsics_03-234fe2e.json
+++ b/tests/reference/llvm-intrinsics_03-234fe2e.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-intrinsics_03-234fe2e.stdout",
-    "stdout_hash": "76089330d7a4ba40fa98cad34058efc166352284762cd6ebfc4fee5b",
+    "stdout_hash": "55a4acd321092a8245e93030624519100161198250d38028413995dc",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-intrinsics_03-234fe2e.stdout b/tests/reference/llvm-intrinsics_03-234fe2e.stdout
index f2fbd8a23e..1226bbfeed 100644
--- a/tests/reference/llvm-intrinsics_03-234fe2e.stdout
+++ b/tests/reference/llvm-intrinsics_03-234fe2e.stdout
@@ -10,6 +10,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define float @__module_lfortran_intrinsic_math_scos(float* %x) {
 .entry:
   %r = alloca float, align 4
diff --git a/tests/reference/llvm-intrinsics_04-a26f62c.json b/tests/reference/llvm-intrinsics_04-a26f62c.json
index 131cd307e2..6df48dbafb 100644
--- a/tests/reference/llvm-intrinsics_04-a26f62c.json
+++ b/tests/reference/llvm-intrinsics_04-a26f62c.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-intrinsics_04-a26f62c.stdout",
-    "stdout_hash": "946cf096d8bb4885452726ed78af7bb325d7b87e1c0c264272a11628",
+    "stdout_hash": "0e72bce2401bbc4775d2090f0a7d925cd05dec47667d28d8726a0c18",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-intrinsics_04-a26f62c.stdout b/tests/reference/llvm-intrinsics_04-a26f62c.stdout
index 30da195172..6a7526f1ac 100644
--- a/tests/reference/llvm-intrinsics_04-a26f62c.stdout
+++ b/tests/reference/llvm-intrinsics_04-a26f62c.stdout
@@ -14,6 +14,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define double @__module_lfortran_intrinsic_math_dabs(double* %x) {
 .entry:
   %r = alloca double, align 8
diff --git a/tests/reference/llvm-intrinsics_05-d3cf5f5.json b/tests/reference/llvm-intrinsics_05-d3cf5f5.json
index 8cf01b68b6..941d7b2514 100644
--- a/tests/reference/llvm-intrinsics_05-d3cf5f5.json
+++ b/tests/reference/llvm-intrinsics_05-d3cf5f5.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-intrinsics_05-d3cf5f5.stdout",
-    "stdout_hash": "cf983d45ed882bc9a9ecf03717e5d04d9d5ea49ad6e11b3bbb16cd91",
+    "stdout_hash": "bc3377099c8da789c7baa6e06c4a3c3111a44c745c9eb432766070ce",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-intrinsics_05-d3cf5f5.stdout b/tests/reference/llvm-intrinsics_05-d3cf5f5.stdout
index c281fae6a6..63a1a8610f 100644
--- a/tests/reference/llvm-intrinsics_05-d3cf5f5.stdout
+++ b/tests/reference/llvm-intrinsics_05-d3cf5f5.stdout
@@ -12,6 +12,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define float @__module_lfortran_intrinsic_math_scosh(float* %x) {
 .entry:
   %r = alloca float, align 4
diff --git a/tests/reference/llvm-intrinsics_06-91045e5.json b/tests/reference/llvm-intrinsics_06-91045e5.json
index a5611d2f36..a4f21d86f2 100644
--- a/tests/reference/llvm-intrinsics_06-91045e5.json
+++ b/tests/reference/llvm-intrinsics_06-91045e5.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-intrinsics_06-91045e5.stdout",
-    "stdout_hash": "c613d1aaa0ae839c1ddd5edd9b1daa41b627f24b2310fa72a23b2a89",
+    "stdout_hash": "752d9db09d43482c9dd821091e04f143296e65a625aff2c958ed240e",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-intrinsics_06-91045e5.stdout b/tests/reference/llvm-intrinsics_06-91045e5.stdout
index 098b118647..d29bd98eb5 100644
--- a/tests/reference/llvm-intrinsics_06-91045e5.stdout
+++ b/tests/reference/llvm-intrinsics_06-91045e5.stdout
@@ -15,6 +15,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define float @__module_lfortran_intrinsic_math_sacos(float* %x) {
 .entry:
   %r = alloca float, align 4
diff --git a/tests/reference/llvm-sin_03-aebf02d.json b/tests/reference/llvm-sin_03-aebf02d.json
index a2ff7243ea..bb2f038e67 100644
--- a/tests/reference/llvm-sin_03-aebf02d.json
+++ b/tests/reference/llvm-sin_03-aebf02d.json
@@ -6,7 +6,7 @@
     "outfile": null,
     "outfile_hash": null,
     "stdout": "llvm-sin_03-aebf02d.stdout",
-    "stdout_hash": "dbf44fbe0b7a84500f3f35fbcadeb5a9a766325559e42b650a639346",
+    "stdout_hash": "d2c07d05d819d28f11f5d7db5b13dd2c9b5580f892574b1aa23667ed",
     "stderr": null,
     "stderr_hash": null,
     "returncode": 0
diff --git a/tests/reference/llvm-sin_03-aebf02d.stdout b/tests/reference/llvm-sin_03-aebf02d.stdout
index 41c712c1f8..4bab89f28b 100644
--- a/tests/reference/llvm-sin_03-aebf02d.stdout
+++ b/tests/reference/llvm-sin_03-aebf02d.stdout
@@ -10,6 +10,17 @@ declare i8* @__module_lfortran_intrinsic_array_char(i32*)
 
 declare void @__module_lfortran_intrinsic_iso_c_binding_c_f_pointer(%c_ptr*, i32*)
 
+define void @__module_lfortran_intrinsic_math_cpu_time(double* %t) {
+.entry:
+  call void @_lfortran_cpu_time(double* %t)
+  br label %return
+
+return:                                           ; preds = %.entry
+  ret void
+}
+
+declare void @_lfortran_cpu_time(double*)
+
 define double @__module_lfortran_intrinsic_math_dsin(double* %x) {
 .entry:
   %r = alloca double, align 8
-- 
GitLab


From c564cbd47722b8aefcddc9edce61255256df6d6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20=C4=8Cert=C3=ADk?= <ondrej@certik.us>
Date: Sun, 17 Oct 2021 11:06:48 -0600
Subject: [PATCH 6/6] Enable the cpu_time_01 test

---
 integration_tests/CMakeLists.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/integration_tests/CMakeLists.txt b/integration_tests/CMakeLists.txt
index 7788c908bc..d006d8a48e 100644
--- a/integration_tests/CMakeLists.txt
+++ b/integration_tests/CMakeLists.txt
@@ -397,3 +397,4 @@ RUN(NAME sin_02 LABELS gfortran llvm)
 RUN(NAME sin_03 LABELS gfortran llvm)
 RUN(NAME sin_04 LABELS gfortran llvm)
 RUN(NAME bits_01 LABELS gfortran llvm)
+RUN(NAME cpu_time_01 LABELS gfortran llvm)
-- 
GitLab