Change the representation of compiled procedures and other entries:
authorGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Mon, 14 Mar 1988 20:59:05 +0000 (20:59 +0000)
committerGuillermo J. Rozas <edu/mit/csail/zurich/gjr>
Mon, 14 Mar 1988 20:59:05 +0000 (20:59 +0000)
They are now just the address of an instruction with a gc offset
preceding the instruction and an arity/type word preceding that.
Compiled closures are done by creating a tiny fake compiled code block
which jumps to the right place and sets up the free variables for
reference.

Uuo style links are now just jump instructions to the correct address.
All relocators have been updated to reflect this change.

Variable caches have no type code. The relocators know about this.

New types:
TC_COMPILED_ENTRY
TC_MANIFEST_CLOSURE
TC_LINKAGE_SECTION

14 files changed:
v7/src/compiler/back/lapgn2.scm
v7/src/compiler/back/lapgn3.scm
v7/src/compiler/back/regmap.scm
v7/src/compiler/fggen/fggen.scm
v7/src/compiler/fgopt/blktyp.scm
v7/src/compiler/fgopt/order.scm
v7/src/compiler/rtlgen/fndblk.scm
v7/src/compiler/rtlgen/rgcomb.scm
v7/src/compiler/rtlgen/rgproc.scm
v7/src/compiler/rtlgen/rgrval.scm
v7/src/compiler/rtlgen/rgstmt.scm
v7/src/compiler/rtlgen/rtlgen.scm
v7/src/compiler/rtlopt/rcse1.scm
v7/src/compiler/rtlopt/rcse2.scm

index 5a5ef7f9ec043be8334cf07289c245d12b97845b..c7c4a4041365a48778a81d4ea53a3a6fd65465a0 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.5 1987/08/28 21:54:15 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn2.scm,v 1.6 1988/03/14 20:44:59 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -59,6 +59,9 @@ MIT in each case. |#
       (register-type? register type)
       (pseudo-register-alias *register-map* type register)))
 
+(define-integrable (is-alias-for-register? potential-alias register)
+  (is-pseudo-register-alias? *register-map* potential-alias register))
+
 (define-integrable (register-alias register type)
   (maybe-need-register! (pseudo-register-alias *register-map* type register)))
 
@@ -72,6 +75,9 @@ MIT in each case. |#
 (define ((register-type-predicate type) register)
   (register-type? register type))
 
+(define-integrable (same-register? reg1 reg2)
+  (= reg1 reg2))
+
 (define-integrable (dead-register? register)
   (memv register *dead-registers*))
 \f
index 3b147283435afb4bd06949856931d594ed108ff1..b1f8acbbd0d77411b6d356cde29c18a65d7c7400 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn3.scm,v 4.1 1987/12/30 06:53:31 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/lapgn3.scm,v 4.2 1988/03/14 20:45:17 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -75,10 +75,29 @@ MIT in each case. |#
 
   (define free-assignment-label (->label assq *interned-assignments*))
 
-  (define free-uuo-link-label (->label assq *interned-uuo-links*))
   ;; End of let-syntax
   )
 
+;; This one is different because a different uuo-link is used for different
+;; numbers of arguments.
+
+(define (free-uuo-link-label name frame-size)
+  (let ((entry (assq name *interned-uuo-links*)))
+    (if entry
+        (let ((place (assv frame-size (cdr entry))))
+          (if place
+              (cdr place)
+              (let ((label (allocate-constant-label)))
+                (set-cdr! entry
+                          (cons (cons frame-size label)
+                                (cdr entry)))
+                label)))
+        (let ((label (allocate-constant-label)))
+          (set! *interned-uuo-links*
+                (cons (list name (cons frame-size label))
+                      *interned-uuo-links*))
+          label))))
+
 (define-integrable (set-current-branches! consequent alternative)
   (set-pblock-consequent-lap-generator! *current-bblock* consequent)
   (set-pblock-alternative-lap-generator! *current-bblock* alternative))
\ No newline at end of file
index d2848075f874e36a77065748992f8136d7168f78..c3cb8802e49e9a4246c425761d710cdb7cb2e03d 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/regmap.scm,v 4.1 1987/12/30 06:53:36 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/back/regmap.scm,v 4.2 1988/03/14 20:45:30 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -369,6 +369,13 @@ REGISTER-RENUMBERs are equal.
         (list-search-positive (map-entry-aliases entry)
           (register-type-predicate type)))))
 
+(define (is-pseudo-register-alias? map maybe-alias register)
+  (let ((entry (map-entries:find-home map register)))
+    (and entry
+        (list-search-positive (map-entry-aliases entry)
+          (lambda (alias)
+            (same-register? maybe-alias alias))))))
+
 (define (save-machine-register map register receiver)
   (let ((entry (map-entries:find-alias map register)))
     (if (and entry
index d406e638ee5c0aeaf16e4d766e152b8e3a181d39..4dd338da1118e9339e3fc7e0785c8d504f1f1df8 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fggen/fggen.scm,v 4.3 1988/01/02 15:17:31 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fggen/fggen.scm,v 4.4 1988/03/14 20:48:00 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -642,16 +642,31 @@ MIT in each case. |#
        (scode/make-combination compiled-error-procedure
                               (cons message irritants))))))
 
