X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir1opt.lisp;h=4992ea4beba7ff44aa697c74d86d8b47d604b91c;hb=f21e0f5b908263715ea0d867edb64ceba5a3d668;hp=7d4fdd2d274ff0936272a070752d124d082c2189;hpb=d90c8a75da90925a51a587f7bd4d9c494256f68a;p=sbcl.git diff --git a/src/compiler/ir1opt.lisp b/src/compiler/ir1opt.lisp index 7d4fdd2..4992ea4 100644 --- a/src/compiler/ir1opt.lisp +++ b/src/compiler/ir1opt.lisp @@ -166,7 +166,14 @@ :specialized-element-type (array-type-specialized-element-type type)) ;; Simple arrays cannot change at all. type)) + ((union-type-p type) + ;; Conservative union type is an union of conservative types. + (let ((res *empty-type*)) + (dolist (part (union-type-types type) res) + (setf res (type-union res (conservative-type part)))))) (t + ;; Catch-all. + ;; ;; If the type contains some CONS types, the conservative type contains all ;; of them. (when (types-equal-or-intersect type (specifier-type 'cons)) @@ -882,7 +889,7 @@ ;; The VM mostly knows how to handle this. We need ;; to massage the call slightly, though. (transform-call node transform (combination-fun-source-name node))) - (:default + ((:default :maybe) ;; Let transforms have a crack at it. (dolist (x (fun-info-transforms info)) #!+sb-show @@ -2027,6 +2034,7 @@ (flush-lvar-externally-checkable-type arg)) (setf (combination-args use) nil) (flush-dest list) + (flush-combination use) (setf (combination-args node) args)) t)))