~ chicken-core (chicken-5) 2dec666b1f0f68a312f7d211ace18c09293d23e7
commit 2dec666b1f0f68a312f7d211ace18c09293d23e7 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Sep 21 07:51:59 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Sep 21 07:51:59 2010 -0400 abort inlining if body refers to contractable diff --git a/optimizer.scm b/optimizer.scm index 65d87343..a28801cf 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -287,7 +287,9 @@ (touch) (for-each (cut put! db <> 'inline-target #t) fids) (walk - (inline-lambda-bindings llist args (first (node-subexpressions lval)) #f db) + (inline-lambda-bindings + llist args (first (node-subexpressions lval)) #f db + void) fids) ) ) ((variable-mark var '##compiler#pure) => (lambda (pb) @@ -339,10 +341,19 @@ (for-each (cut put! db <> 'inline-target #t) fids) (check-signature var args llist) (debugging 'o "inlining procedure" var) - (touch) - (walk - (inline-lambda-bindings llist args (first (node-subexpressions lval)) #t db) - fids) ) + (call/cc + (lambda (return) + (define (cfk cvar) + (debugging + 'i + "not inlining procedure because it refers to contractable" + var cvar) + (return (walk-generic n class params subs fids))) + (let ((n2 (inline-lambda-bindings + llist args (first (node-subexpressions lval)) #t db + cfk))) + (touch) + (walk n2 fids))))) ((test ifid 'has-unused-parameters) (if (< (length args) argc) ; Expression was already optimized (should this happen?) (walk-generic n class params subs fids) @@ -403,9 +414,13 @@ ((set!) (let ([var (first params)]) - (cond [(or (test var 'contractable) (test var 'replacable)) + (cond ((test var 'contractable) (touch) - (make-node '##core#undefined '() '()) ] + (debugging 'i "removing global contractable" var) + (make-node '##core#undefined '() '()) ) + ((test var 'replacable) + (touch) + (make-node '##core#undefined '() '()) ) [(and (or (not (test var 'global)) (not (variable-visible? var))) (not (test var 'inline-transient)) diff --git a/support.scm b/support.scm index 143ef741..9f5855f0 100644 --- a/support.scm +++ b/support.scm @@ -576,14 +576,14 @@ (list (proc (first vars) (second vars)) (fold (cdr vars)) ) ) ) ) ) -(define (inline-lambda-bindings llist args body copy? db) +(define (inline-lambda-bindings llist args body copy? db cfk) (decompose-lambda-list llist (lambda (vars argc rest) (receive (largs rargs) (split-at args argc) (let* ([rlist (if copy? (map gensym vars) vars)] [body (if copy? - (copy-node-tree-and-rename body vars rlist db) + (copy-node-tree-and-rename body vars rlist db cfk) body) ] ) (fold-right (lambda (var val body) (make-node 'let (list var) (list val body)) ) @@ -598,7 +598,7 @@ (take rlist argc) largs) ) ) ) ) ) -(define (copy-node-tree-and-rename node vars aliases db) +(define (copy-node-tree-and-rename node vars aliases db cfk) (let ([rlist (map cons vars aliases)]) (define (rename v rl) (alist-ref v rl eq? v)) (define (walk n rl) @@ -611,7 +611,7 @@ [(##core#variable) (let ((var (first params))) (when (get db var 'contractable) - (put! db var 'contractable #f) ) + (cfk var)) (varnode (rename var rl))) ] [(set!) (make-nodeTrap