+;; For now
+
+(define (compile-recursively expression block)
+  (error "compile-recursively: invoked!" expression))
+
+(define (compile-recursively? block)
+  false)
+
 (define (generate/in-package block continuation expression)
-  (warn "IN-PACKAGE not supported; body will be interpreted" expression)
-  (scode/in-package-components expression
-    (lambda (environment expression)
-      (generate/combination
-       block
-       continuation
-       (scode/make-combination (ucode-primitive scode-eval)
-                              (list (scode/make-quotation expression)
-                                    environment))))))
+  (let ((recursive? (compile-recursively? block)))
+    (if (not recursive?)
+       (warn "dynamic IN-PACKAGE not supported; body will be interpreted"
+             expression))
+    (scode/in-package-components expression
+     (lambda (environment expression)
+       (generate/combination
+       block
+       continuation
+       (scode/make-combination
+        (ucode-primitive scode-eval)
+        (list (if recursive?
+                  (scode/make-constant
+                   (compile-recursively expression false))
+                  (scode/make-quotation expression))
+              environment)))))))
 
 (define (generate/quotation block continuation expression)
   (generate/combination
index 70da01da41bd7ce936603df1942007658a5a1971..24081325be63437fe0977413cf5904d1073af4b7 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/blktyp.scm,v 4.2 1987/12/30 06:43:54 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/blktyp.scm,v 4.3 1988/03/14 20:51:26 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -69,33 +69,38 @@ MIT in each case. |#
   (let ((procedure (block-procedure block))
        (parent (block-parent block)))
     (set-procedure-closure-block! procedure parent)
-    (set-block-parent!
-     block
-     ((find-closure-bindings parent)
-      (list-transform-negative (block-free-variables block)
-       (lambda (lvalue)
-         (eq? (lvalue-known-value lvalue) procedure)))
-      '()))
+    (((find-closure-bindings
+       (lambda (closure-frame-block size)
+        (set-block-parent! block closure-frame-block)
+        (set-procedure-closure-size! procedure size)))
+      parent)
+     (list-transform-negative (block-free-variables block)
+       (lambda (lvalue)
+        (eq? (lvalue-known-value lvalue) procedure)))
+     '())
     (set-block-children! parent (delq! block (block-children parent)))
     (set-block-disowned-children!
      parent
      (cons block (block-disowned-children parent)))))
 \f
-(define (find-closure-bindings block)
-  (lambda (free-variables bound-variables)
-    (if (or (not block) (ic-block? block))
-       (let ((grandparent (and (not (null? free-variables)) block)))
-         (if (null? bound-variables)
-             grandparent
-             (make-closure-block grandparent
-                                 free-variables
-                                 bound-variables
-                                 (and block (block-procedure block)))))
-       (transmit-values
-           (filter-bound-variables (block-bound-variables block)
+(define (find-closure-bindings receiver)
+  (define (find-internal block)
+    (lambda (free-variables bound-variables)
+      (if (or (not block) (ic-block? block))
+         (let ((grandparent (and (not (null? free-variables)) block)))
+           (if (null? bound-variables)
+               (receiver grandparent (if grandparent 1 0))
+               (make-closure-block receiver
+                                   grandparent
                                    free-variables
-                                   bound-variables)
-         (find-closure-bindings (block-parent block))))))
+                                   bound-variables
+                                   (and block (block-procedure block)))))
+         (transmit-values
+          (filter-bound-variables (block-bound-variables block)
+                                  free-variables
+                                  bound-variables)
+          (find-internal (block-parent block))))))
+  find-internal)
 
 (define (filter-bound-variables bindings free-variables bound-variables)
   (cond ((null? bindings)
@@ -109,25 +114,34 @@ MIT in each case. |#
                                 free-variables
                                 bound-variables))))
 
-(define (make-closure-block parent free-variables bound-variables frame)
-  (let ((block (make-block parent 'CLOSURE)))
+;; Note: The use of closure-block-first-offset below implies that
+;; closure frames are not shared between different closures.
+;; This may have to change if we ever do simultaneous closing of multiple
+;; procedures sharing structure.
+
+(define (make-closure-block recvr parent free-variables bound-variables frame)
+  (let ((block (make-block parent 'CLOSURE))
+       (extra (if (and parent (ic-block/use-lookup? parent)) 1 0)))
     (set-block-free-variables! block free-variables)
     (set-block-bound-variables! block bound-variables)
     (set-block-frame! block
                      (and frame
                           (rvalue/procedure? frame)
                           (procedure-name frame)))
-    (set-block-closure-offsets!
-     block
-     (let loop
-        ((variables (block-bound-variables block))
-         (offset (if (and parent (ic-block/use-lookup? parent)) 2 1)))
-       (cond ((null? variables) '())
-            ((lvalue-integrated? (car variables))
-             (loop (cdr variables) offset))
-            (else
-             (cons (cons (car variables) offset)
-                   (loop (cdr variables) (1+ offset)))))))
-    block))
+    (let loop ((variables (block-bound-variables block))
+              (offset (+ closure-block-first-offset extra))
+              (table '())
+              (size extra))
+      (cond ((null? variables)
+            (set-block-closure-offsets! block table)
+            (recvr block size))
+           ((lvalue-integrated? (car variables))
+            (loop (cdr variables) offset table size))
+           (else
+            (loop (cdr variables)
+                  (1+ offset)
+                  (cons (cons (car variables) offset)
+                        table)
+                  (1+ size)))))))
 
 )
\ No newline at end of file
index cbbba837a0fbbc4bddc2176394bf4544ec5092a1..21381b45ff2635423ca13a23adac60a1025ec7b5 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/order.scm,v 4.3 1987/12/31 08:51:44 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/fgopt/order.scm,v 4.4 1988/03/14 20:51:42 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -275,7 +275,10 @@ MIT in each case. |#
          ((rvalue/procedure? callee)
           (case (procedure/type callee)
             ((OPEN-EXTERNAL OPEN-INTERNAL) continuation-type/effect)
-            ((CLOSURE) continuation-type/push)
+            ((CLOSURE)
+             (if (procedure/trivial-closure? callee)
+                 continuation-type/effect
+                 continuation-type/push))
             ((IC) continuation-type/apply)
             (else (error "Unknown procedure type" callee))))
          (else
index 47c4d813e05feb4bfe7de2dbdd3663d968e248d1..fc58c930590062d253f7782a189ac5e0cecad0ae 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/fndblk.scm,v 4.4 1988/01/02 19:12:14 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/fndblk.scm,v 4.5 1988/03/14 20:53:19 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -74,22 +74,26 @@ MIT in each case. |#
 
 (define (find-variable-internal block variable offset if-compiler if-ic)
   (let ((rvalue (lvalue-known-value variable)))
-    (if (and rvalue
-            (rvalue/procedure? rvalue)
-            (procedure/closure? rvalue)
-            (block-ancestor-or-self? block (procedure-block rvalue)))
-       (if-compiler
-        (stack-locative-offset
-         (block-ancestor-or-self->locative block
-                                           (procedure-block rvalue)
-                                           offset)
-         (procedure-closure-offset rvalue)))
-       (find-block/variable block variable offset
-         (lambda (offset-locative)
-           (lambda (block locative)
-             (if-compiler
-              (offset-locative locative (variable-offset block variable)))))
-         if-ic))))
+    (cond ((not
+           (and rvalue
+                (rvalue/procedure? rvalue)
+                (procedure/closure? rvalue)
+                (block-ancestor-or-self? block (procedure-block rvalue))))
+          (find-block/variable block variable offset
+           (lambda (offset-locative)
+             (lambda (block locative)
+               (if-compiler
+                (offset-locative locative (variable-offset block variable)))))
+           if-ic))
+         ((procedure/trivial-closure? rvalue)
+          (if-compiler (make-trivial-closure-cons rvalue)))
+         (else
+          (if-compiler
+           (stack-locative-offset
+            (block-ancestor-or-self->locative block
+                                              (procedure-block rvalue)
+                                              offset)
+            (procedure-closure-offset rvalue)))))))
 \f
 (define (find-definition-variable block lvalue offset)
   (find-block/variable block lvalue offset
@@ -177,16 +181,26 @@ MIT in each case. |#
 (define (find-block/parent-procedure block)
   (enumeration-case block-type (block-type block)
     ((STACK)
-     (if (procedure/closure? (block-procedure block))
-        stack-block/closure-parent-locative
-        (let ((parent (block-parent block)))
-          (if parent
-              (enumeration-case block-type (block-type parent)
-                ((STACK) internal-block/parent-locative)
-                ((IC) stack-block/static-link-locative)
-                ((CLOSURE) (error "Closure parent of open procedure" block))
-                (else (error "Illegal procedure parent" parent)))
-              (error "Block has no parent" block)))))
+     (let ((parent (block-parent block)))
+       (cond ((not (procedure/closure? (block-procedure block)))
+             (if parent
+                 (enumeration-case block-type (block-type parent)
+                  ((STACK) internal-block/parent-locative)
+                  ((IC) stack-block/static-link-locative)
+                  ((CLOSURE) (error "Closure parent of open procedure" block))
+                  (else (error "Illegal procedure parent" parent)))
+                 (error "Block has no parent" block)))
+            ((procedure/trivial-closure? (block-procedure block))
+             trivial-closure/bogus-locative)
+            ((not parent)
+             (error "Block has no parent" block))
+            (else
+             (enumeration-case
+              block-type (block-type parent)
+              ((STACK) (error "Closure has a stack parent" block))
+              ((IC) stack-block/parent-of-dummy-closure-locative)
+              ((CLOSURE) stack-block/closure-parent-locative)
+              (else (error "Illegal procedure parent" parent)))))))
     ((CLOSURE) closure-block/parent-locative)
     ((CONTINUATION) continuation-block/parent-locative)
     (else (error "Illegal parent block type" block))))
@@ -221,14 +235,23 @@ MIT in each case. |#
 
 (define (stack-block/closure-parent-locative block locative)
   (rtl:make-fetch
-   (rtl:locative-offset
-    (rtl:make-fetch
-     (stack-locative-offset
-      locative
-      (procedure-closure-offset (block-procedure block))))
-    1)))
+   (stack-locative-offset
+    locative
+    (procedure-closure-offset (block-procedure block)))))
+
+;; This value should make anyone trying to look at it crash.
+
+(define (trivial-closure/bogus-locative block locative)
+  'TRIVIAL-CLOSURE-BOGUS-LOCATIVE)
 
 (define (closure-block/parent-locative block locative)
-  (rtl:make-fetch (rtl:locative-offset locative 1)))
+  (rtl:make-fetch
+   (rtl:locative-offset locative
+                       closure-block-first-offset)))
+
+(define (stack-block/parent-of-dummy-closure-locative block locative)
+  (closure-block/parent-locative
+   block
+   (stack-block/closure-parent-locative block locative)))
 
 )
\ No newline at end of file
index 2fe69b287dddab6b1d3fba34c240af6d431d2634..d6fb9e83a6915bf78802abc48ffe06fcaad1c235 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgcomb.scm,v 4.3 1988/01/02 17:24:48 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgcomb.scm,v 4.4 1988/03/14 20:53:42 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -76,7 +76,13 @@ MIT in each case. |#
               (case (procedure/type callee)
                 ((OPEN-EXTERNAL) (finish invocation/jump true))
                 ((OPEN-INTERNAL) (finish invocation/jump false))
-                ((CLOSURE) (finish invocation/jump true))
+                ((CLOSURE)
+                 ;; *** For the time being, known lexpr closures are invoked through
+                 ;; apply.  This makes the code simpler and probably does not matter
+                 ;; much. ***
+                 (if (procedure-rest callee)
+                     (finish invocation/apply true)
+                     (finish invocation/jump true)))
                 ((IC) (finish invocation/ic true))
                 (else (error "Unknown procedure type" callee))))
              (else
@@ -181,9 +187,11 @@ MIT in each case. |#
 (define (invocation/cache-reference offset frame-size continuation prefix name)
   (let* ((temp (rtl:make-pseudo-register))
         (cell (rtl:make-fetch temp))
-        (contents (rtl:make-fetch cell)))
-    (let ((n1 (rtl:make-assignment temp (rtl:make-variable-cache name)))
-         (n2
+        (contents (rtl:make-fetch cell))
+        (n1 (rtl:make-assignment temp (rtl:make-variable-cache name))))
+    ;; n1 MUST be bound before the rest.  It flags temp as a
+    ;; register that contains an address.
+    (let ((n2
           (rtl:make-type-test (rtl:make-object->type contents)
                               (ucode-type reference-trap)))
          (n3
index ca41440a0d4f4ca908657deda60e819de6b38f94..55e65a27de3e7f48f4c8c41c163e013feb6ffc04 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgproc.scm,v 4.1 1987/12/04 20:31:27 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgproc.scm,v 4.2 1988/03/14 20:54:09 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -44,17 +44,27 @@ MIT in each case. |#
        (scfg*scfg->scfg!
        (if inline?
            (make-null-cfg)
-           (rtl:make-procedure-heap-check (procedure-label procedure)))
+           (rtl:make-ic-procedure-header (procedure-label procedure)))
        (setup-ic-frame procedure))
        (scfg*scfg->scfg!
-       (cond ((or (procedure-rest procedure)
-                  (and (procedure/closure? procedure)
-                       (not (null? (procedure-optional procedure)))))
-              (rtl:make-setup-lexpr (procedure-label procedure)))
+       (cond ((procedure/closure? procedure)
+              (if (procedure/trivial-closure? procedure)
+                  (with-procedure-arity-encoding
+                   procedure
+                   (lambda (min max)
+                     (rtl:make-procedure-header (procedure-label procedure)
+                                                min max)))
+                  (rtl:make-closure-header (procedure-label procedure))))
              (inline?
               (make-null-cfg))
+             ((procedure-rest procedure)
+              (with-procedure-arity-encoding
+               procedure
+               (lambda (min max)
+                 (rtl:make-procedure-header (procedure-label procedure)
+                                            min max))))
              (else
-              (rtl:make-procedure-heap-check (procedure-label procedure))))
+              (rtl:make-open-procedure-header (procedure-label procedure))))
        (setup-stack-frame procedure)))
    body))
 
@@ -100,7 +110,7 @@ MIT in each case. |#
        (map (lambda (name value)
               (if (and (procedure? value)
                        (procedure/closure? value)
-                       (procedure-closing-block value))
+                       (not (procedure/trivial-closure? value)))
                   (letrec-close block name value)
                   (make-null-cfg)))
             names values))))))
@@ -110,25 +120,34 @@ MIT in each case. |#
       (scfg*->scfg! pushes)
       (setup-bindings (cdr names)
                      (cdr values)
-                     (cons (make-auxiliary-push (car names)
-                                                (letrec-value (car values)))
-                           pushes))))
+                     (letrec-value (car values)
+                      (lambda (scfg expression)
+                        (cons (scfg*scfg->scfg!
+                               scfg
+                               (make-auxiliary-push (car names) expression))
+                              pushes))))))
 
 (define (make-auxiliary-push variable value)
   (rtl:make-push (if (variable-in-cell? variable)
                     (rtl:make-cell-cons value)
                     value)))
 
