~ chicken-core (chicken-5) 37c7156da6c0b23536c031f44a7734a8c6542e84
commit 37c7156da6c0b23536c031f44a7734a8c6542e84
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Dec 29 00:17:26 2009 +0100
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Tue Dec 29 00:17:26 2009 +0100
toplevel assignment-scan extended to check for drop over whole program; emits warning when dropping
diff --git a/optimizer.scm b/optimizer.scm
index aca264eb..9eacc2cc 100644
--- a/optimizer.scm
+++ b/optimizer.scm
@@ -41,66 +41,68 @@
(define (scan-toplevel-assignments node)
(let ((safe '())
(unsafe '())
- (dropped '())
+ (escaped #f)
(previous '()))
(define (mark v)
- (unless (memq v unsafe)
+ (when (and (not escaped)
+ (not (memq v unsafe)))
(set! safe (cons v safe))) )
(define (remember v x)
(set! previous (alist-update! v x previous)))
+ (define (touch)
+ (set! escaped #t)
+ (set! previous '()))
+
+ (define (scan-each ns e)
+ (for-each (lambda (n) (scan n e)) ns) )
+
+ (define (scan n e)
+ (let ([params (node-parameters n)]
+ [subs (node-subexpressions n)] )
+ (case (node-class n)
+
+ [(##core#variable)
+ (let ((var (first params)))
+ (when (and (not (memq var e))
+ (not (memq var safe)))
+ (set! unsafe (cons var unsafe)) ) ) ]
+
+ [(if ##core#cond ##core#switch)
+ (scan (first subs) e)
+ (touch)
+ (scan-each (cdr subs) e)]
+
+ [(let)
+ (scan (first subs) e)
+ (scan (second subs) (append params e)) ]
+
+ [(lambda ##core#lambda ##core#callunit) #f]
+
+ [(##core#call) (touch)]
+
+ [(set!)
+ (let ([var (first params)])
+ (and-let* ((p (alist-ref var previous)))
+ (compiler-warning
+ 'var
+ "dropping assignment of unused value to global variable `~s'"
+ var)
+ (copy-node!
+ (make-node '##core#undefined '() '())
+ p))
+ (scan (first subs) e)
+ (unless (memq var e) (mark var))
+ (remember var n) )]
+
+ [else (scan-each subs e)] ) ) )
+
(debugging 'p "scanning toplevel assignments...")
- (call-with-current-continuation
- (lambda (return)
-
- (define (scan-each ns e)
- (for-each (lambda (n) (scan n e)) ns) )
-
- (define (scan n e)
- (let ([params (node-parameters n)]
- [subs (node-subexpressions n)] )
- (case (node-class n)
-
- [(##core#variable)
- (let ([var (first params)])
- (when (and (not (memq var e)) (not (memq var safe)))
- (set! unsafe (cons var unsafe)) ) ) ]
-
- [(if ##core#cond ##core#switch)
- (scan (first subs) e)
- (return #f) ]
-
- [(let)
- (scan (first subs) e)
- (scan (second subs) (append params e)) ]
-
- [(lambda ##core#lambda ##core#callunit) #f]
-
- [(##core#call) (return #f)]
-
- [(set!)
- (let ([var (first params)])
- (and-let* ((p (alist-ref var previous)))
- (copy-node!
- (make-node '##core#undefined '() '())
- p)
- (let ((a (assq var dropped)))
- (if a
- (set-cdr! a (add1 (cdr a)))
- (set! dropped (alist-cons var 1 dropped)))))
- (unless (memq var e) (mark var))
- (scan (first subs) e)
- (remember var n) )]
-
- [else (scan-each subs e)] ) ) )
-
- (scan node '()) ) )
+ (scan node '())
(when (pair? safe)
(debugging 'o "safe globals" (delete-duplicates safe eq?)))
- (when (pair? dropped)
- (debugging 'x "dropped unused toplevel assignments" dropped))
(for-each (cut mark-variable <> '##compiler#always-bound) safe)))
Trap