Fix `comp-add-call-cstr' and add a test

* lisp/emacs-lisp/comp.el (comp-add-call-cstr): Fix it.
	* test/src/comp-tests.el (assume-in-loop-1): New test.
	* test/src/comp-test-funcs.el (comp-test-assume-in-loop-1-f): New
	function.
This commit is contained in:
Andrea Corallo 2020-12-19 11:56:15 +01:00
parent 6f3570cd4a
commit 5376563517
3 changed files with 24 additions and 5 deletions

View file

@ -2017,21 +2017,24 @@ TARGET-BB-SYM is the symbol name of the target block."
(pcase insn
(`(set ,lhs (,(pred comp-call-op-p) ,f . ,args))
(when-let ((cstr-f (gethash f comp-known-func-cstr-h)))
(cl-values cstr-f lhs args)))
(cl-values f cstr-f lhs args)))
(`(,(pred comp-call-op-p) ,f . ,args)
(when-let ((cstr-f (gethash f comp-known-func-cstr-h)))
(cl-values cstr-f nil args))))))
(cl-multiple-value-bind (cstr-f lhs args) match
(cl-values f cstr-f nil args))))))
(cl-multiple-value-bind (f cstr-f lhs args) match
(cl-loop
with gen = (comp-lambda-list-gen (comp-cstr-f-args cstr-f))
for arg in args
for gen = (comp-lambda-list-gen (comp-cstr-f-args cstr-f))
for cstr = (funcall gen)
for target = (comp-cond-cstrs-target-mvar arg insn bb)
unless (comp-cstr-p cstr)
do (signal 'native-ice
(list "Incoherent type specifier for function" f))
when (and target
(or (null lhs)
(not (eql (comp-mvar-slot lhs)
(comp-mvar-slot target)))))
do (comp-emit-call-cstr target insn-cell cstr)))))))
do (comp-emit-call-cstr target insn-cell cstr)))))))
(defun comp-add-cstrs (_)
"Rewrite conditional branches adding appropriate 'assume' insns.