-(define (letrec-value value)
+(define (letrec-value value recvr)
   (cond ((constant? value)
-        (rtl:make-constant (constant-value value)))
+        (recvr (make-null-cfg)
+               (rtl:make-constant (constant-value value))))
        ((procedure? value)
         (enqueue-procedure! value)
         (case (procedure/type value)
           ((CLOSURE)
-           (make-closure-cons value (rtl:make-constant '())))
+           (if (procedure/trivial-closure? value)
+               (recvr (make-null-cfg)
+                      (make-trivial-closure-cons value))
+               (recvr (make-non-trivial-closure-cons value)
+                      (rtl:interpreter-call-result:enclose))))
           ((IC)
-           (make-ic-cons value))
+           (recvr (make-null-cfg)
+                  (make-ic-cons value)))
           ((OPEN-EXTERNAL OPEN-INTERNAL)
            (error "Letrec value is open procedure" value))
           (else
@@ -137,21 +156,14 @@ MIT in each case. |#
         (error "Unknown letrec binding value" value))))
 
 (define (letrec-close block variable value)
-  (transmit-values (make-closure-environment value 0)
-    (lambda (prefix environment)
-      (scfg*scfg->scfg! prefix
-                       (rtl:make-assignment
-                        (closure-procedure-environment-locative
-                         (find-variable block variable 0
-                           (lambda (locative) locative)
-                           (lambda (nearest-ic-locative name)
-                             (error "Missing closure variable" variable))
-                           (lambda (name)
-                             (error "Missing closure variable" variable))))
-                        environment)))))
-
-(define-integrable (closure-procedure-environment-locative locative)
-  (rtl:locative-offset (rtl:make-fetch locative) 1))
+  (load-closure-environment
+   value 0
+   (find-variable block variable 0
+                 rtl:make-fetch
+                 (lambda (nearest-ic-locative name)
+                   (error "Missing closure variable" variable))
+                 (lambda (name)
+                   (error "Missing closure variable" variable)))))
 
 ;;; end GENERATE/PROCEDURE-HEADER
 )
\ No newline at end of file
index 0e07b1be3f4f9a80208e5a9c159f82a96292915c..0720ffe81aa794a91dfca51c9f3821ba427f0dfa 100644 (file)
@@ -1,9 +1,9 @@
 d3 1
 a4 1
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.3 1987/12/30 09:10:36 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.4 1988/03/14 20:54:28 jinx Exp $
 #| -*-Scheme-*-
 Copyright (c) 1987 Massachusetts Institute of Technology
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.3 1987/12/30 09:10:36 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgrval.scm,v 4.4 1988/03/14 20:54:28 jinx Exp $
 
 Copyright (c) 1988, 1990 Massachusetts Institute of Technology
 
@@ -36,7 +36,7 @@ promotional, or sales literature without prior written consent from
 
 ;;;; RTL Generation: RValues
 ;;; package: (compiler rtl-generator generate/rvalue)
-(package (generate/rvalue make-closure-environment)
+(package (generate/rvalue load-closure-environment)
 
 (define-export (generate/rvalue operand offset scfg*cfg->cfg! generator)
   (transmit-values (generate/rvalue* operand offset)
@@ -80,57 +80,66 @@ promotional, or sales literature without prior written consent from
     (let ((block (reference-block reference))
 (define-method-table-entry 'REFERENCE rvalue-methods
   (lambda (reference)
-      (let ((value (lvalue-known-value lvalue)))
-       (if (and value (not (rvalue/procedure? value)))
-           (generate/rvalue* value offset)
-           (find-variable block lvalue offset
-             (lambda (locative)
-               (expression-value/simple (rtl:make-fetch locative)))
-             (lambda (environment name)
-               (expression-value/temporary
-                (rtl:make-interpreter-call:lookup
-                 environment
-                 (intern-scode-variable! block name)
-                 safe?)
-                (rtl:interpreter-call-result:lookup)))
-             (lambda (name)
-               (generate/cached-reference name safe?))))))))
+    (let ((context (reference-context reference))
+         (safe? (reference-safe? reference)))
+            (lambda ()
+              (find-variable block lvalue offset
+               (lambda (locative)
+                 (expression-value/simple (rtl:make-fetch locative)))
+               (lambda (environment name)
+                 (expression-value/temporary
+                  (rtl:make-interpreter-call:lookup
+                   environment
+                   (intern-scode-variable! block name)
+                   safe?)
+                  (rtl:interpreter-call-result:lookup)))
+               (lambda (name)
+                 (generate/cached-reference name safe?))))))
+       (cond ((not value) (perform-fetch))
+                         lvalue))
+              (generate/rvalue* value offset))
+             ((and (procedure/closure? value)
+                   (procedure/trivial-closure? value))
+              (generate/rvalue* value))
+             (else (perform-fetch)))))))
 \f
 (define (generate/cached-reference name safe?)
   (let ((temp (rtl:make-pseudo-register))
        (result (rtl:make-pseudo-register)))
     (return-2
-     (let ((cell (rtl:make-fetch temp)))
-       (let ((reference (rtl:make-fetch cell)))
-        (let ((n1 (rtl:make-assignment temp (rtl:make-variable-cache name)))
-              (n2 (rtl:make-type-test (rtl:make-object->type reference)
-                                      (ucode-type reference-trap)))
-              (n3 (rtl:make-assignment result reference))
-              (n4 (rtl:make-interpreter-call:cache-reference cell safe?))
-              (n5
-               (rtl:make-assignment
-                result
-                (rtl:interpreter-call-result:cache-reference))))
-          (scfg-next-connect! n1 n2)
-          (pcfg-alternative-connect! n2 n3)
-          (scfg-next-connect! n4 n5)
-          (if safe?
-              (let ((n6 (rtl:make-unassigned-test reference))
-                    ;; Make new copy of n3 to keep CSE happy.
-                    ;; Otherwise control merge will confuse it.
-                    (n7 (rtl:make-assignment result reference)))
-                (pcfg-consequent-connect! n2 n6)
-                (pcfg-consequent-connect! n6 n7)
-                (pcfg-alternative-connect! n6 n4)
-                (make-scfg (cfg-entry-node n1)
-                           (hooks-union (scfg-next-hooks n3)
-                                        (hooks-union (scfg-next-hooks n5)
-                                                     (scfg-next-hooks n7)))))
-              (begin
-                (pcfg-consequent-connect! n2 n4)
-                (make-scfg (cfg-entry-node n1)
-                           (hooks-union (scfg-next-hooks n3)
-                                        (scfg-next-hooks n5))))))))
+     (let* ((cell (rtl:make-fetch temp))
+           (reference (rtl:make-fetch cell))
+           (n1 (rtl:make-assignment temp (rtl:make-variable-cache name))))
+       ;; n1 MUST be bound before the rest.  It flags temp as a
+       ;; register that contains an address.
+       (let ((n2 (rtl:make-type-test (rtl:make-object->type reference)
+                                    (ucode-type reference-trap)))
+            (n3 (rtl:make-assignment result reference))
+            (n4 (rtl:make-interpreter-call:cache-reference cell safe?))
+            (n5
+             (rtl:make-assignment
+              result
+              (rtl:interpreter-call-result:cache-reference))))
+        (scfg-next-connect! n1 n2)
+        (pcfg-alternative-connect! n2 n3)
+        (scfg-next-connect! n4 n5)
+        (if safe?
+            (let ((n6 (rtl:make-unassigned-test reference))
+                  ;; Make new copy of n3 to keep CSE happy.
+                  ;; Otherwise control merge will confuse it.
+                  (n7 (rtl:make-assignment result reference)))
+              (pcfg-consequent-connect! n2 n6)
+              (pcfg-consequent-connect! n6 n7)
+              (pcfg-alternative-connect! n6 n4)
+              (make-scfg (cfg-entry-node n1)
+                         (hooks-union (scfg-next-hooks n3)
+                                      (hooks-union (scfg-next-hooks n5)
+                                                   (scfg-next-hooks n7)))))
+            (begin
+              (pcfg-consequent-connect! n2 n4)
+              (make-scfg (cfg-entry-node n1)
+                         (hooks-union (scfg-next-hooks n3)
+                                      (scfg-next-hooks n5)))))))
                   (make-scfg (cfg-entry-node n2)
                              (hooks-union (scfg-next-hooks n3)
                                           (scfg-next-hooks n5)))))))))
