~ chicken-core (chicken-5) 0f13f6a25d18329a9f44231ec484d85c7d88e070
commit 0f13f6a25d18329a9f44231ec484d85c7d88e070 Author: Peter Bex <peter.bex@xs4all.nl> AuthorDate: Sun Feb 5 22:54:34 2012 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Feb 7 07:52:13 2012 +0100 While optimizing, don't traverse the same chain of replacable variables multiple times; update all variables encountered during traversal with the endpoint. Signed-off-by: felix <felix@call-with-current-continuation.org> diff --git a/optimizer.scm b/optimizer.scm index 72fbb208..30e4a2d8 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -211,6 +211,15 @@ (else n1) ) ) ) ) ) + (define (replace-var var) + (cond ((test var 'replacable) => + (lambda (rvar) + (let ((final-var (replace-var rvar))) + ;; Store intermediate vars to avoid recurring same chain again + (put! db var 'replacable final-var) + final-var))) + (else var))) + (define (walk1 n fids gae) (let ((subs (node-subexpressions n)) (params (node-parameters n)) @@ -218,9 +227,8 @@ (case class ((##core#variable) - (let replace ((var (first params))) - (cond ((test var 'replacable) => replace) - ((test var 'collapsable) + (let ((var (replace-var (first params)))) + (cond ((test var 'collapsable) (touch) (debugging 'o "substituted constant variable" var) (qnode (car (node-parameters (test var 'value)))) )Trap