~ chicken-core (chicken-5) 08025e99d232d00e9d2cfea67726641104278ef5


commit 08025e99d232d00e9d2cfea67726641104278ef5
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Apr 19 22:36:05 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Tue Apr 19 22:36:05 2011 +0200

    added some comments to unboxing.scm

diff --git a/compiler.scm b/compiler.scm
index 07c50747..88a84f7e 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -178,7 +178,7 @@
 ; [##core#bind {<count>} <exp-v>... <exp>]
 ; [##core#let_unboxed {<name> <utype>} <exp1> <exp2>]
 ; [##core#undefined {}]
-; [##core#unboxed_ref {<name> <utype>}]
+; [##core#unboxed_ref {<name> [<utype>]}]
 ; [##core#unboxed_set! {<name> <utype>} <exp>]
 ; [##core#inline {<op>} <exp>...]
 ; [##core#inline_allocate {<op <words>} <exp>...]
diff --git a/unboxing.scm b/unboxing.scm
index e668e9de..8abaf2a8 100644
--- a/unboxing.scm
+++ b/unboxing.scm
@@ -24,6 +24,9 @@
 ; POSSIBILITY OF SUCH DAMAGE.
 
 
+;; I don't understand this code anymore. It needs cleanup and simplification.
+
+
 (declare
   (unit unboxing)
   (hide d-depth))
@@ -113,6 +116,7 @@
 		      (if (and dest (cdr dest))
 			  n2
 			  (let ((tmp (gensym "tu")))
+			    ;; introduce unboxed temporary for result
 			    (make-node
 			     '##core#let_unboxed (list tmp rtype)
 			     (list
@@ -144,7 +148,7 @@
 				   (make-node '##core#unboxed_ref (list tmp rtype) '()))))
 				((*) (bomb "unboxed type `*' not allowed as result"))
 				(else (bomb "invalid unboxed type" rtype))))))))) 
-		   ((or (eq? (car atypes) '*) 
+		   ((or (eq? (car atypes) '*) ; already unboxed argument -> just pass it unchanged
 			(unboxed-value? (car args)))
 		    (loop (cdr args)
 			  (cdr anodes)
@@ -159,6 +163,8 @@
 		    ;;    (But we must make sure there are not intermediate side
 		    ;;    effects - possibly only reuse unboxed value if unassigned
 		    ;;    local or lexical variable ref, or literal)
+		    ;;
+		    ;;    (See also comment below, after "walk-lambda")
 		    (let ((tmp (gensym "tu")))
 		      (make-node
 		       '##core#let_unboxed (list tmp (car atypes))
@@ -178,7 +184,7 @@
 			     (loop (cdr args)
 				   (cdr anodes)
 				   (cdr atypes)
-				   (cons (make-node '##core#unboxed_ref (list tmp) '())
+				   (cons (make-node '##core#unboxed_ref (list tmp (car atypes)) '())
 					 iargs))))))))
 	   n)
 	  (straighten-binding! n))
@@ -321,6 +327,7 @@
 					       unchecked-specialized-arithmetic))
 				      rw1))
 			     (args (map (cut walk <> #f rw pass2?) subs)))
+			;; rewrite inline operation to unboxed one, if possible
 			(cond ((not rw) #f)
 			      ((or (not pass2?)
 				   (and dest (unboxed? dest))
@@ -414,7 +421,32 @@
 	;; walk a second time and rewrite
 	(d "walk lambda: ~a (pass 2)" id)
 	(walk body #f #f #t)))
+
+    ;;XXX Note: lexical references ("##core#ref" nodes) are unboxed
+    ;;    repeatedly which is sub-optimal: the unboxed temporaries bound
+    ;;    via "##core#let_unboxed" could be re-used in many cases.
+    ;;    One possible approach would be an additional "cleanup" pass
+    ;;    that replaces
+    ;;
+    ;;    (##core#let_unboxed (TU TYPE) X (##core#ref VAR (SLOT)) Y)
+    ;;
+    ;;    with
+    ;;
+    ;;    (##core#let_unboxed (TU TYPE) (##core#unboxed_ref TU1) Y)
     
+    ;;XXX Note: we could improve this by using float-constants directly
+    ;;    in generated code, i.e.:
+    ;;
+    ;;    [##core#unboxed_const {STRING}]
+    ;;
+    ;;    Introduced could these by the mentioned cleanup pass:
+    ;;
+    ;;    (##core#inline "C_flonum_magnitude" (quote NUM))
+    ;;
+    ;;    ~>
+    ;;
+    ;;    (##core#unboxed_ref NUM TYPE)
+
     (walk-lambda #f '() node)
     (when (and any-rewrites
 	       (debugging 'o "unboxed rewrites:"))
Trap