@@ -138,9 +147,18 @@ promotional, or sales literature without prior written consent from
 \f
 (define-method-table-entry 'PROCEDURE rvalue-methods
     (case (procedure/type procedure)
-       (expression-value/transform (make-closure-environment procedure offset)
-        (lambda (environment)
-          (make-closure-cons procedure environment))))
+       (if (procedure/trivial-closure? procedure)
+          (expression-value/simple (make-trivial-closure-cons procedure))
+          (let ((register (rtl:make-pseudo-register)))
+            (return-2
+             (scfg*scfg->scfg!
+              (make-non-trivial-closure-cons procedure)
+              (scfg*scfg->scfg!
+               (rtl:make-assignment register
+                                   (rtl:interpreter-call-result:enclose))
+               (load-closure-environment procedure offset
+                                        (rtl:make-fetch register))))
+             (rtl:make-fetch register)))))
         (else
        (expression-value/simple (make-ic-cons procedure)))
           (make-cons-closure-indirection procedure)))))
@@ -148,12 +166,13 @@ promotional, or sales literature without prior written consent from
        (if (not (procedure-virtual-closure? procedure))
           (error "Reference to open procedure" procedure))
            ;; inside another IC procedure?
-(define-export (make-closure-environment procedure offset)
+(define-export (load-closure-environment procedure offset closure-locative)
   (let ((block (procedure-closing-block procedure)))
 (define (make-non-trivial-closure-cons procedure block**)
-          (expression-value/simple (rtl:make-constant false)))
+          (make-null-cfg))
          ((ic-block? block)
-          (expression-value/simple
+          (rtl:make-assignment
+           (rtl:locative-offset closure-locative closure-block-first-offset)
            (if (ic-block/use-lookup? block)
                (let ((closure-block (procedure-closure-block procedure)))
                  (if (ic-block? closure-block)
@@ -161,39 +180,46 @@ promotional, or sales literature without prior written consent from
                      (closure-ic-locative closure-block block offset)))
                (rtl:make-constant false))))
          ((closure-block? block)
-          (let ((closure-block (procedure-closure-block procedure))
-                (entries (block-closure-offsets block)))
-            (define (loop entries offset)
+          (let ((closure-block (procedure-closure-block procedure)))
+            (define (loop entries code)
             (let loop
-                  '()
-                  (cons (rtl:make-push
-                         (rtl:make-fetch
-                          (let ((variable (caar entries)))
-                            (if (eq? (lvalue-known-value variable)
-                                     (block-procedure closure-block))
-                                (block-closure-locative closure-block offset)
-                                (find-closure-variable closure-block
-                                                       variable
-                                                       offset)))))
-                        (loop (cdr entries) (-1+ offset)))))
-
-            (let ((pushes
-                   (let ((offset (+ offset (length entries))))
-                     (let ((parent (block-parent block))
-                           (pushes (loop entries (-1+ offset))))
-                       (if (and parent (ic-block/use-lookup? parent))
-                           (cons (rtl:make-push
-                                  (closure-ic-locative closure-block
-                                                       parent
-                                                       offset))
-                                 pushes)
-                           pushes)))))
-              (expression-value/temporary
-               (scfg*->scfg!
-                (reverse!
-                 (cons (rtl:make-interpreter-call:enclose (length pushes))
-                       pushes)))
-               (rtl:interpreter-call-result:enclose)))))
+                ((entries (block-closure-offsets block))
+                 (code (load-closure-parent (block-parent block) false)))
+              (if (null? entries)
+                  code
+                                   (reference-context/procedure context))
+                  (loop (cdr entries)
+                        (scfg*scfg->scfg!
+                         (rtl:make-assignment
+                            (cond ;; This is a waste.  It should be integrated.
+                                  ((and value
+                                        (rvalue/procedure? value)
+                                        (procedure/closure? value)
+                                        (procedure/trivial-closure? value))
+                                   (make-trivial-closure-cons value))
+                                  ((not (eq? value (block-procedure
+                                                    closure-block)))
+                                   (rtl:make-fetch
+                                    (find-closure-variable closure-block
+                                                           variable
+                                                           offset)))
+                                  (else
+                                   (rtl:make-fetch
+                                    (block-closure-locative closure-block
+                                                            offset))))))
+                         code))))
+
+            (loop
+             (block-closure-offsets block)
+             (if (let ((parent (block-parent block)))
+                   (and parent (ic-block/use-lookup? parent)))
+                 (rtl:make-assignment
+                  (rtl:locative-offset closure-locative
+                                       closure-block-first-offset)
+                  (if (ic-block? closure-block)
+                      (rtl:make-fetch register:environment)
+                      (closure-ic-locative closure-block block offset)))
+                 (make-null-cfg)))))
          (else
           (error "Unknown block type" block)))))
 
