~ 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