~ chicken-core (chicken-5) fb423c06afa0a30c1be8040785f0769c459d180b


commit fb423c06afa0a30c1be8040785f0769c459d180b
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Jan 13 21:53:18 2010 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Jan 13 21:53:18 2010 +0100

    toplevel-alias detection for simple cases

diff --git a/compiler.scm b/compiler.scm
index d12c7cb6..1ec72225 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -90,6 +90,7 @@
 ;   ##compiler#profile -> BOOL
 ;   ##compiler#unused -> BOOL
 ;   ##compiler#foldable -> BOOL
+;   ##compiler#toplevel-alias -> SYMBOL
 
 ; - Source language:
 ;
diff --git a/optimizer.scm b/optimizer.scm
index 150246ea..3b087977 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -85,8 +85,9 @@
 	  [(##core#call) (touch)]
 
 	  [(set!)
-	   (let ([var (first params)])
-	     (scan (first subs) e)
+	   (let ((var (first params))
+		 (val (first subs)))
+	     (scan val e)
 	     (let ((p (alist-ref var previous)))
 	       (when (and p (not (memq var unsafe)))
 		 (compiler-warning 
@@ -96,6 +97,14 @@
 		 (copy-node!
 		  (make-node '##core#undefined '() '())
 		  p))
+	       (when (and (not escaped)
+			  (not (memq var e))
+			  (not (memq var unsafe))
+			  (eq? '##core#variable (node-class val)))
+		 (let ((valname (first (node-parameters val))))
+		   (unless (memq valname e)
+		     (debugging 'x (sprintf "toplevel-alias: ~s -> ~s" var valname))
+		     (##sys#put! var '##compiler#toplevel-alias valname))))
 	       (unless (memq var e) (mark var))
 	       (remember var n) ) ) ]
 
@@ -214,6 +223,7 @@
 		    (touch)
 		    (debugging 'o "substituted constant variable" var)
 		    (qnode (car (node-parameters (test var 'value)))) )
+		   ((##sys#get var '##compiler#toplevel-alias) => replace)
 		   (else
 		    (if (not (eq? var (first params)))
 			(begin
Trap