@@ -223,11 +249,29 @@ promotional, or sales literature without prior written consent from
      ;; inside another IC procedure?
      (rtl:make-fetch register:environment))))
 
-(define (make-closure-cons procedure environment)
-  (rtl:make-typed-cons:pair
-   (rtl:make-constant type-code:compiled-procedure)
-   (rtl:make-entry:procedure (procedure-label procedure))
-   environment))                              (find-closure-variable context variable)))))
+(define (make-trivial-closure-cons procedure)
+  (rtl:make-cons-pointer
+   (rtl:make-constant type-code:compiled-entry)
+   (rtl:make-entry:procedure (procedure-label procedure))))
+
+(define (make-non-trivial-closure-cons procedure)
+  (with-procedure-arity-encoding procedure
+   (lambda (min max)
+     (rtl:make-cons-closure
+      (rtl:make-entry:procedure (procedure-label procedure))
+      min
+      max
+      (procedure-closure-size procedure)))))
+
+(define (with-procedure-arity-encoding procedure receiver)
+  (let* ((min
+         (+ (if (procedure/closure? procedure) 1 0)
+            (length (procedure-required-arguments procedure))))
+        (max (+ min (length (procedure-optional procedure)))))
+    (receiver min
+             (if (procedure-rest procedure)
+                 (- (1+ max))
+                 max))))                              (find-closure-variable context variable)))))
                          code)))))
             (error "Unknown block type" block))))))
             (error "Unknown block type" block))))))
