There are two kinds of "stack" procedure, which can be distinguished
authorChris Hanson <org/chris-hanson/cph>
Sun, 12 Apr 1987 00:25:26 +0000 (00:25 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sun, 12 Apr 1987 00:25:26 +0000 (00:25 +0000)
by whether or not the parent frame of the procedure is a stack frame.
Split these two and handle them separately.  See "emodel" for details
about the new classifications.

v7/src/compiler/machines/bobcat/lapgen.scm
v7/src/compiler/machines/spectrum/lapgen.scm
v7/src/compiler/rtlbase/rtlty1.scm
v7/src/compiler/rtlgen/rgcomb.scm
v7/src/compiler/rtlgen/rtlgen.scm
v7/src/compiler/rtlopt/rcse1.scm

index 3fd28bd5d564ead29e857521a4ce25d7dd70e812..9d807240f06e3698c0220cffab1a80f2c2c83805 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.155 1987/03/20 05:16:16 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/bobcat/lapgen.scm,v 1.156 1987/04/12 00:24:56 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -653,24 +653,19 @@ MIT in each case. |#
       (CMP L ,reg:compiled-memtop (A 5))
       (B GE S (@PCR ,gc-label)))))
 
-(define-rule statement
-  (SETUP-CLOSURE-LEXPR (? procedure))
-  (lexpr-header procedure 1))
-
-(define-rule statement
-  (SETUP-STACK-LEXPR (? procedure))
-  (lexpr-header procedure 0))
-
 ;;; Note: do not change the MOVE.W in the setup-lexpr call to a MOVEQ.
 ;;; The setup-lexpr code assumes a fixed calling sequence to compute
-;;; the GC address if that is needed.
+;;; the GC address if that is needed.  This could be changed so that
+;;; the microcode determined how far to back up based on the argument,
+;;; or by examining the calling sequence.
 
