From 1f91b8c6eedc12fce03e76ebf8b9c039c5a0a0b4 Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Mon, 30 Sep 2019 17:13:07 +0200 Subject: [PATCH] better immediate type propagation --- lisp/emacs-lisp/comp.el | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 796c130efaa..9f808d2704b 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -1298,16 +1298,25 @@ PRE-LAMBDA and POST-LAMBDA are called in pre or post-order if non nil." ;;; propagate pass specific code. ;; A very basic propagation pass follows. +(defsubst comp-strict-type-of (obj) + "Given OBJ return its type understanding fixnums." + ;; Should be certainly smarter but now we take advantages just from fixnums. + (if (fixnump obj) + 'fixnum + (type-of obj))) + (defun comp-basic-const-propagate () "Propagate simple constants for setimm operands. This can run just once." - (cl-loop for b being each hash-value of (comp-func-blocks comp-func) - do (cl-loop for insn in (comp-block-insns b) - do (pcase insn - (`(setimm ,lval ,_ ,v) - (setf (comp-mvar-const-vld lval) t) - (setf (comp-mvar-constant lval) v) - (setf (comp-mvar-type lval) (type-of v))))))) + (cl-loop + for b being each hash-value of (comp-func-blocks comp-func) + do (cl-loop + for insn in (comp-block-insns b) + do (pcase insn + (`(setimm ,lval ,_ ,v) + (setf (comp-mvar-const-vld lval) t) + (setf (comp-mvar-constant lval) v) + (setf (comp-mvar-type lval) (comp-strict-type-of v))))))) (defsubst comp-mvar-propagate (lval rval) "Propagate into LVAL properties of RVAL." -- 2.39.5