X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fir1final.lisp;h=4f79cf8cf91b95b2ccdd1d59b5e3af5cc01b91ed;hb=079ef9dad558ca07cb8178ef428bf738112174fa;hp=3fa8bd38ba0ba97609897c3a067132ce931b0d32;hpb=ff57884e206ac28660af6af34315bc9b81697f57;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index 3fa8bd3..4f79cf8 100644 --- a/src/compiler/ir1final.lisp +++ b/src/compiler/ir1final.lisp @@ -20,7 +20,7 @@ (defun note-failed-optimization (node failures) (declare (type combination node) (list failures)) (unless (or (node-deleted node) - (not (fun-info-p (combination-kind node)))) + (not (eq :known (combination-kind node)))) (let ((*compiler-error-context* node)) (dolist (failure failures) (let ((what (cdr failure)) @@ -42,7 +42,7 @@ (compiler-notify "~@" + ~2I~_~{~?~^~@:_~}~:>" note (messages)))) ;; As best I can guess, it's OK to fall off the end here ;; because if it's not a VALID-FUNCTION-USE, the user @@ -87,13 +87,7 @@ (type-specifier declared-ftype) (type-specifier defined-ftype))))) (:defined - (setf (info :function :type source-name) defined-ftype))) - (when (fasl-output-p *compile-object*) - (if (member source-name *fun-names-in-this-file* :test #'equal) - (compiler-warn "~@" - source-name) - (push source-name *fun-names-in-this-file*))))))) + (setf (info :function :type source-name) defined-ftype))))))) (values)) ;;; Find all calls in COMPONENT to assumed functions and update the @@ -108,13 +102,34 @@ (eq (info :function :kind name) :function)) (let ((atype (info :function :assumed-type name))) (dolist (ref (leaf-refs var)) - (let ((dest (continuation-dest (node-cont ref)))) + (let ((dest (node-dest ref))) (when (and (eq (node-component ref) component) (combination-p dest) - (eq (continuation-use (basic-combination-fun dest)) ref)) + (eq (lvar-uses (basic-combination-fun dest)) ref)) (setq atype (note-fun-use dest atype))))) (setf (info :function :assumed-type name) atype)))) +;;; Merge CASTs with preceding/following nodes. +(defun ir1-merge-casts (component) + (do-blocks-backwards (block component) + (do-nodes-backwards (node lvar block) + (let ((dest (when lvar (lvar-dest lvar)))) + (cond ((and (cast-p dest) + (not (cast-type-check dest)) + (immediately-used-p lvar node)) + (when (values-types-equal-or-intersect + (node-derived-type node) + (cast-asserted-type dest)) + ;; FIXME: We do not perform pathwise CAST->type-error + ;; conversion, and type errors can later cause + ;; backend failures. On the other hand, this version + ;; produces less efficient code. + (derive-node-type node (cast-asserted-type dest)))) + ((and (cast-p node) + (eq (cast-type-check node) :external)) + (aver (basic-combination-p dest)) + (delete-filter node lvar (cast-value node)))))))) + ;;; Do miscellaneous things that we want to do once all optimization ;;; has been done: ;;; -- Record the derived result type before the back-end trashes the @@ -136,4 +151,7 @@ (maphash (lambda (k v) (note-assumed-types component k v)) *free-funs*) + + (ir1-merge-casts component) + (values))