X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1final.lisp;h=b2c55f085aafcc1f97004c6e7eb5b67ea552ed95;hb=e67cc0f952040723f7d0f37ddb88fe895f4b1464;hp=c78d83a49fba024337960adc6d457806c4df0d6d;hpb=61c18727668ff0c3263a3d363e609d4522d545cc;p=sbcl.git diff --git a/src/compiler/ir1final.lisp b/src/compiler/ir1final.lisp index c78d83a..b2c55f0 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 @@ -123,7 +117,19 @@ (cond ((and (cast-p dest) (not (cast-type-check dest)) (immediately-used-p lvar node)) - (derive-node-type node (cast-asserted-type dest))) + (let ((dtype (node-derived-type node)) + (atype (node-derived-type dest))) + (when (values-types-equal-or-intersect + dtype atype) + ;; 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. + ;; + ;; This is sorta DERIVE-NODE-TYPE, but does not try + ;; to optimize the node. + (setf (node-derived-type node) + (values-type-intersection dtype atype))))) ((and (cast-p node) (eq (cast-type-check node) :external)) (aver (basic-combination-p dest))