~ chicken-core (chicken-5) ca990ee483c2de61228079b4e7e8b704f7f3b98c
commit ca990ee483c2de61228079b4e7e8b704f7f3b98c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Aug 5 09:33:17 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Aug 5 09:33:17 2011 +0200 fixed bug in gp optimizuation (reported by Sven Hartrumpf) diff --git a/optimizer.scm b/optimizer.scm index 5f74d41b..dd380cc2 100644 --- a/optimizer.scm +++ b/optimizer.scm @@ -231,7 +231,7 @@ (let ((gvar (cdr a))) (cond ((and gvar (not (eq? 'no (variable-mark gvar '##compiler#inline)))) - (debugging 'x "propagated global variable" var gvar) + (debugging 'o "propagated global variable" var gvar) (varnode gvar)) (else (varnode var)))))) (else (varnode var))))) @@ -463,7 +463,15 @@ (make-node '##core#undefined '() '()) ) (else (let ((n2 (make-node 'set! params (list (walk (car subs) fids gae))))) - (cond ((assq var gae) => (cut set-cdr! <> #f))) + (for-each + (if (test var 'global) + (lambda (a) + (when (eq? var (cdr a)) ; assignment to alias? + (set-cdr! a #f))) + (lambda (a) + (when (eq? var (car a)) + (set-cdr! a #f)))) + gae) n2))))) (else (walk-generic n class params subs fids gae #f)) ) ) ) diff --git a/tests/compiler-tests.scm b/tests/compiler-tests.scm index 6b7432fc..73951302 100644 --- a/tests/compiler-tests.scm +++ b/tests/compiler-tests.scm @@ -200,4 +200,19 @@ (define (baz) (bar a: #t)) baz) - bar) \ No newline at end of file + bar) + + +;; global-propagation must also invalidate alias to global if global +;; itself is assigned (reported by Sven Hartrumpf) + +(define gp-test-global 0) + +(define (gp-test) + (let ((a gp-test-global) + (b gp-test-global)) + (set! gp-test-global 1) + (assert (zero? a)) + (assert (zero? b)))) + +(gp-test)Trap