~ chicken-core (chicken-5) 5990b42e07725a3b877fc4b4aedd1818d522c8aa


commit 5990b42e07725a3b877fc4b4aedd1818d522c8aa
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Mar 21 12:58:04 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Mar 21 12:58:04 2011 +0100

    types.db fixes, manual update, enable specialization for -O3 and higher, removed warning in srfi-4

diff --git a/chicken.scm b/chicken.scm
index b84cf647..8b35e7cc 100644
--- a/chicken.scm
+++ b/chicken.scm
@@ -91,13 +91,13 @@
 		    (set! options
 		      (cons* 'optimize-leaf-routines 'inline 'inline-global
 			     'unboxing 'local
-			     ;;XXX 'specialize
+			     'specialize
 			     options) ) )
 		   ((4)
 		    (set! options
 		      (cons* 'optimize-leaf-routines 'inline 'inline-global
 			     'unboxing 
-			     ;;XXX 'specialize
+			     'specialize
 			     'local 'unsafe
 			     options) ) )
 		   (else
@@ -106,7 +106,7 @@
 			(cons* 'disable-interrupts 'no-trace 'unsafe 'block
 			       'optimize-leaf-routines 'lambda-lift 
 			       'no-lambda-info
-			       ;;XXX 'specialize
+			       'specialize
 			       'inline 'inline-global 'unboxing
 			       options) ) ) ) )
 		 (loop (cdr rest)) ) )
diff --git a/manual/Using the compiler b/manual/Using the compiler
index ce8b3ed7..c42e25be 100644
--- a/manual/Using the compiler	
+++ b/manual/Using the compiler	
@@ -161,9 +161,9 @@ the source text should be read from standard input.
      -optimize-level 0          is equivalent to -no-usual-integrations -no-compiler-syntax
      -optimize-level 1          is equivalent to -optimize-leaf-routines
      -optimize-level 2          is equivalent to -optimize-leaf-routines -inline -unboxing
-     -optimize-level 3          is equivalent to -optimize-leaf-routines -local -inline -inline-global -unboxing
-     -optimize-level 4          is equivalent to -optimize-leaf-routines -local -inline -inline-global -unboxing -unsafe
-     -optimize-level 5          is equivalent to -optimize-leaf-routines -block -inline -inline-global -unsafe -unboxing -lambda-lift -disable-interrupts -no-trace -no-lambda-info
+     -optimize-level 3          is equivalent to -optimize-leaf-routines -local -inline -inline-global -unboxing -specialize
+     -optimize-level 4          is equivalent to -optimize-leaf-routines -local -inline -inline-global -unboxing -specialize -unsafe
+     -optimize-level 5          is equivalent to -optimize-leaf-routines -block -inline -inline-global -unboxing -specialize -unsafe -lambda-lift -disable-interrupts -no-trace -no-lambda-info
 
 ; -output-file FILENAME : Specifies the pathname of the generated C file. Default is {{FILENAME.c}}.
 
@@ -188,6 +188,8 @@ the source text should be read from standard input.
 
 ; -scrutinize : Enable simple flow-analysis to catch common type errors and argument/result mismatches. You can also use the {{scrutinize}} declaration to enable scrutiny.
 
+; -specialize : Enable simple flow-analysis for doing some type-directed optimizations.
+
 ; -static-extension NAME : similar to {{-require-extension NAME}}, but links extension statically (also applies for an explicit {{(require-extension NAME)}}).
 
 ; -types FILENAME : load additional type database from {{FILENAME}}. Type-definitions in {{FILENAME}} will override previous type-definitions.
