X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fltn.lisp;h=9eaa71fdedeb10a0190c8e1513611a0f94f4f704;hb=b63c4fb9b98fa8188e17ba926e150ba417a74635;hp=751d204cfed28a13638cf0fa88875b4fe960c813;hpb=c0ea1cc4a9f928184b7a7ee65c396b79f1b9ff45;p=sbcl.git diff --git a/src/compiler/ltn.lisp b/src/compiler/ltn.lisp index 751d204..9eaa71f 100644 --- a/src/compiler/ltn.lisp +++ b/src/compiler/ltn.lisp @@ -98,8 +98,12 @@ (cond ((lvar-delayed-leaf lvar) (setf (ir2-lvar-kind info) :delayed)) - (t (setf (ir2-lvar-locs info) - (list (make-normal-tn (ir2-lvar-primitive-type info))))))) + (t (let ((tn (make-normal-tn (ir2-lvar-primitive-type info)))) + (setf (ir2-lvar-locs info) (list tn)) + #!+stack-grows-downward-not-upward + (when (lvar-dynamic-extent lvar) + (setf (ir2-lvar-stack-pointer info) + (make-stack-pointer-tn))))))) (ltn-annotate-casts lvar) (values)) @@ -118,6 +122,7 @@ ;;; reference, otherwise we annotate for a single value. (defun annotate-fun-lvar (lvar &optional (delay t)) (declare (type lvar lvar)) + (aver (not (lvar-dynamic-extent lvar))) (let* ((tn-ptype (primitive-type (lvar-type lvar))) (info (make-ir2-lvar tn-ptype))) (setf (lvar-info lvar) info) @@ -195,6 +200,7 @@ (defun annotate-unknown-values-lvar (lvar) (declare (type lvar lvar)) + (aver (not (lvar-dynamic-extent lvar))) (let ((2lvar (make-ir2-lvar nil))) (setf (ir2-lvar-kind 2lvar) :unknown) (setf (ir2-lvar-locs 2lvar) (make-unknown-values-locations)) @@ -219,9 +225,14 @@ ;;; specified primitive TYPES. (defun annotate-fixed-values-lvar (lvar types) (declare (type lvar lvar) (list types)) - (let ((res (make-ir2-lvar nil))) - (setf (ir2-lvar-locs res) (mapcar #'make-normal-tn types)) - (setf (lvar-info lvar) res)) + (let ((info (make-ir2-lvar nil))) + (setf (ir2-lvar-locs info) (mapcar #'make-normal-tn types)) + (setf (lvar-info lvar) info) + (when (lvar-dynamic-extent lvar) + (aver (proper-list-of-length-p types 1)) + #!+stack-grows-downward-not-upward + (setf (ir2-lvar-stack-pointer info) + (make-stack-pointer-tn)))) (ltn-annotate-casts lvar) (values)) @@ -395,6 +406,17 @@ ltn-policy ; a hack to effectively (DECLARE (IGNORE LTN-POLICY)) (setf (basic-combination-info node) :funny) (setf (node-tail-p node) nil)) + +;;; Make sure that arguments of magic functions are not annotated. +;;; (Otherwise the compiler may dump its internal structures as +;;; constants :-() +(defoptimizer (%pop-values ltn-annotate) ((%lvar) node ltn-policy) + %lvar node ltn-policy) +(defoptimizer (%nip-values ltn-annotate) ((last-nipped last-preserved + &rest moved) + node ltn-policy) + last-nipped last-preserved moved node ltn-policy) + ;;;; known call annotation @@ -695,13 +717,13 @@ (when (losers) (collect ((messages) - (count 0 +)) + (notes 0 +)) (flet ((lose1 (string &rest stuff) (messages string) (messages stuff))) (dolist (loser (losers)) (when (and *efficiency-note-limit* - (>= (count) *efficiency-note-limit*)) + (>= (notes) *efficiency-note-limit*)) (lose1 "etc.") (return)) (let* ((type (template-type loser)) @@ -720,7 +742,7 @@ (t (aver (ltn-policy-safe-p ltn-policy)) (lose1 "can't trust output type assertion under safe policy"))) - (count 1)))) + (notes 1)))) (let ((*compiler-error-context* call)) (compiler-notify "~{~?~^~&~6T~}"