~ 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