diff --git a/scrutinizer.scm b/scrutinizer.scm
index b41d6945..ef712215 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -674,7 +674,8 @@
 	(d "  -> ~a" results)
 	results)))
   (let ((rn (walk (first (node-subexpressions node)) '() '() #f #f)))
-    (when (debugging 'x "specializations:")
+    (when (and (pair? specialization-statistics)
+	       (debugging 'x "specializations:"))
       (for-each 
        (lambda (ss)
 	 (printf "  ~a ~s~%" (cdr ss) (car ss)))
diff --git a/srfi-4.scm b/srfi-4.scm
index d4da259d..0d8ef56d 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -610,9 +610,9 @@ EOF
 
 ;;; Subvectors:
 
-(declare (hide subvector))
+(declare (hide subnvector))
 
-(define (subvector v t es from to loc)
+(define (subnvector v t es from to loc)
   (##sys#check-structure v t loc)
   (let* ([bv (##sys#slot v 1)]
 	 [len (##sys#size bv)]
@@ -626,14 +626,14 @@ EOF
 	(##core#inline "C_copy_subvector" bv2 bv 0 (fx* from es) size2)
 	v) ) ) )
 
-(define (subu8vector v from to) (subvector v 'u8vector 1 from to 'subu8vector))
-(define (subu16vector v from to) (subvector v 'u16vector 2 from to 'subu16vector))
-(define (subu32vector v from to) (subvector v 'u32vector 4 from to 'subu32vector))
-(define (subs8vector v from to) (subvector v 's8vector 1 from to 'subs8vector))
-(define (subs16vector v from to) (subvector v 's16vector 2 from to 'subs16vector))
-(define (subs32vector v from to) (subvector v 's32vector 4 from to 'subs32vector))
-(define (subf32vector v from to) (subvector v 'f32vector 4 from to 'subf32vector))
-(define (subf64vector v from to) (subvector v 'f64vector 8 from to 'subf64vector))
+(define (subu8vector v from to) (subnvector v 'u8vector 1 from to 'subu8vector))
+(define (subu16vector v from to) (subnvector v 'u16vector 2 from to 'subu16vector))
+(define (subu32vector v from to) (subnvector v 'u32vector 4 from to 'subu32vector))
+(define (subs8vector v from to) (subnvector v 's8vector 1 from to 'subs8vector))
+(define (subs16vector v from to) (subnvector v 's16vector 2 from to 'subs16vector))
+(define (subs32vector v from to) (subnvector v 's32vector 4 from to 'subs32vector))
+(define (subf32vector v from to) (subnvector v 'f32vector 4 from to 'subf32vector))
+(define (subf64vector v from to) (subnvector v 'f64vector 8 from to 'subf64vector))
 
 (define (write-u8vector v #!optional (port ##sys#standard-output) (from 0)
 			(to (u8vector-length v)))
diff --git a/types.db b/types.db
index fe4ed074..bfb3439a 100644
--- a/types.db
+++ b/types.db
@@ -144,18 +144,18 @@
 	   ((fixnum) (let ((#:tmp #(1))) '#t)))
 
 (zero? (procedure zero? (number) boolean) 
-       ((fixnum) (eq? #(1) 0))
+       ((fixnum) (eq? #(1) '0))
        ((number) (##core#inline "C_u_i_zerop" #(1))))
 
 (odd? (procedure odd? (number) boolean) ((fixnum) (fxodd? #(1))))
 (even? (procedure even? (number) boolean) ((fixnum) (fxeven? #(1))))
 
 (positive? (procedure positive? (number) boolean)
-	   ((fixnum) (##core#inline "C_fixnum_greaterp" #(1) 0))
+	   ((fixnum) (##core#inline "C_fixnum_greaterp" #(1) '0))
 	   ((number) (##core#inline "C_u_i_positivep" #(1))))
 
 (negative? (procedure negative? (number) boolean)
-	   ((fixnum) (##core#inline "C_fixnum_lessp" #(1) 0))
+	   ((fixnum) (##core#inline "C_fixnum_lessp" #(1) '0))
 	   ((number) (##core#inline "C_u_i_negativep" #(1))))
 
 (max (procedure max (#!rest number) number)
@@ -500,7 +500,7 @@
 (abort (procedure abort (*) noreturn))
 
 (add1 (procedure add1 (number) number)
-      ((float) (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) 1.0)))
+      ((float) (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) '1.0)))
 
 (argc+argv (procedure argc+argv () fixnum list))
 (argv (procedure argv () list))
@@ -813,7 +813,7 @@
 
 (sub1 (procedure sub1 (number) number)
       ((float) (##core#inline_allocate ("C_a_i_flonum_difference" 4) 
-				       #(1) 1.0)))
+				       #(1) '1.0)))
 
 (subvector (procedure subvector (vector fixnum #!optional fixnum) vector))
 (symbol-escape (procedure symbol-escape (#!optional *) *))
Trap