~ chicken-core (chicken-5) b7a86a7be1705f373193a5e98defe1bf98bfa6a4
commit b7a86a7be1705f373193a5e98defe1bf98bfa6a4 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Sun Jan 25 21:52:31 2015 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sun Jan 25 21:52:31 2015 +0100 optimizer.scm: mini-srfi-1 diff --git a/optimizer.scm b/optimizer.scm index 4c00c222..3eae76b3 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -82,7 +82,7 @@ (when (and (not (memq var e)) (not (memq var unsafe))) (set! unsafe (cons var unsafe)) ) - (set! previous (remove (lambda (p) (eq? (car p) var)) previous)))] + (set! previous (filter (lambda (p) (not (eq? (car p) var))) previous)))] [(if ##core#cond ##core#switch) (scan (first subs) e) @@ -121,7 +121,7 @@ (debugging 'p "scanning toplevel assignments...") (scan node '()) (when (pair? safe) - (debugging 'o "safe globals" (delete-duplicates safe eq?))) + (debugging 'o "safe globals" (delete-duplicates safe))) (for-each (cut mark-variable <> '##compiler#always-bound) safe))) @@ -419,7 +419,7 @@ (map (cut walk <> fids gae) (cons fun - (append-reverse used args))) ) ) + (append (reverse used) args))) ) ) (invalidate-gae! gae) (make-node '##core#call params args))] [(test (car vars) 'unused) @@ -589,7 +589,7 @@ (body (first (node-subexpressions lnode))) (bodysubs (node-subexpressions body)) ) ;; Continuation has one parameter? - (if (and (proper-list? llist) (null? (cdr llist))) + (if (and (list? llist) (null? (cdr llist))) (let* ((var (car llist)) (refs (db-get-list db var 'references)) ) ;; Parameter is only used once? @@ -814,7 +814,7 @@ (d1 op x clist y z) ,(lambda (db may-rewrite d1 op x clist y z) (and-let* ([opa (assoc op (membership-test-operators))] - [(proper-list? clist)] + [(list? clist)] [(< (length clist) (membership-unfold-limit))] ) (let ([var (gensym)] [eop (list (cdr opa))] ) @@ -825,7 +825,7 @@ (make-node 'if d1 (list - (fold-right + (foldr (lambda (c rest) (make-node '##core#cond '() @@ -884,7 +884,7 @@ (alist-cons id (filter-map - (lambda (g2) (and (not (eq? g2 g)) (lset<= eq? (cdr g2) deps) (car g2))) + (lambda (g2) (and (not (eq? g2 g)) (lset<= (cdr g2) deps) (car g2))) groups) cgraph) ) ) ) groups) @@ -894,9 +894,9 @@ [optimized '()] ) ;; Construct new bindings: - (let ([n2 - (fold - (lambda (gn body) + (let ((n2 + (foldl + (lambda (body gn) (let* ([svars (cdr (assq gn groups))] [svar (car svars)] ) (cond [(and (null? (cdr svars)) @@ -904,12 +904,12 @@ (set! optimized (cons svar optimized)) (make-node 'let svars (list (cdr (assq svar valmap)) body)) ] [else - (fold-right + (foldr (lambda (var rest) (make-node 'let (list var) (list (make-node '##core#undefined '() '()) rest) ) ) - (fold-right + (foldr (lambda (var rest) (make-node 'let (list (gensym)) @@ -919,7 +919,7 @@ svars) svars) ] ) ) ) body - sgraph) ] ) + sgraph) ) ) (cond [(pair? optimized) (debugging 'o "converted assignments to bindings" optimized) (values n2 #t) ] @@ -980,7 +980,7 @@ (and may-rewrite (intrinsic? name) (or (not (second classargs)) (= (length callargs) (second classargs))) - (fold-right + (foldr (lambda (val body) (make-node 'let (list (gensym)) (list val body)) ) (make-node '##core#call (list #t) (list cont (varnode (first classargs)))) @@ -1055,20 +1055,24 @@ (and (eq? number-type 'flonum) (fourth classargs)) ) (let* ((names (map (lambda (z) (gensym)) callargs)) (vars (map varnode names)) ) - (fold-right - (lambda (x n y) (make-node 'let (list n) (list x y))) - (make-node - '##core#call (list #t) - (list - cont - (let ((op (list - (if (eq? number-type 'fixnum) - (first classargs) - (second classargs) ) ) ) ) - (fold-boolean - (lambda (x y) (make-node '##core#inline op (list x y))) - vars) ) ) ) - callargs names) ) ) ) ) ) + (let loop ((callargs callargs) + (names names)) + (if (null? callargs) + (make-node + '##core#call (list #t) + (list + cont + (let ((op (list + (if (eq? number-type 'fixnum) + (first classargs) + (second classargs) ) ) ) ) + (fold-boolean + (lambda (x y) (make-node '##core#inline op (list x y))) + vars) ) ) ) + (make-node 'let + (list (car names)) + (list (car callargs)) + (loop (cdr callargs) (cdr names)))))))))) ;; (<op> a [b]) -> (<primitiveop> a (quote <i>) b) ((10) ; classargs = (<primitiveop> <i> <bvar> <safe>) @@ -1216,10 +1220,10 @@ (let* ((id (first classargs)) (fixop (if unsafe (third classargs) (second classargs))) (callargs - (remove + (filter (lambda (x) - (and (eq? 'quote (node-class x)) - (eq? id (first (node-parameters x))) ) ) + (not (and (eq? 'quote (node-class x)) + (eq? id (first (node-parameters x))) ) ) ) callargs) ) ) (cond ((null? callargs) (make-node '##core#call (list #t) (list cont (qnode id)))) ((null? (cdr callargs)) @@ -1265,10 +1269,10 @@ (genop (fourth classargs)) (fixop (if unsafe (third classargs) (second classargs))) (callargs - (remove + (filter (lambda (x) - (and (eq? 'quote (node-class x)) - (eq? id (first (node-parameters x))) ) ) + (not (and (eq? 'quote (node-class x)) + (eq? id (first (node-parameters x))) ) ) ) callargs) ) ) (cond ((null? callargs) (make-node '##core#call (list #t) (list cont (qnode id)))) ((null? (cdr callargs)) @@ -1361,7 +1365,7 @@ (if (and d (second params) (not (db-get db d 'unknown)) - (proper-list? llist) + (list? llist) (and-let* ((val (db-get db d 'value)) (refs (db-get-list db d 'references)) (sites (db-get-list db d 'call-sites)) ) @@ -1458,7 +1462,7 @@ (set! hoistable '()) (set! allocated 0) (and (rec n #f #f env) - (lset= eq? closures (delete kvar inner-ks eq?)) ) ) ) + (lset= closures (delete kvar inner-ks)) ) ) ) (define (transform n fnvar ks hoistable destn allocated) (if (pair? hoistable) @@ -1547,14 +1551,17 @@ '##core#direct_call (list #t #f id allocated) (cons (car nsubs) (cddr nsubs)) ) ) ) ) ) - (lset-difference (lambda (s1 s2) (eq? (cdr s1) (cdr s2))) sites ksites) ) + (filter (lambda (site) + (let ((s2 (cdr site))) + (not (any (lambda (ksite) (eq? (cdr ksite) s2)) ksites)))) + sites)) ;; Hoist direct lambdas out of container: (when (and destn (pair? hoistable)) (let ([destn0 (make-node #f #f #f)]) (copy-node! destn destn0) ; get copy of container binding (let ([hoisted - (fold-right ; build cascade of bindings for each hoistable direct lambda... + (foldr ; build cascade of bindings for each hoistable direct lambda... (lambda (h rest) (make-node 'let (list (car h))Trap