index d0538822203cafa66765e29c00fa93a581a2ce26..9a2ab7dd84955947a93728a42f8d3b6dab516c35 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgstmt.scm,v 4.2 1987/12/30 07:10:38 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgstmt.scm,v 4.3 1988/03/14 20:55:03 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -59,26 +59,28 @@ MIT in each case. |#
                (generate/cached-assignment name expression))))))))
 
 (define (generate/cached-assignment name value)
-  (let ((temp (rtl:make-pseudo-register)))
-    (let ((cell (rtl:make-fetch temp)))
-      (let ((contents (rtl:make-fetch cell)))
-       (let ((n1 (rtl:make-assignment temp (rtl:make-assignment-cache name)))
-             (n2 (rtl:make-type-test (rtl:make-object->type contents)
-                                     (ucode-type reference-trap)))
-             (n3 (rtl:make-unassigned-test contents))
-             (n4 (rtl:make-assignment cell value))
-             (n5 (rtl:make-interpreter-call:cache-assignment cell value))
-             ;; Copy prevents premature control merge which confuses CSE
-             (n6 (rtl:make-assignment cell value)))
-         (scfg-next-connect! n1 n2)
-         (pcfg-consequent-connect! n2 n3)
-         (pcfg-alternative-connect! n2 n4)
-         (pcfg-consequent-connect! n3 n6)
-         (pcfg-alternative-connect! n3 n5)
-         (make-scfg (cfg-entry-node n1)
-                    (hooks-union (scfg-next-hooks n4)
-                                 (hooks-union (scfg-next-hooks n5)
-                                              (scfg-next-hooks n6)))))))))
+  (let* ((temp (rtl:make-pseudo-register))
+        (cell (rtl:make-fetch temp))
+        (contents (rtl:make-fetch cell))
+        (n1 (rtl:make-assignment temp (rtl:make-assignment-cache name))))
+    ;; n1 MUST be bound before the rest.  It flags temp as a
+    ;; register that contains an address.
+    (let ((n2 (rtl:make-type-test (rtl:make-object->type contents)
+                                 (ucode-type reference-trap)))
+         (n3 (rtl:make-unassigned-test contents))
+         (n4 (rtl:make-assignment cell value))
+         (n5 (rtl:make-interpreter-call:cache-assignment cell value))
+         ;; Copy prevents premature control merge which confuses CSE
+         (n6 (rtl:make-assignment cell value)))
+      (scfg-next-connect! n1 n2)
+      (pcfg-consequent-connect! n2 n3)
+      (pcfg-alternative-connect! n2 n4)
+      (pcfg-consequent-connect! n3 n6)
+      (pcfg-alternative-connect! n3 n5)
+      (make-scfg (cfg-entry-node n1)
+                (hooks-union (scfg-next-hooks n4)
+                             (hooks-union (scfg-next-hooks n5)
+                                          (scfg-next-hooks n6)))))))
 
 (define (generate/definition definition)
   (let ((block (definition-block definition))
@@ -205,23 +207,25 @@ MIT in each case. |#
             (generate/node alternative))))))
 
 (define (generate/cached-unassigned? name)
-  (let ((temp (rtl:make-pseudo-register)))
-    (let ((cell (rtl:make-fetch temp)))
-      (let ((reference (rtl:make-fetch cell)))
-       (let ((n1 (rtl:make-assignment temp (rtl:make-variable-cache name)))
-             (n2 (rtl:make-type-test (rtl:make-object->type reference)
-                                     (ucode-type reference-trap)))
-             (n3 (rtl:make-unassigned-test reference))
-             (n4 (rtl:make-interpreter-call:cache-unassigned? cell))
-             (n5
-              (rtl:make-true-test
-               (rtl:interpreter-call-result:cache-unassigned?))))
-         (scfg-next-connect! n1 n2)
-         (pcfg-consequent-connect! n2 n3)
-         (pcfg-alternative-connect! n3 n4)
-         (scfg-next-connect! n4 n5)
-         (make-pcfg (cfg-entry-node n1)
-                    (hooks-union (pcfg-consequent-hooks n3)
-                                 (pcfg-consequent-hooks n5))
-                    (hooks-union (pcfg-alternative-hooks n2)
-                                 (pcfg-alternative-hooks n5))))))))
\ No newline at end of file
+  (let* ((temp (rtl:make-pseudo-register))
+        (cell (rtl:make-fetch temp))
+        (reference (rtl:make-fetch cell))
+        (n1 (rtl:make-assignment temp (rtl:make-variable-cache name))))
+    ;; n1 MUST be bound before the rest.  It flags temp as a
+    ;; register that contains an address.
+    (let ((n2 (rtl:make-type-test (rtl:make-object->type reference)
+                                 (ucode-type reference-trap)))
+         (n3 (rtl:make-unassigned-test reference))
+         (n4 (rtl:make-interpreter-call:cache-unassigned? cell))
+         (n5
+          (rtl:make-true-test
+           (rtl:interpreter-call-result:cache-unassigned?))))
+      (scfg-next-connect! n1 n2)
+      (pcfg-consequent-connect! n2 n3)
+      (pcfg-alternative-connect! n3 n4)
+      (scfg-next-connect! n4 n5)
+      (make-pcfg (cfg-entry-node n1)
+                (hooks-union (pcfg-consequent-hooks n3)
+                             (pcfg-consequent-hooks n5))
+                (hooks-union (pcfg-alternative-hooks n2)
+                             (pcfg-alternative-hooks n5))))))
\ No newline at end of file
index b15c072b2b4799650ced9d470a2536940c855d60..fb18cf934b79c55912f431696666db1bdab04434 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rtlgen.scm,v 4.3 1988/02/17 19:12:51 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rtlgen.scm,v 4.4 1988/03/14 20:55:24 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -130,7 +130,7 @@ MIT in each case. |#
           (scfg-append!
            (if (continuation/avoid-check? continuation)
                (rtl:make-continuation-entry label)
-               (rtl:make-continuation-heap-check label))
+               (rtl:make-continuation-header label))
            (generate/continuation-entry/ic-block continuation)
            (if (block/dynamic-link?
                 (continuation/closing-block continuation))
index 7d0ce252ebe191328fbd8ad3c416a9ff2aa0b907..efbc8528dcdf3a5bd4ab32ee7c04710cfdb91e84 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 4.5 1988/02/17 19:14:05 jinx Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 4.6 1988/03/14 20:58:41 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -260,22 +260,20 @@ MIT in each case. |#
   'DONE)
 
 (define-cse-method 'POP-RETURN method/noop)
-(define-cse-method 'PROCEDURE-HEAP-CHECK method/noop)
-(define-cse-method 'CONTINUATION-HEAP-CHECK method/noop)
+
 (define-cse-method 'CONTINUATION-ENTRY method/noop)
+(define-cse-method 'CONTINUATION-HEADER method/noop)
+(define-cse-method 'IC-PROCEDURE-HEADER method/noop)
+(define-cse-method 'OPEN-PROCEDURE-HEADER method/noop)
+(define-cse-method 'PROCEDURE-HEADER method/noop)
+(define-cse-method 'CLOSURE-HEADER method/noop)
+
 (define-cse-method 'INVOCATION:APPLY method/noop)
 (define-cse-method 'INVOCATION:JUMP method/noop)
 (define-cse-method 'INVOCATION:LEXPR method/noop)
+(define-cse-method 'INVOCATION:UUO-LINK method/noop)
 (define-cse-method 'INVOCATION:PRIMITIVE method/noop)
 (define-cse-method 'INVOCATION:SPECIAL-PRIMITIVE method/noop)
-(define-cse-method 'INVOCATION:UUO-LINK method/noop)
-
-(define-cse-method 'INTERPRETER-CALL:ENCLOSE
-  (lambda (statement)
-    (let ((n (rtl:interpreter-call:enclose-size statement)))
-      (stack-region-invalidate! 0 n)
-      (stack-pointer-adjust! n))
-    (expression-invalidate! (interpreter-register:enclose))))
 
 (define-cse-method 'INVOCATION:CACHE-REFERENCE
   (lambda (statement)
@@ -290,12 +288,11 @@ MIT in each case. |#
                         rtl:set-invocation:lookup-environment!
                         statement
                         trivial-action)))
-\f
-(define-cse-method 'SETUP-LEXPR
-  (lambda (statement)
-    (stack-invalidate!)
-    (stack-pointer-invalidate!)))
 
+(define-cse-method 'CONS-CLOSURE
+  (lambda (statement)
+    (expression-invalidate! (interpreter-register:enclose))))
+\f
 (define-cse-method 'INVOCATION-PREFIX:MOVE-FRAME-UP
   (lambda (statement)
     (expression-replace! rtl:invocation-prefix:move-frame-up-locative
index 7f87df56a7fa3302f40981c8732b2f0a42337aa8..26ff01841c265a19629b7837c3ca6c3ec7e7da69 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse2.scm,v 4.3 1987/12/31 07:01:04 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse2.scm,v 4.4 1988/03/14 20:59:05 jinx Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -100,7 +100,9 @@ MIT in each case. |#
           (memq (rtl:expression-type expression)
                 '(OBJECT->ADDRESS OBJECT->DATUM
                                   OBJECT->TYPE
-                                  OFFSET-ADDRESS)))))))
+                                  OFFSET-ADDRESS
+                                  VARIABLE-CACHE
+                                  ASSIGNMENT-CACHE)))))))
 
 (define (element-address-varies? element)
   (and (element-in-memory? element)