]> git.eshelyaron.com Git - emacs.git/commitdiff
Add some tests for pure function optimization
authorAndrea Corallo <akrl@sdf.org>
Sun, 5 Jul 2020 22:00:07 +0000 (23:00 +0100)
committerAndrea Corallo <akrl@sdf.org>
Thu, 9 Jul 2020 15:23:31 +0000 (16:23 +0100)
* test/src/comp-tests.el (comp-tests-fw-prop): Fix docstring.
(comp-tests-pure-checker-1, comp-tests-pure-checker-2): New
functions.
(comp-tests-pure): New test testing for pure function
optimization.

test/src/comp-test-pure.el [new file with mode: 0644]
test/src/comp-tests.el

diff --git a/test/src/comp-test-pure.el b/test/src/comp-test-pure.el
new file mode 100644 (file)
index 0000000..f606a44
--- /dev/null
@@ -0,0 +1,40 @@
+;;; comp-test-pure.el --- compilation unit tested by comp-tests.el -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020 Free Software Foundation, Inc.
+
+;; Author: Andrea Corallo <akrl@sdf.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun comp-tests-pure-callee-f (x)
+  (1+ x))
+
+(defun comp-tests-pure-caller-f ()
+  (comp-tests-pure-callee-f 3))
+
+(defun comp-tests-pure-fibn-f (a b count)
+  (if (= count 0)
+      b
+    (comp-tests-pure-fibn-f (+ a b) a (- count 1))))
+
+(defun comp-tests-pure-fibn-entry-f ()
+  (comp-tests-pure-fibn-f 1 0 20))
+
+;;; comp-test-pure.el ends here
index 332facb4cf9ae25830d2aab82462be27d96b0c53..f4bc8156d359589a20a6fc22044616787cfe6b8f 100644 (file)
@@ -662,4 +662,36 @@ CHECKER should always return nil to have a pass."
     (should (subr-native-elisp-p (symbol-function #'comp-tests-fw-prop-1-f)))
     (should (= (comp-tests-fw-prop-1-f) 6))))
 
+(defun comp-tests-pure-checker-1 (_)
+  "Check that inside `comp-tests-pure-caller-f' `comp-tests-pure-callee-f' is
+ folded."
+  (comp-tests-make-insn-checker
+   'comp-tests-pure-caller-f
+   (lambda (insn)
+     (or (comp-tests-mentioned-p 'comp-tests-pure-callee-f insn)
+         (comp-tests-mentioned-p (comp-c-func-name 'comp-tests-pure-callee-f "F" t)
+                                 insn)))))
+
+(defun comp-tests-pure-checker-2 (_)
+  "Check that `comp-tests-pure-fibn-f' is folded."
+  (comp-tests-make-insn-checker
+   'comp-tests-pure-fibn-entry-f
+   (lambda (insn)
+     (or (comp-tests-mentioned-p 'comp-tests-pure-fibn-f insn)
+         (comp-tests-mentioned-p (comp-c-func-name 'comp-tests-pure-fibn-f "F" t)
+                                 insn)))))
+
+(ert-deftest comp-tests-pure ()
+  "Some tests for pure functions optimization."
+  (let ((comp-speed 3)
+        (comp-post-pass-hooks '((comp-final comp-tests-pure-checker-1
+                                            comp-tests-pure-checker-2))))
+    (load (native-compile (concat comp-test-directory "comp-test-pure.el")))
+
+    (should (subr-native-elisp-p (symbol-function #'comp-tests-pure-caller-f)))
+    (should (= (comp-tests-pure-caller-f) 4))
+
+    (should (subr-native-elisp-p (symbol-function #'comp-tests-pure-fibn-entry-f)))
+    (should (= (comp-tests-pure-fibn-entry-f) 6765))))
+
 ;;; comp-tests.el ends here