From: Andrea Corallo Date: Sun, 5 Jul 2020 22:00:07 +0000 (+0100) Subject: Add some tests for pure function optimization X-Git-Tag: emacs-28.0.90~2727^2~524 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a53b446cb021d1afb30b5c86a9b9cb7512dcf55d;p=emacs.git Add some tests for pure function optimization * 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. --- diff --git a/test/src/comp-test-pure.el b/test/src/comp-test-pure.el new file mode 100644 index 00000000000..f606a44a10e --- /dev/null +++ b/test/src/comp-test-pure.el @@ -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 + +;; 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 . + +;;; 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 diff --git a/test/src/comp-tests.el b/test/src/comp-tests.el index 332facb4cf9..f4bc8156d35 100644 --- a/test/src/comp-tests.el +++ b/test/src/comp-tests.el @@ -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