-(define (lexpr-header procedure extra)
+(define-rule statement
+  (SETUP-LEXPR (? procedure))
   `(,@(procedure-header procedure false)
     (MOVE W
          (& ,(+ (length (procedure-required procedure))
                 (length (procedure-optional procedure))
-                extra))
+                (if (procedure/closure? procedure) 1 0)))
          (D 1))
     (MOVEQ (& ,(if (procedure-rest procedure) 1 0)) (D 2))
     (JSR , entry:compiler-setup-lexpr)))
@@ -687,7 +682,7 @@ MIT in each case. |#
 \f
 (define (procedure-header procedure gc-label)
   (let ((internal-label (procedure-label procedure)))
-    (append! (if (closure-procedure? procedure)
+    (append! (if (procedure/closure? procedure)
                 (let ((required (1+ (length (procedure-required procedure))))
                       (optional (length (procedure-optional procedure)))
                       (label (procedure-external-label procedure)))
index 8e1f99f712a9c1c546040964a0d6edb30ca4e189..ce8d90ebf360567d14dbb3d6ff8e02614f423b9d 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/spectrum/lapgen.scm,v 1.136 1987/03/19 00:55:32 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/machines/spectrum/lapgen.scm,v 1.137 1987/04/12 00:25:26 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -962,7 +962,7 @@ MIT in each case. |#
 \f
 (define (procedure-header procedure)
   (let ((internal-label (procedure-label procedure)))
-    (append! (if (closure-procedure? procedure)
+    (append! (if (procedure/closure? procedure)
                 (let ((required (1+ (length (procedure-required procedure))))
                       (optional (length (procedure-optional procedure)))
                       (label (procedure-external-label procedure)))
index 4f9f9785aa7dd54224377196fe3fe1675ee3fc15..371394aebdba20593e02576874b8615c92a02f64 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlbase/rtlty1.scm,v 1.1 1987/03/19 00:44:40 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlbase/rtlty1.scm,v 1.2 1987/04/12 00:21:39 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -60,8 +60,7 @@ MIT in each case. |#
 (define-rtl-statement continuation-heap-check rtl: continuation)
 (define-rtl-statement procedure-heap-check rtl: procedure)
 (define-rtl-statement return rtl:)
-(define-rtl-statement setup-closure-lexpr rtl: procedure)
-(define-rtl-statement setup-stack-lexpr rtl: procedure)
+(define-rtl-statement setup-lexpr rtl: procedure)
 
 (define-rtl-statement interpreter-call:access % environment name)
 (define-rtl-statement interpreter-call:define % environment name value)
index 54063382a4c2e6f4e87d2b8a8d474d8705234519..f022ef239c2627eda95898fc69b10072a1edf841 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgcomb.scm,v 1.7 1987/03/19 00:47:01 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rgcomb.scm,v 1.8 1987/04/12 00:22:37 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -211,7 +211,7 @@ MIT in each case. |#
                (let ((operator (combination-known-operator combination)))
                  (and operator
                       (procedure? operator)
-                      (stack-procedure? operator))))
+                      (procedure/open-internal? operator))))
           (finish offset
                   (rtl:message-receiver-size:subproblem)
                   rtl:make-message-receiver:subproblem
@@ -223,58 +223,61 @@ MIT in each case. |#
   ((let ((operator (combination-known-operator combination)))
      (cond ((normal-primitive-constant? operator) make-call:primitive)
           ((or (not operator) (not (procedure? operator))) make-call:unknown)
-          ((ic-procedure? operator) make-call:ic)
-          ((closure-procedure? operator) make-call:closure)
-          ((stack-procedure? operator)
-           (let ((block (combination-block combination)))
-             (cond ((stack-block? block) make-call:stack-with-link)
-                   ((ic-block? block)
-                    (error "IC procedure calling stack procedure"
-                           combination))
-                   (else (error "Unknown caller type" block)))))
-          (else (error "Unknown callee type" operator))))
+          (else
+           (case (procedure/type operator)
+             ((OPEN-INTERNAL) make-call:stack-with-link)
+             ((OPEN-EXTERNAL) make-call:open-external)
+             ((CLOSURE) make-call:closure)
+             ((IC) make-call:ic)
+             (else (error "Unknown callee type" operator))))))
    combination offset invocation-prefix:null continuation))
 \f
 ;;;; Reductions
 
 (define (combination:reduction combination offset)
-  (let ((operator (combination-known-operator combination))
+  (let ((callee (combination-known-operator combination))
        (block (combination-block combination)))
-    (define (choose-generator ic closure stack)
-      ((cond ((ic-block? block) ic)
-            ((closure-procedure-block? block) closure)
-            ((stack-procedure-block? block) stack)
-            (else (error "Unknown caller type" block)))
+    (define (choose-generator ic external internal)
+      ((let ((caller (block-procedure block)))
+        (cond ((or (not caller) (procedure/ic? caller)) ic)
+              ((procedure/external? caller) external)
+              (else internal)))
        combination offset))
-    (cond ((normal-primitive-constant? operator)
+    (cond ((normal-primitive-constant? callee)
           (choose-generator reduction:ic->primitive
-                            reduction:closure->primitive
-                            reduction:stack->primitive))
-         ((or (not operator)
-              (not (procedure? operator)))
+                            reduction:external->primitive
+                            reduction:internal->primitive))
+         ((or (not callee)
+              (not (procedure? callee)))
           (choose-generator reduction:ic->unknown
-                            reduction:closure->unknown
-                            reduction:stack->unknown))
-         ((ic-procedure? operator)
-          (choose-generator reduction:ic->ic
-                            reduction:closure->ic
-                            reduction:stack->ic))
-         ((closure-procedure? operator)
-          (choose-generator reduction:ic->closure
-                            reduction:closure->closure
-                            reduction:stack->closure))
-         ((stack-procedure? operator)
-          (choose-generator reduction:ic->stack
-                            reduction:closure->stack
-                            (let ((block* (procedure-block operator)))
-                              (cond ((block-child? block block*)
-                                     reduction:stack->child)
-                                    ((block-sibling? block block*)
-                                     reduction:stack->sibling)
-                                    (else
-                                     reduction:stack->ancestor)))))
-         (else (error "Unknown callee type" operator)))))
-
+                            reduction:external->unknown
+                            reduction:internal->unknown))
+         (else
+          (case (procedure/type callee)
+            ((IC)
+             (choose-generator reduction:ic->ic
+                               reduction:external->ic
+                               reduction:internal->ic))
+            ((CLOSURE)
+             (choose-generator reduction:ic->closure
+                               reduction:external->closure
+                               reduction:internal->closure))
+            ((OPEN-EXTERNAL)
+             (choose-generator reduction:ic->open-external
+                               reduction:external->open-external
+                               reduction:internal->open-external))
+            ((OPEN-INTERNAL)
+             (choose-generator reduction:ic->child
+                               reduction:external->child
+                               (let ((block* (procedure-block callee)))
+                                 (cond ((block-child? block block*)
+                                        reduction:internal->child)
+                                       ((block-sibling? block block*)
+                                        reduction:internal->sibling)
+                                       (else
+                                        reduction:internal->ancestor)))))
+            (else (error "Unknown callee type" callee)))))))
+\f
 (define (reduction:ic->unknown combination offset)
   (make-call:unknown combination offset invocation-prefix:null false))
 
@@ -286,58 +289,67 @@ MIT in each case. |#
 
 (define (reduction:ic->closure combination offset)
   (make-call:closure combination offset invocation-prefix:null false))
-\f
-(define (reduction:ic->stack combination offset)
-  ;; The callee must be a child of the caller, but in that case it
-  ;; should be a closure -- so this is a logic error.
-  (error "IC procedure calling stack procedure" combination))
 
-(define (reduction:closure->unknown combination offset)
+(define (reduction:ic->open-external combination offset)
+  (make-call:open-external combination offset invocation-prefix:null false))
+
+(define (reduction:ic->child combination offset)
+  (error "Calling internal procedure from IC procedure"))
+
+(define (reduction:external->unknown combination offset)
   (make-call:unknown combination offset invocation-prefix:move-frame-up false))
 
-(define (reduction:closure->ic combination offset)
+(define (reduction:external->ic combination offset)
   (make-call:ic combination offset invocation-prefix:move-frame-up false))
 
-(define (reduction:closure->primitive combination offset)
+(define (reduction:external->primitive combination offset)
   (make-call:primitive combination offset invocation-prefix:move-frame-up
                       false))
 
-(define (reduction:closure->closure combination offset)
+(define (reduction:external->closure combination offset)
   (make-call:closure combination offset invocation-prefix:move-frame-up false))
 
-(define (reduction:closure->stack combination offset)
-  ;; The callee is known to be a child of the caller because the
-  ;; analyzer prohibits the other cases.
+(define (reduction:external->open-external combination offset)
+  (make-call:open-external combination offset invocation-prefix:move-frame-up
+                          false))
+
+(define (reduction:external->child combination offset)
   (make-call:child combination offset
                   rtl:make-message-receiver:closure
                   rtl:message-receiver-size:closure))
-
-(define (reduction:stack->unknown combination offset)
-  (make-call:unknown combination offset invocation-prefix:stack->closure
+\f
+(define (reduction:internal->unknown combination offset)
+  (make-call:unknown combination offset invocation-prefix:internal->closure
                     false))
 
-(define (reduction:stack->ic combination offset)
-  (make-call:ic combination offset invocation-prefix:stack->closure false))
+(define (reduction:internal->ic combination offset)
+  (make-call:ic combination offset invocation-prefix:internal->closure false))
 
-(define (reduction:stack->primitive combination offset)
-  (make-call:primitive combination offset invocation-prefix:stack->closure
+(define (reduction:internal->primitive combination offset)
+  (make-call:primitive combination offset invocation-prefix:internal->closure
                       false))
 
-(define (reduction:stack->closure combination offset)
-  (make-call:closure combination offset invocation-prefix:stack->closure
+(define (reduction:internal->closure combination offset)
+  (make-call:closure combination offset invocation-prefix:internal->closure
                     false))
 
-(define (reduction:stack->child combination offset)
+(define (reduction:internal->open-external combination offset)
+  (make-call:open-external combination offset
+                          invocation-prefix:internal->closure
+                          false))
+
+(define (reduction:internal->child combination offset)
   (make-call:child combination offset
                   rtl:make-message-receiver:stack
                   rtl:message-receiver-size:stack))
 
-(define (reduction:stack->sibling combination offset)
-  (make-call:stack combination offset invocation-prefix:stack->sibling false))
+(define (reduction:internal->sibling combination offset)
+  (make-call:stack combination offset invocation-prefix:internal->sibling
+                  false))
 
-(define (reduction:stack->ancestor combination offset)
+(define (reduction:internal->ancestor combination offset)
   (make-call:stack-with-link combination offset
-                            invocation-prefix:stack->ancestor false))
+                            invocation-prefix:internal->ancestor false))
 \f
 ;;;; Calls
 
@@ -387,16 +399,26 @@ MIT in each case. |#
 \f
 (define (make-call:closure combination offset invocation-prefix continuation)
   (make-call:push-operator combination offset
-    (lambda (number-pushed)
-      (let ((operator (combination-known-operator combination)))
-       ((if (procedure-rest operator)
-            rtl:make-invocation:lexpr
-            rtl:make-invocation:jump)
-        number-pushed
-        (invocation-prefix combination number-pushed)
-        continuation
-        operator)))))
+    (external-call combination invocation-prefix continuation)))
 
+(define (make-call:open-external combination offset invocation-prefix
+                                continuation)
+  (scfg*node->node!
+   (rtl:make-push (rtl:make-fetch register:environment))
+   (make-call:dont-push-operator combination offset
+     (external-call combination invocation-prefix continuation))))
+
+(define (external-call combination invocation-prefix continuation)
+  (lambda (number-pushed)
+    (let ((operator (combination-known-operator combination)))
+      ((if (procedure-rest operator)
+          rtl:make-invocation:lexpr
+          rtl:make-invocation:jump)
+       number-pushed
+       (invocation-prefix combination number-pushed)
+       continuation
+       operator))))
+\f
 (package (make-call:stack make-call:stack-with-link make-call:child)
 
 (define-export (make-call:stack combination offset invocation-prefix
@@ -449,14 +471,14 @@ MIT in each case. |#
   `(MOVE-FRAME-UP ,number-pushed
                  ,(block-frame-size (combination-block combination))))
 
-(define (invocation-prefix:stack->closure combination number-pushed)
+(define (invocation-prefix:internal->closure combination number-pushed)
   ;; The message sender will shift the new stack frame down to the
   ;; correct position when it is done, then reset the stack pointer.
   `(APPLY-CLOSURE ,number-pushed
                  ,(+ number-pushed
                      (block-frame-size (combination-block combination)))))
 
-(define (invocation-prefix:stack->ancestor combination number-pushed)
+(define (invocation-prefix:internal->ancestor combination number-pushed)
   (let ((block (combination-block combination)))
     `(APPLY-STACK ,number-pushed
                  ,(+ number-pushed (block-frame-size block))
@@ -466,7 +488,7 @@ MIT in each case. |#
                     (procedure-block
                      (combination-known-operator combination)))))))
 
