X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fvop.lisp;h=ae18a61183fca96fff76fe8afd8872c3924384b6;hb=12b1dae1a1ed90c6ffe4d958f1281c1c04a8e89b;hp=4f3b7d39800a00c3c8a54710c02ed526bc6fb1d9;hpb=fc6400512d98021430dcd7d95c4e5535c6fe9b86;p=sbcl.git diff --git a/src/compiler/vop.lisp b/src/compiler/vop.lisp index 4f3b7d3..ae18a61 100644 --- a/src/compiler/vop.lisp +++ b/src/compiler/vop.lisp @@ -14,7 +14,7 @@ ;;; the largest number of TNs whose liveness changes that we can have ;;; in any block -(defconstant local-tn-limit 64) +(def!constant local-tn-limit 64) (deftype local-tn-number () `(integer 0 (,local-tn-limit))) (deftype local-tn-count () `(integer 0 ,local-tn-limit)) @@ -47,7 +47,7 @@ (scs nil :type list) ;; the Lisp type equivalent to this type. If this type could never be ;; returned by PRIMITIVE-TYPE, then this is the NIL (or empty) type - (type (missing-arg) :type ctype) + (specifier (missing-arg) :type type-specifier) ;; the template used to check that an object is of this type. This is a ;; template of one argument and one result, both of primitive-type T. If ;; the argument is of the correct type, then it is delivered into the @@ -59,46 +59,46 @@ ;;;; IR1 annotations used for IR2 conversion -;;; Block-Info +;;; BLOCK-INFO ;;; Holds the IR2-BLOCK structure. If there are overflow blocks, ;;; then this points to the first IR2-BLOCK. The BLOCK-INFO of the ;;; dummy component head and tail are dummy IR2 blocks that begin ;;; and end the emission order thread. ;;; -;;; Component-Info +;;; COMPONENT-INFO ;;; Holds the IR2-COMPONENT structure. ;;; -;;; Continuation-Info -;;; Holds the IR2-Continuation structure. Continuations whose -;;; values aren't used won't have any. +;;; LVAR-INFO +;;; Holds the IR2-LVAR structure. LVARs whose values aren't used +;;; won't have any. XXX ;;; -;;; Cleanup-Info +;;; CLEANUP-INFO ;;; If non-null, then a TN in which the affected dynamic ;;; environment pointer should be saved after the binding is ;;; instantiated. ;;; -;;; Physenv-Info -;;; Holds the Ir2-Physenv structure. +;;; PHYSENV-INFO +;;; Holds the IR2-PHYSENV structure. ;;; -;;; Tail-Set-Info -;;; Holds the Return-Info structure. +;;; TAIL-SET-INFO +;;; Holds the RETURN-INFO structure. ;;; -;;; NLX-Info-Info -;;; Holds the IR2-NLX-Info structure. +;;; NLX-INFO-INFO +;;; Holds the IR2-NLX-INFO structure. ;;; -;;; Leaf-Info +;;; LEAF-INFO ;;; If a non-set lexical variable, the TN that holds the value in ;;; the home environment. If a constant, then the corresponding ;;; constant TN. If an XEP lambda, then the corresponding ;;; Entry-Info structure. ;;; -;;; Basic-Combination-Info +;;; BASIC-COMBINATION-INFO ;;; The template chosen by LTN, or -;;; :FULL if this is definitely a full call. -;;; :FUNNY if this is an oddball thing with IR2-convert. -;;; :LOCAL if this is a local call. +;;; :FULL if this is definitely a full call. +;;; :FUNNY if this is an oddball thing with IR2-convert. +;;; :LOCAL if this is a local call. ;;; -;;; Node-Tail-P +;;; NODE-TAIL-P ;;; After LTN analysis, this is true only in combination nodes that are ;;; truly tail recursive. @@ -106,27 +106,26 @@ ;;; and after IR2 conversion. It is stored in the BLOCK-INFO slot for ;;; the associated block. (defstruct (ir2-block (:include block-annotation) - (:constructor make-ir2-block (block)) - (:copier nil)) + (:constructor make-ir2-block (block)) + (:copier nil)) ;; the IR2-BLOCK's number, which differs from BLOCK's BLOCK-NUMBER ;; if any blocks are split. This is assigned by lifetime analysis. (number nil :type (or index null)) - ;; information about unknown-values continuations that is used by - ;; stack analysis to do stack simulation. An UNKNOWN-VALUES - ;; continuation is PUSHED if its DEST is in another block. - ;; Similarly, a continuation is POPPED if its DEST is in this block - ;; but has its uses elsewhere. The continuations are in the order - ;; that are pushed/popped in the block. Note that the args to a - ;; single MV-Combination appear reversed in POPPED, since we must - ;; effectively pop the last argument first. All pops must come - ;; before all pushes (although internal MV uses may be interleaved.) - ;; POPPED is computed by LTN, and PUSHED is computed by stack - ;; analysis. + ;; information about unknown-values LVARs that is used by stack + ;; analysis to do stack simulation. An UNKNOWN-VALUES LVAR is PUSHED + ;; if its DEST is in another block. Similarly, a LVAR is POPPED if + ;; its DEST is in this block but has its uses elsewhere. The LVARs + ;; are in the order that are pushed/popped in the block. Note that + ;; the args to a single MV-COMBINATION appear reversed in POPPED, + ;; since we must effectively pop the last argument first. All pops + ;; must come before all pushes (although internal MV uses may be + ;; interleaved.) POPPED is computed by LTN, and PUSHED is computed + ;; by stack analysis. (pushed () :type list) (popped () :type list) ;; the result of stack analysis: lists of all the unknown-values - ;; continuations on the stack at the block start and end, topmost - ;; continuation first. + ;; LVARs on the stack at the block start and end, topmost LVAR + ;; first. (start-stack () :type list) (end-stack () :type list) ;; the first and last VOP in this block. If there are none, both @@ -150,24 +149,29 @@ (local-tns (make-array local-tn-limit) :type local-tn-vector) ;; Bit-vectors used during lifetime analysis to keep track of ;; references to local TNs. When indexed by the LTN number, the - ;; index for a TN is non-zero in Written if it is ever written in - ;; the block, and in Live-Out if the first reference is a read. + ;; index for a TN is non-zero in WRITTEN if it is ever written in + ;; the block, and in LIVE-OUT if the first reference is a read. (written (make-array local-tn-limit :element-type 'bit - :initial-element 0) - :type local-tn-bit-vector) + :initial-element 0) + :type local-tn-bit-vector) (live-out (make-array local-tn-limit :element-type 'bit) - :type local-tn-bit-vector) + :type local-tn-bit-vector) ;; This is similar to the above, but is updated by lifetime flow ;; analysis to have a 1 for LTN numbers of TNs live at the end of ;; the block. This takes into account all TNs that aren't :LIVE. (live-in (make-array local-tn-limit :element-type 'bit :initial-element 0) - :type local-tn-bit-vector) + :type local-tn-bit-vector) ;; a thread running through the global-conflicts structures for this ;; block, sorted by TN number (global-tns nil :type (or global-conflicts null)) ;; the assembler label that points to the beginning of the code for ;; this block, or NIL when we haven't assigned a label yet (%label nil) + ;; the assembler label that points to the trampoline for this block, + ;; or NIL if unassigned yet. Only meaningful for local call targets. + (%trampoline-label nil) + ;; T if the preceding block assumes it can drop thru to %label + (dropped-thru-to nil) ;; list of LOCATION-INFO structures describing all the interesting ;; (to the debugger) locations in this block (locations nil :type list)) @@ -180,45 +184,45 @@ (local-tn-count :test (not (zerop local-tn-count))) (%label :test %label)) -;;; An IR2-CONTINUATION structure is used to annotate continuations -;;; that are used as a function result continuation or that receive MVs. -(defstruct (ir2-continuation - (:constructor make-ir2-continuation (primitive-type)) - (:copier nil)) - ;; If this is :DELAYED, then this is a single value continuation for - ;; which the evaluation of the use is to be postponed until the - ;; evaluation of destination. This can be done for ref nodes or - ;; predicates whose destination is an IF. - ;; - ;; If this is :FIXED, then this continuation has a fixed number of - ;; values, with the TNs in LOCS. - ;; - ;; If this is :UNKNOWN, then this is an unknown-values continuation, - ;; using the passing locations in LOCS. - ;; - ;; If this is :UNUSED, then this continuation should never actually - ;; be used as the destination of a value: it is only used - ;; tail-recursively. +;;; An IR2-LVAR structure is used to annotate LVARs that are used as a +;;; function result LVARs or that receive MVs. +(defstruct (ir2-lvar + (:constructor make-ir2-lvar (primitive-type)) + (:copier nil)) + ;; If this is :DELAYED, then this is a single value LVAR for which + ;; the evaluation of the use is to be postponed until the evaluation + ;; of destination. This can be done for ref nodes or predicates + ;; whose destination is an IF. + ;; + ;; If this is :FIXED, then this LVAR has a fixed number of values, + ;; with the TNs in LOCS. + ;; + ;; If this is :UNKNOWN, then this is an unknown-values LVAR, using + ;; the passing locations in LOCS. + ;; + ;; If this is :UNUSED, then this LVAR should never actually be used + ;; as the destination of a value: it is only used tail-recursively. (kind :fixed :type (member :delayed :fixed :unknown :unused)) - ;; The primitive-type of the first value of this continuation. This - ;; is primarily for internal use during LTN, but it also records the + ;; The primitive-type of the first value of this LVAR. This is + ;; primarily for internal use during LTN, but it also records the ;; type restriction on delayed references. In multiple-value ;; contexts, this is null to indicate that it is meaningless. This - ;; is always (primitive-type (continuation-type cont)), which may be - ;; more restrictive than the tn-primitive-type of the value TN. This - ;; is becase the value TN must hold any possible type that could be - ;; computed (before type checking.) + ;; is always (primitive-type (lvar-type cont)), which may be more + ;; restrictive than the tn-primitive-type of the value TN. This is + ;; becase the value TN must hold any possible type that could be + ;; computed (before type checking.) XXX (primitive-type nil :type (or primitive-type null)) - ;; Locations used to hold the values of the continuation. If the - ;; number of values if fixed, then there is one TN per value. If the - ;; number of values is unknown, then this is a two-list of TNs - ;; holding the start of the values glob and the number of values. - ;; Note that since type checking is the responsibility of the values - ;; receiver, these TNs primitive type is only based on the proven - ;; type information. - (locs nil :type list)) + ;; Locations used to hold the values of the LVAR. If the number of + ;; values if fixed, then there is one TN per value. If the number of + ;; values is unknown, then this is a two-list of TNs holding the + ;; start of the values glob and the number of values. Note that + ;; since type checking is the responsibility of the values receiver, + ;; these TNs primitive type is only based on the proven type + ;; information. + (locs nil :type list) + (stack-pointer nil :type (or tn null))) -(defprinter (ir2-continuation) +(defprinter (ir2-lvar) kind primitive-type locs) @@ -240,8 +244,6 @@ ;; SC and OFFSET are already filled in. ;; ;; CONSTANT-TNs are non-packed TNs that represent constants. - ;; :CONSTANT TNs may eventually be converted to :CACHED-CONSTANT - ;; normal TNs. (normal-tns nil :type (or tn null)) (restricted-tns nil :type (or tn null)) (wired-tns nil :type (or tn null)) @@ -274,7 +276,7 @@ ;; Is replaced by the code pointer for the specified function. ;; This is how compiled code (including DEFUN) gets its hands on ;; a function. is the XEP lambda for the called - ;; function; its LEAF-INFO should be an ENTRY-INFO structure. + ;; function; its LEAF-INFO should be an ENTRY-INFO structure. ;; ;; (:label .