#| -*-Scheme-*-
-$Id: simplify.scm,v 1.7 1995/02/26 14:59:03 adams Exp $
+$Id: simplify.scm,v 1.8 1995/03/01 14:06:55 adams Exp $
Copyright (c) 1994 Massachusetts Institute of Technology
`(LAMBDA ,lambda-list
,(simplify/expr
(simplify/env/make env
- (lmap simplify/binding/make (lambda-list->names lambda-list)))
+ (map simplify/binding/make (lambda-list->names lambda-list)))
body)))
(define-simplifier QUOTE (env object)
(guarantee-simple-lambda-list (lambda/formals rator)) ;Miller & Adams
(let* ((lambda-list (lambda/formals rator))
(env0 (simplify/env/make env
- (lmap simplify/binding/make lambda-list)))
+ (map simplify/binding/make lambda-list)))
(body* (simplify/expr env0 (caddr rator)))
(bindings* (map (lambda (name value)
(simplify/binding&value env name value))
(define-simplifier LET (env bindings body)
(let* ((env0 (simplify/env/make env
- (lmap (lambda (binding) (simplify/binding/make (car binding)))
- bindings)))
+ (map (lambda (binding) (simplify/binding/make (car binding)))
+ bindings)))
(body* (simplify/expr env0 body))
(bindings*
- (lmap (lambda (binding)
+ (map (lambda (binding)
(simplify/binding&value env (car binding) (cadr binding)))
- bindings)))
+ bindings)))
(do-simplification env0 #F bindings* body* simplify/letify)))
(define-simplifier LETREC (env bindings body)
(let* ((env0 (simplify/env/make env
- (lmap (lambda (binding) (simplify/binding/make (car binding)))
- bindings)))
+ (map (lambda (binding) (simplify/binding/make (car binding)))
+ bindings)))
(body* (simplify/expr env0 body))
(bindings*
- (lmap (lambda (binding)
+ (map (lambda (binding)
(simplify/binding&value env0 (car binding) (cadr binding)))
- bindings)))
+ bindings)))
(do-simplification env0 #T bindings* body* simplify/letrecify)))
\f
(define (simplify/binding&value env name value)
(list false name (simplify/expr env value))
(let* ((lambda-list (lambda/formals value))
(env1 (simplify/env/make env
- (lmap simplify/binding/make
- (lambda-list->names lambda-list)))))
+ (map simplify/binding/make
+ (lambda-list->names lambda-list)))))
(let ((value*
`(LAMBDA ,lambda-list
,(simplify/expr env1 (lambda/body value)))))
unrefd))))))
(simplify/env/bindings env0)
bindings)
- (lmap cdr bindings))
+ (map cdr bindings))
(define (simplify/maybe-delete unrefd bnode form)
(let ((position (simplify/operand/position unrefd form))
(form/simple&side-effect-free? (cadr place))))))
(lambda (simple-unused hairy-unused)
;; simple-unused can be flushed, since they have no side effects
- (let ((bindings* (delq* (lmap (lambda (simple)
- (assq (simplify/binding/name simple)
- bindings))
- simple-unused)
+ (let ((bindings* (delq* (map (lambda (simple)
+ (assq (simplify/binding/name simple)
+ bindings))
+ simple-unused)
bindings))
(not-simple-unused (delq* simple-unused frame-bindings)))
(if (or (not (eq? *order-of-argument-evaluation* 'ANY))
body
letify))
(let ((hairy-bindings
- (lmap (lambda (hairy)
- (assq (simplify/binding/name hairy)
- bindings*))
- hairy-unused))
+ (map (lambda (hairy)
+ (assq (simplify/binding/name hairy)
+ bindings*))
+ hairy-unused))
(used-bindings (delq* hairy-unused not-simple-unused)))
(beginnify
(append
bindings))))
to-substitute)
;; This works only as long as all references are replaced.
- (letify (delq* (lmap (lambda (node)
- (assq (simplify/binding/name node)
- bindings))
- to-substitute)
+ (letify (delq* (map (lambda (node)
+ (assq (simplify/binding/name node)
+ bindings))
+ to-substitute)
bindings)
body)))
\f
;; (LOOKUP/? element)))))
(and *after-cps-conversion?*
(CALL/? body)
- (<= (length (call/cont-and-operands body))
- (1+ (length (lambda/formals value))))
+ (<= (call/count-dynamic-operands body)
+ (length (lambda/formals value)))
(not (unsafe-cyclic-reference? name))
(for-all? (cdr body)
(lambda (element)
(or (QUOTE/? element)
- (LOOKUP/? element))))))))
+ (LOOKUP/? element)
+ (form/static? element))))))))
+
+(define (call/count-dynamic-operands call)
+ (let ((count (length (call/operands call))))
+ (- count
+ (if (QUOTE/? (call/operator call))
+ (let ((rator (quote/text (call/operator call))))
+ (cond ((eq? rator %invoke-remote-cache) 2)
+ ((eq? rator %invoke-operator-cache) 2)
+ ((eq? rator %internal-apply) 1)
+ ((eq? rator %internal-apply-unchecked) 1)
+ ((eq? rator %primitive-apply) 2)
+ ((eq? rator %cell-ref) 1)
+ ((eq? rator %cell-set!) 1)
+ (else 0)))
+ 0))))
\f
(define (simplify/expr env expr)
(if (not (pair? expr))
(simplify/if env expr))
((LETREC)
(simplify/letrec env expr))
- ((SET! UNASSIGNED? OR DELAY
- ACCESS DEFINE IN-PACKAGE THE-ENVIRONMENT)
- (no-longer-legal expr))
(else
(illegal expr))))
(define (simplify/expr* env exprs)
- (lmap (lambda (expr)
- (simplify/expr env expr))
- exprs))
+ (map (lambda (expr)
+ (simplify/expr env expr))
+ exprs))
(define (simplify/remember new old)
(code-rewrite/remember new old))