~ chicken-core (chicken-5) 0e2916d1d90bdf95fdd57ecad9c75b9ff6fec647


commit 0e2916d1d90bdf95fdd57ecad9c75b9ff6fec647
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Wed Mar 2 07:11:38 2011 -0500
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Mar 2 07:11:38 2011 -0500

    don't drop arguments for specialization-rewrites that expand into constant

diff --git a/batch-driver.scm b/batch-driver.scm
index 81a74e1e..15c8809e 100644
--- a/batch-driver.scm
+++ b/batch-driver.scm
@@ -514,6 +514,8 @@
 		 (debugging 'p "performing scrutiny")
 		 (scrutinize node0 db do-scrutinize do-specialize)
 		 (end-time "scrutiny")
+		 (when do-specialize
+		   (print-node "specialization" '|P| node0))
 		 (set! first-analysis #t) )
 
 	       (when do-lambda-lifting
diff --git a/manual/Using the compiler b/manual/Using the compiler
index 45374e52..ce8b3ed7 100644
--- a/manual/Using the compiler	
+++ b/manual/Using the compiler	
@@ -53,6 +53,7 @@ the source text should be read from standard input.
      0          show database before lambda-lifting pass
      S          show applications of compiler syntax
      T          show expressions after converting to node tree
+     P          show expressions after specialization
      L          show expressions after lambda-lifting
      U          show expressions after unboxing
      M          show syntax-/runtime-requirements
diff --git a/support.scm b/support.scm
index cb9c100a..19e333db 100644
--- a/support.scm
+++ b/support.scm
@@ -495,7 +495,11 @@
 		      [body (caddr x)] )
 		  (if (null? bs)
 		      (walk body)
-		      (make-node 'let (unzip1 bs)
+		      (make-node 'let 
+				 (map (lambda (v) 
+					;; for temporaries introduced by specialization
+					(if (eq? '#:tmp v) (gensym) v))
+				      (unzip1 bs))
 				 (append (map (lambda (b) (walk (cadr b))) (cadr x))
 					 (list (walk body)) ) ) ) ) )
 	       ((lambda ##core#lambda) 
@@ -541,7 +545,8 @@
 		   (map walk x) ) ) ) ) )
 	    (else (make-node '##core#call '(#f) (map walk x))) ) )
     (let ([exp2 (walk exp)])
-      (debugging 'o "eliminated procedure checks" count)
+      (when (positive? count)
+	(debugging 'o "eliminated procedure checks" count))
       exp2) ) )
 
 (define (build-expression-tree node)
diff --git a/types.db b/types.db
index 21f98787..b2faae22 100644
--- a/types.db
+++ b/types.db
@@ -27,11 +27,11 @@
 ;; scheme
  
 (not (procedure not (*) boolean)
-     (((not boolean)) '#t))
+     (((not boolean)) (let ((#:tmp #(1))) '#t)))
 
 (boolean? (procedure boolean? (*) boolean)
-	  ((boolean) '#t)
-	  (((not boolean)) '#f))
+	  ((boolean) (let ((#:tmp #(1))) '#t))
+	  (((not boolean)) (let ((#:tmp #(1))) '#f)))
 
 (eq? (procedure eq? (* *) boolean))
 
@@ -44,8 +44,8 @@
 	((* (or fixnum symbol char eof null undefined) (eq? #(1) #(2)))))
 
 (pair? (procedure pair? (*) boolean)
-       ((pair) '#t)
-       (((not pair)) '#f))
+       ((pair) (let ((#:tmp #(1))) '#t))
+       (((not pair)) (let ((#:tmp #(1))) '#f)))
 
 (cons (procedure cons (* *) pair))
 
@@ -84,8 +84,8 @@
 (set-car! (procedure set-car! (pair *) undefined) ((pair *) (##sys#setslot #(1) 0 #(2))))
 (set-cdr! (procedure set-cdr! (pair *) undefined) ((pair *) (##sys#setslot #(1) 1 #(2))))
 
-(null? (procedure null? (*) boolean) ((null) #t) ((not null) #f))
-(list? (procedure list? (*) boolean) (((or null pair list)) #t) (((not (or null pair list))) #f))
+(null? (procedure null? (*) boolean) ((null) (let ((#:tmp #(1))) #t)) ((not null) (let ((#:tmp #(1))) #f)))
+(list? (procedure list? (*) boolean) (((or null pair list)) (let ((#:tmp #(1))) #t)) (((not (or null pair list))) (let ((#:tmp #(1))) #f)))
 (list (procedure list (#!rest) list))
 (length (procedure length (list) fixnum) ((list) (##core#inline "C_u_i_length" #(1))))
 (list-tail (procedure list-tail (list fixnum) *))
@@ -100,38 +100,38 @@
 (assoc (procedure assoc (* list #!optional (procedure (* *) *)) *))
 
 (symbol? (procedure symbol? (*) boolean)
-	 ((symbol) #t)
-	 (((not symbol)) #f))
+	 ((symbol) (let ((#:tmp #(1))) #t))
+	 (((not symbol)) (let ((#:tmp #(1))) #f)))
 
 (symbol-append (procedure symbol-append (#!rest symbol) symbol))
 (symbol->string (procedure symbol->string (symbol) string))
 (string->symbol (procedure string->symbol (string) symbol))
 
 (number? (procedure number? (*) boolean)
-	 (((or fixnum float number)) #t)
-	 (((not (or fixnum float number)) #f)))
+	 (((or fixnum float number)) (let ((#:tmp #(1))) #t))
+	 (((not (or fixnum float number)) (let ((#:tmp #(1))) #f))))
 
 (integer? (procedure integer? (*) boolean)
-	  ((fixnum) #t)
+	  ((fixnum) (let ((#:tmp #(1))) #t))
 	  ((float) (fpinteger? #(1))))
 
 (exact? (procedure exact? (*) boolean)
-	((fixnum) #t)
-	((float) #f))
+	((fixnum) (let ((#:tmp #(1))) #t))
+	((float) (let ((#:tmp #(1))) #f)))
 
 (real? (procedure real? (*) boolean)
-       (((or fixnum float number)) #t))
+       (((or fixnum float number)) (let ((#:tmp #(1))) #t)))
 
 (complex? (procedure complex? (*) boolean)
-	  (((or fixnum float number)) #t)
-	  (((not (or fixnum float number))) #f))
+	  (((or fixnum float number)) (let ((#:tmp #(1))) #t))
+	  (((not (or fixnum float number))) (let ((#:tmp #(1))) #f)))
 
 (inexact? (procedure inexact? (*) boolean)
-	  ((fixnum) #f)
-	  ((float) #t))
+	  ((fixnum) (let ((#:tmp #(1))) #f))
+	  ((float) (let ((#:tmp #(1))) #t)))
 
 (rational? (procedure rational? (*) boolean)
-	   ((fixnum) #t))
+	   ((fixnum) (let ((#:tmp #(1))) #t)))
 
 (zero? (procedure zero? (number) boolean)
        ((fixnum) (eq? #(1) 0)))
@@ -363,7 +363,7 @@
 (fixnum-bits fixnum)
 (fixnum-precision fixnum)
 (fixnum? (procedure fixnum? (*) boolean)
-	 ((fixnum) #t))
+	 ((fixnum) (let ((#:tmp #(1))) #t)))
 (flonum-decimal-precision fixnum)
 (flonum-epsilon float)
 (flonum-maximum-decimal-exponent fixnum)
@@ -374,7 +374,7 @@
 (flonum-print-precision (procedure (#!optional fixnum) fixnum))
 (flonum-radix fixnum)
 (flonum? (procedure flonum? (*) boolean)
-	 ((float) #t))
+	 ((float) (let ((#:tmp #(1))) #t)))
 (flush-output (procedure flush-output (#!optional port) undefined))
 (force-finalizers (procedure force-finalizers () undefined))
 (fp- (procedure fp- (float float) float))
Trap