-(define (invocation-prefix:stack->sibling combination number-pushed)
+(define (invocation-prefix:internal->sibling combination number-pushed)
    `(MOVE-FRAME-UP ,number-pushed
                   ;; -1+ means reuse the existing static link.
                   ,(-1+ (block-frame-size (combination-block combination)))))
@@ -500,9 +522,8 @@ MIT in each case. |#
            (let ((n-parameters (+ (length (procedure-required operator))
                                   (length (procedure-optional operator)))))
              (let ((delta (- n-parameters n-operands)))
-               (scfg*scfg->scfg!
-                (scfg*->scfg! (push-n-unassigned delta))
-                (finish n-parameters (+ offset delta)))))
+               (scfg*scfg->scfg! (scfg*->scfg! (push-n-unassigned delta))
+                                 (finish n-parameters (+ offset delta)))))
            (finish n-operands offset))))))
 
 (define (push-n-unassigned n)
@@ -515,8 +536,7 @@ MIT in each case. |#
   (generate:subproblem subproblem offset
     (lambda (offset)
       (scfg*node->node!
-       (rvalue->sexpression (subproblem-value subproblem) offset
-                           rtl:make-push)
+       (rvalue->sexpression (subproblem-value subproblem) offset rtl:make-push)
        (receiver (1+ offset))))))
 
 (define-export make-call:dont-push-operator
index 3239acadd18c5b644ff933a8b0ed4ec5f1f186d2..f817e027ac829c65fbea1b170cd3e9c32b1bdae3 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rtlgen.scm,v 1.7 1987/03/20 05:25:58 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlgen/rtlgen.scm,v 1.8 1987/04/12 00:22:55 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -47,18 +47,7 @@ MIT in each case. |#
                    quotation
                    (generate:top-level (quotation-fg-entry quotation))))
                 quotations)
-       (for-each
-       (lambda (procedure)
-         (set-procedure-rtl-entry!
-          procedure
-          (scfg*node->node!
-           ((cond ((ic-procedure? procedure) generate:ic-procedure)
-                  ((closure-procedure? procedure) generate:closure-procedure)
-                  ((stack-procedure? procedure) generate:stack-procedure)
-                  (else (error "Unknown procedure type" procedure)))
-            procedure)
-           (generate:top-level (procedure-fg-entry procedure)))))
-       procedures)
+       (for-each generate:procedure procedures)
        (for-each (lambda (rnode)
                   (node-property-remove! rnode generate:node))
                 *nodes*)))))
@@ -91,24 +80,22 @@ MIT in each case. |#
 (define-integrable (generate:next-is-null? next rest-generator)
   (and (not next) (not rest-generator)))
 \f
-(define (generate:ic-procedure procedure)
-  (make-null-cfg))
-
-(define (generate:closure-procedure procedure)
-  (scfg*scfg->scfg! (if (or (not (null? (procedure-optional procedure)))
-                           (procedure-rest procedure))
-                       ((if (closure-procedure-needs-operator? procedure)
-                            rtl:make-setup-closure-lexpr
-                            rtl:make-setup-stack-lexpr)
-                        procedure)
-                       (rtl:make-procedure-heap-check procedure))
-                   (setup-stack-frame procedure)))
-
-(define (generate:stack-procedure procedure)
-  (scfg*scfg->scfg! (if (procedure-rest procedure)
-                       (rtl:make-setup-stack-lexpr procedure)
-                       (rtl:make-procedure-heap-check procedure))
-                   (setup-stack-frame procedure)))
+(define (generate:procedure procedure)
+  (set-procedure-rtl-entry!
+   procedure
+   (let ((body (generate:top-level (procedure-fg-entry procedure))))
+     (if (procedure/ic? procedure)
+        body
+        (scfg*node->node!
+         (scfg*scfg->scfg!
+          ((if (or (procedure-rest procedure)
+                   (and (procedure/closure? procedure)
+                        (not (null? (procedure-optional procedure)))))
+               rtl:make-setup-lexpr
+               rtl:make-procedure-heap-check)
+           procedure)
+          (setup-stack-frame procedure))
+         body)))))
 
 (define (setup-stack-frame procedure)
   (let ((block (procedure-block procedure)))
@@ -125,15 +112,6 @@ MIT in each case. |#
             (rtl:make-cell-cons (rtl:make-fetch locative))))
          (make-null-cfg)))
 
-    (define (close-letrec-procedures names values)
-      (scfg*->scfg!
-       (map (lambda (name value)
-             (if (and (procedure? value)
-                      (closure-procedure? value))
-                 (letrec-close block name value)
-                 (make-null-cfg)))
-           names values)))
-
     (let ((names (procedure-names procedure))
          (values (procedure-values procedure)))
       (scfg-append! (setup-bindings names values '())
@@ -144,7 +122,13 @@ MIT in each case. |#
                      (if rest
                          (cellify-variable rest)
                          (make-null-cfg)))
-                   (close-letrec-procedures names values)))))
+                   (scfg*->scfg!
+                    (map (lambda (name value)
+                           (if (and (procedure? value)
+                                    (procedure/closure? value))
+                               (letrec-close block name value)
+                               (make-null-cfg)))
+                         names values))))))
 \f
 (define (setup-bindings names values pushes)
   (if (null? names)
@@ -159,12 +143,15 @@ MIT in each case. |#
   (cond ((constant? value)
         (rtl:make-constant (constant-value value)))
        ((procedure? value)
-        (cond ((closure-procedure? value)
-               (make-closure-cons value (rtl:make-constant '())))
-              ((ic-procedure? value)
-               (make-ic-cons value))
-              (else
-               (error "Bad letrec procedure value" value))))
+        (case (procedure/type value)
+          ((CLOSURE)
+           (make-closure-cons value (rtl:make-constant '())))
+          ((IC)
+           (make-ic-cons value))
+          ((OPEN-EXTERNAL OPEN-INTERNAL)
+           (error "Letrec value is open procedure" value))
+          (else
+           (error "Unknown procedure type" value))))
        (else
         (error "Unknown letrec binding value" value))))
 
@@ -246,6 +233,24 @@ MIT in each case. |#
                                   expression))))))
                      (generate:next next offset rest-generator))))
 \f
+(define-assignment temporary-tag
+  (lambda (block temporary rvalue next offset rest-generator
+                rvalue->sexpression)
+    (case (temporary-type temporary)
+      ((#F)
+       (scfg*node->node!
+       (if (integrated-vnode? temporary)
+           (make-null-cfg)
+           (rvalue->sexpression rvalue offset
+             (lambda (expression)
+               (rtl:make-assignment temporary expression))))
+       (generate:next next offset rest-generator)))
+      ((VALUE)
+       (assignment:value-register block rvalue next offset
+                                 rest-generator rvalue->sexpression))
+      (else
+       (error "Unknown temporary type" temporary)))))
+
 (define (assignment:value-register block rvalue next offset
                                   rest-generator rvalue->sexpression)
   (if (not (generate:next-is-null? next rest-generator))
@@ -256,14 +261,14 @@ MIT in each case. |#
                         (rvalue->sexpression rvalue offset
                           (lambda (expression)
                             (rtl:make-assignment register:value expression))))
-                    (if (stack-procedure-block? block)
-                        (rtl:make-message-sender:value
-                         (+ offset (block-frame-size block)))
-                        (scfg-append!
-                         (if (closure-procedure-block? block)
+                    (if (stack-block? block)
+                        (if (stack-parent? block)
+                            (rtl:make-message-sender:value
+                             (+ offset (block-frame-size block)))
+                            (scfg*scfg->scfg!
                              (rtl:make-pop-frame (block-frame-size block))
-                             (make-null-cfg))
-                         (rtl:make-return))))
+                             (rtl:make-return)))
+                        (rtl:make-return)))
    (generate:next next offset rest-generator)))
 
 (define-assignment value-ignore-tag
@@ -272,24 +277,6 @@ MIT in each case. |#
     (if (not (generate:next-is-null? next rest-generator))
        (error "Return node has next"))
     (generate:next next offset rest-generator)))
-
-(define-assignment temporary-tag
-  (lambda (block temporary rvalue next offset rest-generator
-                rvalue->sexpression)
-    (case (temporary-type temporary)
-      ((#F)
-       (scfg*node->node!
-       (if (integrated-vnode? temporary)
-           (make-null-cfg)
-           (rvalue->sexpression rvalue offset
-             (lambda (expression)
-               (rtl:make-assignment temporary expression))))
-       (generate:next next offset rest-generator)))
-      ((VALUE)
-       (assignment:value-register block rvalue next offset
-                                 rest-generator rvalue->sexpression))
-      (else
-       (error "Unknown temporary type" temporary)))))
 \f
 ;;;; Predicates
 
@@ -400,14 +387,17 @@ MIT in each case. |#
 
 (define-rvalue->expression procedure-tag
   (lambda (procedure offset scfg-append! receiver)
-    (cond ((ic-procedure? procedure) (receiver (make-ic-cons procedure)))
-         ((closure-procedure? procedure)
-          (make-closure-environment procedure offset scfg-append!
-            (lambda (environment)
-              (receiver (make-closure-cons procedure environment)))))
-         ((stack-procedure? procedure)
-          (error "RVALUE->EXPRESSION: Stack procedure reference" procedure))
-         (else (error "Unknown procedure type" procedure)))))
+    (case (procedure/type procedure)
+      ((CLOSURE)
+       (make-closure-environment procedure offset scfg-append!
+        (lambda (environment)
+          (receiver (make-closure-cons procedure environment)))))
+      ((IC)
+       (receiver (make-ic-cons procedure)))
+      ((OPEN-EXTERNAL OPEN-INTERNAL)
+       (error "Reference to open procedure" procedure))
+      (else
+       (error "Unknown procedure type" procedure)))))
 
 (define (make-ic-cons procedure)
   ;; IC procedures have their entry points linked into their headers
index 87d13c33ec36fdb1b8ccfb1d39e272325565f601..ba8646118e9ebbce9985ead43ae69eb24576bb25 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 1.100 1987/03/20 05:14:46 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/compiler/rtlopt/rcse1.scm,v 1.101 1987/04/12 00:22:23 cph Exp $
 
 Copyright (c) 1987 Massachusetts Institute of Technology
 
@@ -178,8 +178,7 @@ MIT in each case. |#
   (stack-invalidate!)
   (stack-pointer-invalidate!))
 
-(define-stack-trasher 'SETUP-CLOSURE-LEXPR)
-(define-stack-trasher 'SETUP-STACK-LEXPR)
+(define-stack-trasher 'SETUP-LEXPR)
 (define-stack-trasher 'MESSAGE-SENDER:VALUE)
 
 (define-cse-method 'INTERPRETER-CALL:ENCLOSE