(when (funcall (pprint-dispatch-entry-test-fn entry) object)
(return entry)))))
(if entry
- (values (pprint-dispatch-entry-function entry) t)
+ (values (pprint-dispatch-entry-fun entry) t)
(values #'(lambda (stream object)
(output-ugly-object object stream))
nil))))
(handler-case
(progn
(format *error-output*
- "~@<unhandled condition (of type ~S): ~2I~_~A~:>~2%"
+ "~&~@<unhandled condition (of type ~S): ~2I~_~A~:>~2%"
(type-of condition)
condition)
;; Flush *ERROR-OUTPUT* even before the BACKTRACE, so that
- ;; even if we hit an error within BACKTRACE we'll at least
- ;; have the CONDITION printed out before we die.
+ ;; even if we hit an error within BACKTRACE (e.g. a bug in
+ ;; the debugger's own frame-walking code, or a bug in a user
+ ;; PRINT-OBJECT method) we'll at least have the CONDITION
+ ;; printed out before we die.
(finish-output *error-output*)
;; (Where to truncate the BACKTRACE is of course arbitrary, but
;; it seems as though we should at least truncate it somewhere.)
(cond
((and pred
(not (physenv-nlx-info env))
- (not (eq (node-block (lambda-bind (block-home-lambda block)))
- block)))
+ (not (eq (lambda-block (block-home-lambda block)) block)))
(let ((current pred)
(current-num (block-number pred)))
(block DONE
:adjustable t)))
(dolist (fun (component-lambdas component))
(clrhash var-locs)
- (dfuns (cons (label-position
- (block-label (node-block (lambda-bind fun))))
+ (dfuns (cons (label-position (block-label (lambda-block fun)))
(compute-1-debug-fun fun var-locs))))
(let* ((sorted (sort (dfuns) #'< :key #'car))
(fun-map (compute-debug-fun-map sorted)))
(defun check-function-stuff (functional)
(ecase (functional-kind functional)
(:external
- (let ((fun (functional-entry-function functional)))
+ (let ((fun (functional-entry-fun functional)))
(check-function-reached fun functional)
(when (functional-kind fun)
(barf "The function for XEP ~S has kind." functional))
- (unless (eq (functional-entry-function fun) functional)
+ (unless (eq (functional-entry-fun fun) functional)
(barf "bad back-pointer in function for XEP ~S" functional))))
((:let :mv-let :assignment)
(check-function-reached (lambda-home functional) functional)
- (when (functional-entry-function functional)
+ (when (functional-entry-fun functional)
(barf "The LET ~S has entry function." functional))
(unless (member functional (lambda-lets (lambda-home functional)))
(barf "The LET ~S is not in LETs for HOME." functional))
(when (lambda-lets functional)
(barf "LETs in a LET: ~S" functional)))
(:optional
- (when (functional-entry-function functional)
- (barf ":OPTIONAL ~S has an ENTRY-FUNCTION." functional))
+ (when (functional-entry-fun functional)
+ (barf ":OPTIONAL ~S has an ENTRY-FUN." functional))
(let ((ef (lambda-optional-dispatch functional)))
(check-function-reached ef functional)
(unless (or (member functional (optional-dispatch-entry-points ef))
(barf ":OPTIONAL ~S is not an e-p for its OPTIONAL-DISPATCH ~S."
functional ef))))
(:toplevel
- (unless (eq (functional-entry-function functional) functional)
- (barf "The ENTRY-FUNCTION in ~S isn't a self-pointer." functional)))
+ (unless (eq (functional-entry-fun functional) functional)
+ (barf "The ENTRY-FUN in ~S isn't a self-pointer." functional)))
((nil :escape :cleanup)
- (let ((ef (functional-entry-function functional)))
+ (let ((ef (functional-entry-fun functional)))
(when ef
(check-function-reached ef functional)
(unless (eq (functional-kind ef) :external)
- (barf "The ENTRY-FUNCTION in ~S isn't an XEP: ~S."
- functional
- ef)))))
+ (barf "The ENTRY-FUN in ~S isn't an XEP: ~S." functional ef)))))
(:deleted
(return-from check-function-stuff)))
(observe-functional new-fun))
(dolist (fun (component-lambdas c))
(when (eq (functional-kind fun) :external)
- (let ((ef (functional-entry-function fun)))
+ (let ((ef (functional-entry-fun fun)))
(when (optional-dispatch-p ef)
(observe-functional ef))))
(observe-functional fun)
(component (component-head thing))
#| (cloop (loop-head thing))|#
(integer (continuation-block (num-cont thing)))
- (functional (node-block (lambda-bind (main-entry thing))))
+ (functional (lambda-block (main-entry thing)))
(null (error "Bad thing: ~S." thing))
(symbol (block-or-lose (gethash thing *free-functions*)))))
;;; reachable from a non-local exit.
(defun walk-home-call-graph (block component)
(declare (type cblock block) (type component component))
- (let ((home (block-home-lambda block)))
- (if (eq (functional-kind home) :deleted)
+ (let ((home-lambda (block-home-lambda block)))
+ (if (eq (functional-kind home-lambda) :deleted)
component
- (let* ((bind-block (node-block (lambda-bind home)))
- (home-component (block-component bind-block)))
+ (let ((home-component (lambda-component home-lambda)))
(cond ((eq (component-kind home-component) :initial)
- (dfo-scavenge-call-graph home component))
+ (dfo-scavenge-call-graph home-lambda component))
((eq home-component component)
component)
(t
;; are moved to the appropriate newc component tail.
(dolist (toplevel-lambda toplevel-lambdas)
(/show toplevel-lambda)
- (let* ((block (node-block (lambda-bind toplevel-lambda)))
+ (let* ((block (lambda-block toplevel-lambda))
(old-component (block-component block))
(old-component-lambdas (component-lambdas old-component))
(new-component nil))
(let* ((bind (lambda-bind lambda))
(bind-block (node-block bind))
(component (block-component bind-block))
- (result-component
- (block-component (node-block (lambda-bind result-lambda))))
+ (result-component (lambda-component result-lambda))
(result-return-block (node-block (lambda-return result-lambda))))
;; Move blocks into the new COMPONENT, and move any nodes directly
(merge-1-tl-lambda result-lambda lambda)))
(t
(dolist (lambda (rest lambdas))
- (setf (functional-entry-function lambda) nil)
- (delete-component
- (block-component
- (node-block (lambda-bind lambda)))))))
+ (setf (functional-entry-fun lambda) nil)
+ (delete-component (lambda-component lambda)))))
- (values (block-component (node-block (lambda-bind result-lambda)))
- result-lambda)))
+ (values (lambda-component result-lambda) result-lambda)))
(defun compute-entry-info (fun info)
(declare (type clambda fun) (type entry-info info))
(let ((bind (lambda-bind fun))
- (internal-fun (functional-entry-function fun)))
+ (internal-fun (functional-entry-fun fun)))
(setf (entry-info-closure-p info)
(not (null (physenv-closure (lambda-physenv fun)))))
(setf (entry-info-offset info) (gen-label))
(case (functional-kind lambda)
(:external
(unless (lambda-has-external-references-p lambda)
- (let* ((ef (functional-entry-function lambda))
+ (let* ((ef (functional-entry-fun lambda))
(new (make-functional
:kind :toplevel-xep
:info (leaf-info lambda)
;;; a non-standard convention.
(defun use-standard-returns (tails)
(declare (type tail-set tails))
- (let ((funs (tail-set-functions tails)))
+ (let ((funs (tail-set-funs tails)))
(or (and (find-if #'external-entry-point-p funs)
(find-if #'has-full-call-use funs))
(block punt
;;; there is no such function, then be more vague.
(defun return-value-efficiency-note (tails)
(declare (type tail-set tails))
- (let ((funs (tail-set-functions tails)))
+ (let ((funs (tail-set-funs tails)))
(when (policy (lambda-bind (first funs))
(> (max speed space)
inhibit-warnings))
;;; also delete the FUNCTIONAL from *FREE-FUNCTIONS* to eliminate the
;;; possibility that new references might be converted to it.
(defun finalize-xep-definition (fun)
- (let* ((leaf (functional-entry-function fun))
+ (let* ((leaf (functional-entry-fun fun))
(defined-ftype (definition-type leaf)))
(setf (leaf-type leaf) defined-ftype)
(when (leaf-has-source-name-p leaf)
(defun ir1-optimize-return (node)
(declare (type creturn node))
(let* ((tails (lambda-tail-set (return-lambda node)))
- (funs (tail-set-functions tails)))
+ (funs (tail-set-funs tails)))
(collect ((res *empty-type* values-type-union))
(dolist (fun funs)
(let ((return (lambda-return fun)))
(when (type/= (res) (tail-set-type tails))
(setf (tail-set-type tails) (res))
- (dolist (fun (tail-set-functions tails))
+ (dolist (fun (tail-set-funs tails))
(dolist (ref (leaf-refs fun))
(reoptimize-continuation (node-cont ref)))))))
(defun propagate-local-call-args (call fun)
(declare (type combination call) (type clambda fun))
- (unless (or (functional-entry-function fun)
+ (unless (or (functional-entry-fun fun)
(lambda-optional-dispatch fun))
(let* ((vars (lambda-vars fun))
(union (mapcar #'(lambda (arg var)
(res (ir1-convert-lambda-body
forms ()
:debug-name (debug-namify "top level form ~S" form))))
- (setf (functional-entry-function res) res
+ (setf (functional-entry-fun res) res
(functional-arg-documentation res) ()
(functional-kind res) :toplevel)
res)))
:%debug-name debug-name))
(result (or result (make-continuation))))
- ;; This function should fail internal assertions if we didn't set
- ;; up a valid debug name above.
+ ;; just to check: This function should fail internal assertions if
+ ;; we didn't set up a valid debug name above.
;;
;; (In SBCL we try to make everything have a debug name, since we
;; lack the omniscient perspective the original implementors used
(let ((block (continuation-block result)))
(when block
(let ((return (make-return :result result :lambda lambda))
- (tail-set (make-tail-set :functions (list lambda)))
+ (tail-set (make-tail-set :funs (list lambda)))
(dummy (make-continuation)))
(setf (lambda-tail-set lambda) tail-set)
(setf (lambda-return lambda) return)
#!-sb-fluid (declare (inline node-home-lambda))
(the physenv (lambda-physenv (node-home-lambda node))))
-;;; Return the enclosing cleanup for environment of the first or last node
-;;; in BLOCK.
+#!-sb-fluid (declaim (maybe-inline lambda-block))
+(defun lambda-block (clambda)
+ (declare (type clambda clambda))
+ (node-block (lambda-bind clambda)))
+(defun lambda-component (clambda)
+ (declare (inline lambda-block))
+ (block-component (lambda-block clambda)))
+
+;;; Return the enclosing cleanup for environment of the first or last
+;;; node in BLOCK.
(defun block-start-cleanup (block)
(declare (type cblock block))
(node-enclosing-cleanup (continuation-next (block-start block))))
;;; DELETE-REF will handle the deletion.
(defun delete-functional (fun)
(aver (and (null (leaf-refs fun))
- (not (functional-entry-function fun))))
+ (not (functional-entry-fun fun))))
(etypecase fun
(optional-dispatch (delete-optional-dispatch fun))
(clambda (delete-lambda fun)))
;;; (it won't be there before local call analysis, but no matter.) If
;;; the lambda was never referenced, we give a note.
;;;
-;;; If the lambda is an XEP, then we null out the ENTRY-FUNCTION in its
-;;; ENTRY-FUNCTION so that people will know that it is not an entry point
+;;; If the lambda is an XEP, then we null out the ENTRY-FUN in its
+;;; ENTRY-FUN so that people will know that it is not an entry point
;;; anymore.
(defun delete-lambda (leaf)
(declare (type clambda leaf))
(unlink-blocks (node-block return) (component-tail component)))
(setf (component-reanalyze component) t)
(let ((tails (lambda-tail-set leaf)))
- (setf (tail-set-functions tails)
- (delete leaf (tail-set-functions tails)))
+ (setf (tail-set-funs tails)
+ (delete leaf (tail-set-funs tails)))
(setf (lambda-tail-set leaf) nil))
(setf (component-lambdas component)
(delete leaf (component-lambdas component)))))
(when (eq kind :external)
- (let ((fun (functional-entry-function leaf)))
- (setf (functional-entry-function fun) nil)
+ (let ((fun (functional-entry-fun leaf)))
+ (setf (functional-entry-fun fun) nil)
(when (optional-dispatch-p fun)
(delete-optional-dispatch fun)))))
;;; or even converted to a let.
(defun delete-optional-dispatch (leaf)
(declare (type optional-dispatch leaf))
- (let ((entry (functional-entry-function leaf)))
+ (let ((entry (functional-entry-fun leaf)))
(unless (and entry (leaf-refs entry))
(aver (or (not entry) (eq (functional-kind entry) :deleted)))
(setf (functional-kind leaf) :deleted)
(clambda
(ecase (functional-kind leaf)
((nil :let :mv-let :assignment :escape :cleanup)
- (aver (not (functional-entry-function leaf)))
+ (aver (not (functional-entry-fun leaf)))
(delete-lambda leaf))
(:external
(delete-lambda leaf))
(setf (block-delete-p block) t))
(dolist (fun (component-lambdas component))
(setf (functional-kind fun) nil)
- (setf (functional-entry-function fun) nil)
+ (setf (functional-entry-fun fun) nil)
(setf (leaf-refs fun) nil)
(delete-functional fun))
(do-blocks (block component)
((node-tail-p node)
(ir2-convert-tail-local-call node block fun))
(t
- (let ((start (block-label (node-block (lambda-bind fun))))
+ (let ((start (block-label (lambda-block fun)))
(returns (tail-set-info (lambda-tail-set fun)))
(cont (node-cont node)))
(ecase (if returns
(declare (type bind node) (type ir2-block block) (type clambda fun))
(let ((start-label (entry-info-offset (leaf-info fun)))
(env (physenv-info (node-physenv node))))
- (let ((ef (functional-entry-function fun)))
+ (let ((ef (functional-entry-fun fun)))
(cond ((and (optional-dispatch-p ef) (optional-dispatch-more-entry ef))
;; Special case the xep-allocate-frame + copy-more-arg case.
(vop xep-allocate-frame node block start-label t)
(let ((call-set (lambda-tail-set (node-home-lambda call)))
(fun-set (lambda-tail-set new-fun)))
(unless (eq call-set fun-set)
- (let ((funs (tail-set-functions fun-set)))
+ (let ((funs (tail-set-funs fun-set)))
(dolist (fun funs)
(setf (lambda-tail-set fun) call-set))
- (setf (tail-set-functions call-set)
- (nconc (tail-set-functions call-set) funs)))
+ (setf (tail-set-funs call-set)
+ (nconc (tail-set-funs call-set) funs)))
(reoptimize-continuation (return-result return))
t)))))
;;; discover an XEP after the initial local call analyze pass.
(defun make-external-entry-point (fun)
(declare (type functional fun))
- (aver (not (functional-entry-function fun)))
+ (aver (not (functional-entry-fun fun)))
(with-ir1-environment (lambda-bind (main-entry fun))
(let ((res (ir1-convert-lambda (make-xep-lambda-expression fun)
:debug-name (debug-namify
(leaf-debug-name fun)))))
(setf (functional-kind res) :external
(leaf-ever-used res) t
- (functional-entry-function res) fun
- (functional-entry-function fun) res
+ (functional-entry-fun res) fun
+ (functional-entry-fun fun) res
(component-reanalyze *current-component*) t
(component-reoptimize *current-component*) t)
(etypecase fun
(let ((fun (ref-leaf ref)))
(unless (or (external-entry-point-p fun)
(member (functional-kind fun) '(:escape :cleanup)))
- (change-ref-leaf ref (or (functional-entry-function fun)
+ (change-ref-leaf ref (or (functional-entry-fun fun)
(make-external-entry-point fun))))))
\f
;;; Attempt to convert all references to FUN to local calls. The
(let ((kind (functional-kind fun)))
(cond ((member kind '(:deleted :let :mv-let :assignment)))
((and (null (leaf-refs fun)) (eq kind nil)
- (not (functional-entry-function fun)))
+ (not (functional-entry-fun fun)))
(delete-functional fun))
(t
- (when (and new-fun (lambda-p fun))
- (push fun (component-lambdas component)))
+ ;; Fix/check FUN's relationship to COMPONENT-LAMDBAS.
+ (cond ((not (lambda-p fun))
+ ;; Since FUN's not a LAMBDA, this doesn't apply: no-op.
+ (values))
+ (new-fun ; FUN came from NEW-FUNS, hence is new.
+ ;; FUN becomes part of COMPONENT-LAMBDAS now.
+ (aver (not (member fun (component-lambdas component))))
+ (push fun (component-lambdas component)))
+ (t ; FUN's old.
+ ;; FUN should be in COMPONENT-LAMBDAS already.
+ (aver (member fun (component-lambdas component)))))
(locall-analyze-fun-1 fun)
(when (lambda-p fun)
(maybe-let-convert fun)))))))
-
(values))
(defun locall-analyze-clambdas-until-done (clambdas)
(loop
(let ((did-something nil))
(dolist (clambda clambdas)
- (let* ((component (block-component (node-block (lambda-bind clambda))))
+ (let* ((component (lambda-component clambda))
(*all-components* (list component)))
;; The original CMU CL code seemed to implicitly assume that
;; COMPONENT is the only one here. Let's make that explicit.
(lambda-bind (main-entry original-fun))))
component))))
(let ((fun (if (external-entry-point-p original-fun)
- (functional-entry-function original-fun)
+ (functional-entry-fun original-fun)
original-fun))
(*compiler-error-context* call))
(defun convert-mv-call (ref call fun)
(declare (type ref ref) (type mv-combination call) (type functional fun))
(when (and (looks-like-an-mv-bind fun)
- (not (functional-entry-function fun))
+ (not (functional-entry-fun fun))
(= (length (leaf-refs fun)) 1)
(= (length (basic-combination-args call)) 1))
(let ((ep (car (last (optional-dispatch-entry-points fun)))))
;;;; corresponding combination node, making the control transfer
;;;; explicit and allowing LETs to be mashed together into a single
;;;; block. The value of the LET is delivered directly to the
-;;;; original continuation for the call,eliminating the need to
+;;;; original continuation for the call, eliminating the need to
;;;; propagate information from the dummy result continuation.
;;;; -- As far as IR1 optimization is concerned, it is interesting in
;;;; that there is only one expression that the variable can be bound
-;;;; to, and this is easily substitited for.
+;;;; to, and this is easily substituted for.
;;;; -- LETs are interesting to environment analysis and to the back
;;;; end because in most ways a LET can be considered to be "the
;;;; same function" as its home function.
;;;; control transfer, cleanup code must be emitted to remove
;;;; dynamic bindings that are no longer in effect.
-;;; Set up the control transfer to the called lambda. We split the
-;;; call block immediately after the call, and link the head of FUN to
-;;; the call block. The successor block after splitting (where we
-;;; return to) is returned.
+;;; Set up the control transfer to the called CLAMBDA. We split the
+;;; call block immediately after the call, and link the head of
+;;; CLAMBDA to the call block. The successor block after splitting
+;;; (where we return to) is returned.
;;;
;;; If the lambda is is a different component than the call, then we
;;; call JOIN-COMPONENTS. This only happens in block compilation
;;; before FIND-INITIAL-DFO.
-(defun insert-let-body (fun call)
- (declare (type clambda fun) (type basic-combination call))
+(defun insert-let-body (clambda call)
+ (declare (type clambda clambda) (type basic-combination call))
(let* ((call-block (node-block call))
- (bind-block (node-block (lambda-bind fun)))
+ (bind-block (node-block (lambda-bind clambda)))
(component (block-component call-block)))
- (let ((fun-component (block-component bind-block)))
- (unless (eq fun-component component)
+ (let ((clambda-component (block-component bind-block)))
+ (unless (eq clambda-component component)
(aver (eq (component-kind component) :initial))
- (join-components component fun-component)))
+ (join-components component clambda-component)))
(let ((*current-component* component))
(node-ends-block call))
(link-blocks call-block bind-block)
next-block)))
-;;; Remove FUN from the tail set of anything it used to be in the
-;;; same set as; but leave FUN with a valid tail set value of
+;;; Remove CLAMBDA from the tail set of anything it used to be in the
+;;; same set as; but leave CLAMBDA with a valid tail set value of
;;; its own, for the benefit of code which might try to pull
;;; something out of it (e.g. return type).
-(defun depart-from-tail-set (fun)
+(defun depart-from-tail-set (clambda)
;; Until sbcl-0.pre7.37.flaky5.2, we did
- ;; (LET ((TAILS (LAMBDA-TAIL-SET FUN)))
- ;; (SETF (TAIL-SET-FUNCTIONS TAILS)
- ;; (DELETE FUN (TAIL-SET-FUNCTIONS TAILS))))
- ;; (SETF (LAMBDA-TAIL-SET FUN) NIL)
+ ;; (LET ((TAILS (LAMBDA-TAIL-SET CLAMBDA)))
+ ;; (SETF (TAIL-SET-FUNS TAILS)
+ ;; (DELETE CLAMBDA (TAIL-SET-FUNS TAILS))))
+ ;; (SETF (LAMBDA-TAIL-SET CLAMBDA) NIL)
;; here. Apparently the idea behind the (SETF .. NIL) was that since
- ;; TAIL-SET-FUNCTIONS no longer thinks we're in the tail set, it's
+ ;; TAIL-SET-FUNS no longer thinks we're in the tail set, it's
;; inconsistent, and perhaps unsafe, for us to think we're in the
;; tail set. Unfortunately..
;;
;; the now-NILed-out TAIL-SET. So..
;;
;; To deal with this problem, we no longer NIL out
- ;; (LAMBDA-TAIL-SET FUN) here. Instead:
- ;; * If we're the only function in TAIL-SET-FUNCTIONS, it should
+ ;; (LAMBDA-TAIL-SET CLAMBDA) here. Instead:
+ ;; * If we're the only function in TAIL-SET-FUNS, it should
;; be safe to leave ourself linked to it, and it to you.
- ;; * If there are other functions in TAIL-SET-FUNCTIONS, then we're
+ ;; * If there are other functions in TAIL-SET-FUNS, then we're
;; afraid of future optimizations on those functions causing
;; the TAIL-SET object no longer to be valid to describe our
;; return value. Thus, we delete ourselves from that object;
;; one, for ourselves, for the use of later code (e.g.
;; FINALIZE-XEP-DEFINITION) which might want to
;; know about our return type.
- (let* ((old-tail-set (lambda-tail-set fun))
- (old-tail-set-functions (tail-set-functions old-tail-set)))
- (unless (= 1 (length old-tail-set-functions))
- (setf (tail-set-functions old-tail-set)
- (delete fun old-tail-set-functions))
+ (let* ((old-tail-set (lambda-tail-set clambda))
+ (old-tail-set-funs (tail-set-funs old-tail-set)))
+ (unless (= 1 (length old-tail-set-funs))
+ (setf (tail-set-funs old-tail-set)
+ (delete clambda old-tail-set-funs))
(let ((new-tail-set (copy-tail-set old-tail-set)))
- (setf (lambda-tail-set fun) new-tail-set
- (tail-set-functions new-tail-set) (list fun)))))
+ (setf (lambda-tail-set clambda) new-tail-set
+ (tail-set-funs new-tail-set) (list clambda)))))
;; The documentation on TAIL-SET-INFO doesn't tell whether it could
;; remain valid in this case, so we nuke it on the theory that
;; missing information tends to be less dangerous than incorrect
;; information.
- (setf (tail-set-info (lambda-tail-set fun)) nil))
+ (setf (tail-set-info (lambda-tail-set clambda)) nil))
-;;; Handle the environment semantics of LET conversion. We add the
-;;; lambda and its LETs to LETs for the CALL's home function. We merge
-;;; the calls for FUN with the calls for the home function, removing
-;;; FUN in the process. We also merge the ENTRIES.
+;;; Handle the environment semantics of LET conversion. We add CLAMBDA
+;;; and its LETs to LETs for the CALL's home function. We merge the
+;;; calls for CLAMBDA with the calls for the home function, removing
+;;; CLAMBDA in the process. We also merge the ENTRIES.
;;;
;;; We also unlink the function head from the component head and set
;;; COMPONENT-REANALYZE to true to indicate that the DFO should be
;;; recomputed.
-(defun merge-lets (fun call)
+(defun merge-lets (clambda call)
- (declare (type clambda fun) (type basic-combination call))
+ (declare (type clambda clambda) (type basic-combination call))
(let ((component (block-component (node-block call))))
- (unlink-blocks (component-head component) (node-block (lambda-bind fun)))
+ (unlink-blocks (component-head component) (lambda-block clambda))
(setf (component-lambdas component)
- (delete fun (component-lambdas component)))
+ (delete clambda (component-lambdas component)))
(setf (component-reanalyze component) t))
- (setf (lambda-call-lexenv fun) (node-lexenv call))
+ (setf (lambda-call-lexenv clambda) (node-lexenv call))
- (depart-from-tail-set fun)
+ (depart-from-tail-set clambda)
(let* ((home (node-home-lambda call))
(home-env (lambda-physenv home)))
- (push fun (lambda-lets home))
- (setf (lambda-home fun) home)
- (setf (lambda-physenv fun) home-env)
- (let ((lets (lambda-lets fun)))
+ ;; CLAMBDA belongs to HOME now.
+ (push clambda (lambda-lets home))
+ (setf (lambda-home clambda) home)
+ (setf (lambda-physenv clambda) home-env)
+
+ (let ((lets (lambda-lets clambda)))
+ ;; All CLAMBDA's LETs belong to HOME now.
(dolist (let lets)
(setf (lambda-home let) home)
(setf (lambda-physenv let) home-env))
-
(setf (lambda-lets home) (nconc lets (lambda-lets home)))
- (setf (lambda-lets fun) ()))
+ ;; CLAMBDA no longer has an independent existence as an entity
+ ;; which has LETs.
+ (setf (lambda-lets clambda) nil))
+ ;; HOME no longer calls CLAMBDA, and owns all of CLAMBDA's old
+ ;; calls.
(setf (lambda-calls home)
- (delete fun (nunion (lambda-calls fun) (lambda-calls home))))
- (setf (lambda-calls fun) ())
+ (delete clambda
+ (nunion (lambda-calls clambda)
+ (lambda-calls home))))
+ ;; CLAMBDA no longer has an independent existence as an entity
+ ;; which calls things.
+ (setf (lambda-calls clambda) nil)
+ ;; All CLAMBDA's ENTRIES belong to HOME now.
(setf (lambda-entries home)
- (nconc (lambda-entries fun) (lambda-entries home)))
- (setf (lambda-entries fun) ()))
+ (nconc (lambda-entries clambda) (lambda-entries home)))
+ ;; CLAMBDA no longer has an independent existence as an entity
+ ;; with ENTRIES.
+ (setf (lambda-entries clambda) nil))
(values))
(values))
;;; Actually do LET conversion. We call subfunctions to do most of the
-;;; work. We change the CALL's cont to be the continuation heading the
+;;; work. We change the CALL's CONT to be the continuation heading the
;;; bind block, and also do REOPTIMIZE-CONTINUATION on the args and
-;;; Cont so that LET-specific IR1 optimizations get a chance. We blow
+;;; CONT so that LET-specific IR1 optimizations get a chance. We blow
;;; away any entry for the function in *FREE-FUNCTIONS* so that nobody
-;;; will create new reference to it.
+;;; will create new references to it.
(defun let-convert (fun call)
(declare (type clambda fun) (type basic-combination call))
(let ((next-block (if (node-tail-p call)
(move-return-stuff fun call next-block)
(merge-lets fun call)))
-;;; Reoptimize all of Call's args and its result.
+;;; Reoptimize all of CALL's args and its result.
(defun reoptimize-call (call)
(declare (type basic-combination call))
(dolist (arg (basic-combination-args call))
;;; We also don't convert calls to named functions which appear in the
;;; initial component, delaying this until optimization. This
-;;; minimizes the likelyhood that we well let-convert a function which
-;;; may have references added due to later local inline expansion
+;;; minimizes the likelihood that we will LET-convert a function which
+;;; may have references added due to later local inline expansion.
(defun ok-initial-convert-p (fun)
(not (and (leaf-has-source-name-p fun)
- (eq (component-kind
- (block-component
- (node-block (lambda-bind fun))))
+ (eq (component-kind (lambda-component fun))
:initial))))
;;; This function is called when there is some reason to believe that
-;;; the lambda Fun might be converted into a let. This is done after
-;;; local call analysis, and also when a reference is deleted. We only
+;;; CLAMBDA might be converted into a LET. This is done after local
+;;; call analysis, and also when a reference is deleted. We only
;;; convert to a let when the function is a normal local function, has
;;; no XEP, and is referenced in exactly one local call. Conversion is
;;; also inhibited if the only reference is in a block about to be
;;; We don't attempt to convert calls to functions that have an XEP,
;;; since we might be embarrassed later when we want to convert a
;;; newly discovered local call. Also, see OK-INITIAL-CONVERT-P.
-(defun maybe-let-convert (fun)
- (declare (type clambda fun))
- (let ((refs (leaf-refs fun)))
+(defun maybe-let-convert (clambda)
+ (declare (type clambda clambda))
+ (let ((refs (leaf-refs clambda)))
(when (and refs
(null (rest refs))
- (member (functional-kind fun) '(nil :assignment))
- (not (functional-entry-function fun)))
+ (member (functional-kind clambda) '(nil :assignment))
+ (not (functional-entry-fun clambda)))
(let* ((ref-cont (node-cont (first refs)))
(dest (continuation-dest ref-cont)))
(when (and dest
(eq (basic-combination-fun dest) ref-cont)
(eq (basic-combination-kind dest) :local)
(not (block-delete-p (node-block dest)))
- (cond ((ok-initial-convert-p fun) t)
+ (cond ((ok-initial-convert-p clambda) t)
(t
(reoptimize-continuation ref-cont)
nil)))
- (unless (eq (functional-kind fun) :assignment)
- (let-convert fun dest))
+ (unless (eq (functional-kind clambda) :assignment)
+ (let-convert clambda dest))
(reoptimize-call dest)
- (setf (functional-kind fun)
+ (setf (functional-kind clambda)
(if (mv-combination-p dest) :mv-let :let))))
t)))
\f
(fun (combination-lambda call)))
(setf (node-tail-p call) t)
(unlink-blocks block (first (block-succ block)))
- (link-blocks block (node-block (lambda-bind fun)))
+ (link-blocks block (lambda-block fun))
(values t (maybe-convert-to-assignment fun))))))
;;; This is called when we believe it might make sense to convert Fun
(defun maybe-convert-to-assignment (fun)
(declare (type clambda fun))
(when (and (not (functional-kind fun))
- (not (functional-entry-function fun)))
+ (not (functional-entry-fun fun)))
(let ((non-tail nil)
(call-fun nil))
(when (and (dolist (ref (leaf-refs fun) t)
(node-ends-block call)
(let ((block (node-block call)))
(unlink-blocks block (first (block-succ block)))
- (link-blocks block (node-block (lambda-bind callee)))))
+ (link-blocks block (lambda-block callee))))
(values))
;;; Annotate the value continuation.
;;; utilities for extracting COMPONENTs of FUNCTIONALs
-(defun clambda-component (clambda)
- (block-component (node-block (lambda-bind clambda))))
(defun functional-components (f)
(declare (type functional f))
(etypecase f
- (clambda (list (clambda-component f)))
+ (clambda (list (lambda-component f)))
(optional-dispatch (let ((result nil))
(labels ((frob (clambda)
- (pushnew (clambda-component clambda)
+ (pushnew (lambda-component clambda)
result))
(maybe-frob (maybe-clambda)
(when maybe-clambda
(/show "in MAKE-FUNCTIONAL-FROM-TOP-LEVEL-LAMBDA" locall-fun fun component)
(/show (component-lambdas component))
(/show (lambda-calls fun))
- (setf (functional-entry-function fun) locall-fun
+ (setf (functional-entry-fun fun) locall-fun
(functional-kind fun) :external
(functional-has-external-references-p fun) t)
fun)))
:name name
:path path)))
(/show "back in %COMPILE from M-F-FROM-TL-LAMBDA" fun)
- (/show (block-component (node-block (lambda-bind fun))))
- (/show (component-lambdas (block-component (node-block (lambda-bind fun)))))
+ (/show (lambda-component fun) (component-lambdas (lambda-component fun)))
;; FIXME: The compile-it code from here on is sort of a
;; twisted version of the code in COMPILE-TOPLEVEL. It'd be
;; the :LOCALL-ONLY option to IR1-FOR-LAMBDA. Then maybe the
;; whole FUNCTIONAL-KIND=:TOPLEVEL case could go away..)
+ #+nil (break "before LOCALL-ANALYZE-CLAMBDAS-UNTIL-DONE" fun)
(locall-analyze-clambdas-until-done (list fun))
(/show (lambda-calls fun))
#+nil (break "back from LOCALL-ANALYZE-CLAMBDAS-UNTIL-DONE" fun)
(defun compile-load-time-value-lambda (lambdas)
(aver (null (cdr lambdas)))
(let* ((lambda (car lambdas))
- (component (block-component (node-block (lambda-bind lambda)))))
+ (component (lambda-component lambda)))
(when (eql (component-kind component) :toplevel)
(setf (component-name component) (leaf-debug-name lambda))
(compile-component component)
;;; end up tail-recursive causes TAIL-SET merging.
(defstruct (tail-set)
;; a list of all the LAMBDAs in this tail set
- (functions nil :type list)
+ (funs nil :type list)
;; our current best guess of the type returned by these functions.
;; This is the union across all the functions of the return node's
;; RESULT-TYPE, excluding local calls.
;; some info used by the back end
(info nil))
(defprinter (tail-set :identity t)
- functions
+ funs
type
(info :test info))
;;
;; :EXTERNAL
;; an external entry point lambda. The function it is an entry
- ;; for is in the ENTRY-FUNCTION slot.
+ ;; for is in the ENTRY-FUN slot.
;;
;; :TOPLEVEL
;; a top level lambda, holding a compiled top level form.
;; Compiled very much like NIL, but provides an indication of
;; top level context. A :TOPLEVEL lambda should have *no*
- ;; references. Its ENTRY-FUNCTION is a self-pointer.
+ ;; references. Its ENTRY-FUN is a self-pointer.
;;
;; :TOPLEVEL-XEP
;; After a component is compiled, we clobber any top level code
;; :TOPLEVEL lambda (which is its own XEP) this is a self-pointer.
;;
;; With all other kinds, this is null.
- (entry-function nil :type (or functional null))
+ (entry-fun nil :type (or functional null))
;; the value of any inline/notinline declaration for a local function
(inlinep nil :type inlinep)
;; If we have a lambda that can be used as in inline expansion for
t)))
(frob lambda)
(when tails
- (dolist (fun (tail-set-functions tails))
+ (dolist (fun (tail-set-funs tails))
(frob fun))))))
(values))