~ chicken-core (chicken-5) cc3c804a25419f46d20681e17c9f3e8b3763ac0d


commit cc3c804a25419f46d20681e17c9f3e8b3763ac0d
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Dec 14 16:49:22 2009 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Dec 14 16:49:22 2009 +0100

    removed rest-arg-as-vector optimization, since it can conflict with inlining

diff --git a/c-backend.scm b/c-backend.scm
index d8f3bd0e..50beea88 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -615,9 +615,7 @@
 		      (gen ");}") ]
 		     [(or rest (> (lambda-literal-allocated ll) 0) (lambda-literal-external ll))
 		      (if (and rest (not (eq? rest-mode 'none)))
-			  (if (eq? rest-mode 'vector)
-			      (set! nsrv (lset-adjoin = nsrv argc))
-			      (set! nsr (lset-adjoin = nsr argc)) ) 
+			  (set! nsr (lset-adjoin = nsr argc)) 
 			  (set! ns (lset-adjoin = ns argc)) ) ] ) ) ) )
 	 lambdas)
 	(for-each
@@ -842,7 +840,6 @@
 ;; 		   [(= nec 1) (gen #t "C_save(" (if empty-closure "t1" "t0") ");")] )
 	     (cond [rest
 		    (gen #t (if (> nec 0) "C_save_and_reclaim" "C_reclaim") "((void*)tr" n #\r)
-		    (when (eq? rest-mode 'vector) (gen #\v))
 		    (gen ",(void*)" id "r")
 		    (when (> nec 0)
 		      (gen #\, nec #\,)
@@ -850,9 +847,7 @@
 		    (gen ");}"
 			 #t "else{"
 			 #t "a=C_alloc((c-" n ")*3);")
-		    (case rest-mode
-		      [(list #f) (gen #t "t" n "=C_restore_rest(a,C_rest_count(0));")]
-		      [(vector) (gen #t "t" n "=C_restore_rest_vector(a,C_rest_count(0));")] )
+		    (gen #t "t" n "=C_restore_rest(a,C_rest_count(0));")
 		    (gen #t id "r(")
 		    (apply gen (intersperse (make-argument-list n "t") #\,))
 		    (gen ",t" n ");}}")
diff --git a/c-platform.scm b/c-platform.scm
index 215acb88..343a7749 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -70,8 +70,6 @@
 (define unlikely-variables '(unquote unquote-splicing))
 
 (define eq-inline-operator "C_eqp")
-(define optimizable-rest-argument-operators 
-  '(car cadr caddr cadddr length pair? null? list-ref))
 (define membership-test-operators
   '(("C_i_memq" . "C_eqp") ("C_u_i_memq" . "C_eqp") ("C_i_member" . "C_i_equalp")
     ("C_i_memv" . "C_i_eqvp") ) )
diff --git a/compiler-namespace.scm b/compiler-namespace.scm
index 5945ea16..b2bc6a3c 100644
--- a/compiler-namespace.scm
+++ b/compiler-namespace.scm
@@ -210,7 +210,6 @@
  node->sexpr
  non-foldable-bindings
  nonwinding-call/cc
- optimizable-rest-argument-operators
  optimization-iterations
  original-program-size
  output
diff --git a/compiler.scm b/compiler.scm
index 6ca7265c..4635167c 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -233,8 +233,7 @@
 ;   standard-binding -> <boolean>            If true: variable names a standard binding
 ;   extended-binding -> <boolean>            If true: variable names an extended binding
 ;   unused -> <boolean>                      If true: variable is a formal parameter that is never used
-;   rest-parameter -> #f | 'vector | 'list   If true: variable holds rest-argument list mode
-;   o-r/access-count -> <n>                  Contains number of references as arguments of optimizable rest operators
+;   rest-parameter -> #f | 'list             If true: variable holds rest-argument list
 ;   constant -> <boolean>                    If true: variable has fixed value
 ;   hidden-refs -> <boolean>                 If true: procedure that refers to hidden global variables
 ;   inline-transient -> <boolean>            If true: was introduced during inlining
@@ -351,7 +350,6 @@
 (define current-program-size 0)
 (define line-number-database-2 #f)
 (define immutable-constants '())
-(define rest-parameters-promoted-to-vector '())
 (define inline-table #f)
 (define inline-table-used #f)
 (define constant-table #f)
@@ -1724,18 +1722,9 @@
 	  ((##core#call)
 	   (grow 1)
 	   (let ([fun (car subs)])
-	     (if (eq? '##core#variable (node-class fun))
-		 (let ([name (first (node-parameters fun))])
-		   (collect! db name 'call-sites (cons here n))
-		   ;; If call to standard-binding & optimizable rest-arg operator: decrease access count:
-		   (if (and (intrinsic? name)
-			    (memq name optimizable-rest-argument-operators) )
-		       (for-each
-			(lambda (arg)
-			  (and-let* ([(eq? '##core#variable (node-class arg))]
-				     [var (first (node-parameters arg))] )
-			    (when (get db var 'rest-parameter) (count! db var 'o-r/access-count)) ) )
-			(cdr subs) ) ) ) )
+	     (when (eq? '##core#variable (node-class fun))
+	       (let ([name (first (node-parameters fun))])
+		 (collect! db name 'call-sites (cons here n))))
 	     (walk (first subs) env localenv here #t)
 	     (walkeach (cdr subs) env localenv here #f) ) )
 
@@ -1780,10 +1769,7 @@
 		   (put! db var 'unknown #t) )
 		 vars)
 		(when rest
-		  (put! db rest 'rest-parameter
-			(if (memq rest rest-parameters-promoted-to-vector)
-			    'vector
-			    'list) ) )
+		  (put! db rest 'rest-parameter 'list) )
 		(when (simple-lambda-node? n) (put! db id 'simple #t))
 		(let ([tl toplevel-scope])
 		  (unless toplevel-lambda-id (set! toplevel-lambda-id id))
@@ -1886,7 +1872,6 @@
 	     [assigned-locally #f]
 	     [undefined #f]
 	     [global #f]
-	     [o-r/access-count 0]
 	     [rest-parameter #f] 
 	     [nreferences 0]
 	     [ncall-sites 0] )
@@ -1909,7 +1894,6 @@
 	      [(global) (set! global #t)]
 	      [(value) (set! value (cdr prop))]
 	      [(local-value) (set! local-value (cdr prop))]
-	      [(o-r/access-count) (set! o-r/access-count (cdr prop))]
 	      [(rest-parameter) (set! rest-parameter #t)] ) )
 	  plist)
 
@@ -2072,25 +2056,10 @@
 				    (eq? (first llist) (first (node-parameters v2))) )
 			   (let ([kvar (first (node-parameters v1))])
 			     (quick-put! plist 'replacable kvar)
-			     (put! db kvar 'replacing #t) ) ) ) ) ) ) ) ) ) )
-
-	 ;; If a rest-argument, convert 'rest-parameter property to 'vector, if the variable is never
-	 ;;  assigned, and the number of references is identical to the number of accesses in optimizable
-	 ;;  rest-argument operators:
-	 ;; - Add variable to "rest-parameters-promoted-to-vector", because subsequent optimization will
-	 ;;   change variables context (operators applied to it).
-	 (when (and rest-parameter
-		    (not assigned)
-		    (= nreferences o-r/access-count) )
-	   (set! rest-parameters-promoted-to-vector (lset-adjoin eq? rest-parameters-promoted-to-vector sym))
-	   (put! db sym 'rest-parameter 'vector) ) ) )
+			     (put! db kvar 'replacing #t) ) ) ) ) ) ) ) ) ) ) ) )
 
      db)
 
-    ;; Remove explicitly consed rest parameters from promoted ones:
-    (set! rest-parameters-promoted-to-vector
-      (lset-difference eq? rest-parameters-promoted-to-vector explicitly-consed) )
-
     ;; Set original program-size, if this is the first analysis-pass:
     (unless original-program-size
       (set! original-program-size current-program-size) )
@@ -2371,7 +2340,7 @@
   (closure-size lambda-literal-closure-size)	       ; integer
   (looping lambda-literal-looping)		       ; boolean
   (customizable lambda-literal-customizable)	       ; boolean
-  (rest-argument-mode lambda-literal-rest-argument-mode) ; #f | LIST | VECTOR | UNUSED
+  (rest-argument-mode lambda-literal-rest-argument-mode) ; #f | LIST | NONE
   (body lambda-literal-body)				 ; expression
   (direct lambda-literal-direct))			 ; boolean
   
@@ -2488,9 +2457,8 @@
 				  vars)
 			      id
 			      '()) ] )
-		  (case rest-mode
-		    [(none) (debugging 'o "unused rest argument" rest id)]
-		    [(vector) (debugging 'o "rest argument accessed as vector" rest id)] )
+		  (when (eq? rest-mode 'none)
+		    (debugging 'o "unused rest argument" rest id))
 		  (when (and direct rest)
 		    (bomb "bad direct lambda" id allocated rest) )
 		  (set! lambdas
diff --git a/optimizer.scm b/optimizer.scm
index 9becaf38..edcc685f 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -1,7 +1,7 @@
 ;;;; optimizer.scm - The CHICKEN Scheme compiler (optimizations)
 ;
-; Copyright (c) 2000-2007, Felix L. Winkelmann
 ; Copyright (c) 2008-2009, The Chicken Team
+; Copyright (c) 2000-2007, Felix L. Winkelmann
 ; All rights reserved.
 ;
 ; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
diff --git a/support.scm b/support.scm
index 51493735..767a4168 100644
--- a/support.scm
+++ b/support.scm
@@ -427,7 +427,7 @@
 		       ((potential-value)
 			(set! pval (cdar es)) )
 		       ((replacable home contains contained-in use-expr closure-size rest-parameter
-				    o-r/access-count captured-variables explicit-rest)
+				    captured-variables explicit-rest)
 			(printf "\t~a=~s" (caar es) (cdar es)) )
 		       ((references)
 			(set! refs (cdar es)) )
diff --git a/tests/runtests.sh b/tests/runtests.sh
index f2267793..2b706893 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -211,7 +211,7 @@ $compile -e embedded2.scm
 ./a.out
 
 echo "======================================== timing compilation ..."
-time $compile compiler.scm -S -O5 -debug pb -v
+time $compile compiler.scm -O5 -debug pb -v
 time ./a.out
 
 echo "======================================== running floating-point benchmark ..."
Trap