diff options
author | Andrea Corallo <akrl@sdf.org> | 2020-11-15 23:31:00 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-11-16 15:32:52 +0100 |
commit | 898f929215cf644c651abf789b564fcbc50ffbdd (patch) | |
tree | b26431fbdeb28c7bc2509cf732c6bb83c375c667 /lisp/emacs-lisp/comp.el | |
parent | 54f2e9c06d599b795af45ab872915887e7649ef2 (diff) | |
download | emacs-898f929215cf644c651abf789b564fcbc50ffbdd.tar.gz emacs-898f929215cf644c651abf789b564fcbc50ffbdd.tar.bz2 emacs-898f929215cf644c651abf789b564fcbc50ffbdd.zip |
Fix nativecomp cond-rw pass
* lisp/emacs-lisp/comp.el (comp-mvar-symbol-p): Improve it.
(comp-cond-rw-func): Fix logic for multiple predecessor on target
block.
* test/src/comp-tests.el (comp-test-cond-rw-1): New test.
* test/src/comp-test-funcs.el (comp-test-cond-rw-1-1-f)
(comp-test-cond-rw-1-2-f): New functions.
Diffstat (limited to 'lisp/emacs-lisp/comp.el')
-rw-r--r-- | lisp/emacs-lisp/comp.el | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 397b0fd70b5..c84c254e585 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -571,9 +571,10 @@ Integer values are handled in the `range' slot.") (> high most-positive-fixnum)) t)))) -(defsubst comp-mvar-symbol-p (mvar) +(defun comp-mvar-symbol-p (mvar) "Return t if MVAR is certainly a symbol." - (equal (comp-mvar-typeset mvar) '(symbol))) + (or (equal (comp-mvar-typeset mvar) '(symbol)) + (cl-every #'symbolp (comp-mvar-valset mvar)))) (defsubst comp-mvar-cons-p (mvar) "Return t if MVAR is certainly a cons." @@ -1999,12 +2000,20 @@ Return the corresponding rhs slot number." ,(and (or 'eq 'eql '= 'equal) test-fn) ,op1 ,op2)) (comment ,_comment-str) (cond-jump ,cond ,(pred comp-mvar-p) ,bb-1 ,_bb-2)) - (when-let ((target-slot1 (comp-cond-rw-target-slot - (comp-mvar-slot op1) (car insns-seq) b))) - (comp-emit-assume target-slot1 op2 bb-1 test-fn)) - (when-let ((target-slot2 (comp-cond-rw-target-slot - (comp-mvar-slot op2) (car insns-seq) b))) - (comp-emit-assume target-slot2 op1 bb-1 test-fn)) + ;; FIXME We guard the target block against having more + ;; then one predecessor. The right fix will be to add a + ;; new dedicated basic block for the assumptions so we + ;; can proceed always. + (when (= (length (comp-block-in-edges + (gethash bb-1 + (comp-func-blocks comp-func)))) + 1) + (when-let ((target-slot1 (comp-cond-rw-target-slot + (comp-mvar-slot op1) (car insns-seq) b))) + (comp-emit-assume target-slot1 op2 bb-1 test-fn)) + (when-let ((target-slot2 (comp-cond-rw-target-slot + (comp-mvar-slot op2) (car insns-seq) b))) + (comp-emit-assume target-slot2 op1 bb-1 test-fn))) (cl-return-from in-the-basic-block)))))) (defun comp-cond-rw (_) |