23482348 'gc_preserve
23492349 (lambda (e)
23502350 (let* ((s (make-ssavalue))
2351- (r (gensy )))
2351+ (r (make-ssavalue )))
23522352 `(block
23532353 (= ,s (gc_preserve_begin ,@(cddr e)))
23542354 (= ,r ,(expand-forms (cadr e)))
@@ -4269,6 +4269,7 @@ f(x) = yt(x)
42694269 (linetable '(list))
42704270 (labltable (table))
42714271 (ssavtable (table))
4272+ (reachable #t)
42724273 (current-loc 0)
42734274 (current-file file)
42744275 (current-line line)
@@ -4279,13 +4280,16 @@ f(x) = yt(x)
42794280 (not (and (pair? e) (eq? (car e) 'meta))))
42804281 (begin (set! linetable (cons `(line ,line ,file) linetable))
42814282 (set! current-loc 1)))
4282- (set! code (cons e code))
4283- (set! i (+ i 1))
4284- (set! locs (cons current-loc locs)))
4283+ (if (or reachable
4284+ (and (pair? e) (memq (car e) '(meta inbounds gc_preserve_begin gc_preserve_end aliasscope popaliasscope))))
4285+ (begin (set! code (cons e code))
4286+ (set! i (+ i 1))
4287+ (set! locs (cons current-loc locs)))))
42854288 (let loop ((stmts (cdr body)))
42864289 (if (pair? stmts)
42874290 (let ((e (car stmts)))
4288- (cond ((and (pair? e) (eq? (car e) 'line))
4291+ (cond ((atom? e) (emit e))
4292+ ((eq? (car e) 'line)
42894293 (if (and (= current-line 0) (length= e 2) (pair? linetable))
42904294 ;; (line n) after push_loc just updates the line for the new file
42914295 (begin (set-car! (cdr (car linetable)) (cadr e))
@@ -4311,13 +4315,21 @@ f(x) = yt(x)
43114315 (set! current-loc (car l))
43124316 (set! current-line (cadr l))
43134317 (set! current-file (caddr l))))
4314- ((and (pair? e) (eq? (car e) 'label))
4318+ ((eq? (car e) 'label)
4319+ (set! reachable #t)
43154320 (put! labltable (cadr e) i))
43164321 ((and (assignment? e) (ssavalue? (cadr e)))
4317- (put! ssavtable (cadr (cadr e)) i)
4318- (emit (caddr e)))
4322+ (let ((idx (and (ssavalue? (caddr e)) (get ssavtable (cadr (caddr e)) #f))))
4323+ ;; if both lhs and rhs are ssavalues, merge them
4324+ (if idx
4325+ (put! ssavtable (cadr (cadr e)) idx)
4326+ (begin
4327+ (put! ssavtable (cadr (cadr e)) i)
4328+ (emit (caddr e))))))
43194329 (else
4320- (emit e)))
4330+ (emit e)
4331+ (if (or (eq? (car e) 'goto) (eq? (car e) 'return))
4332+ (set! reachable #f))))
43214333 (loop (cdr stmts)))))
43224334 (vector (reverse code) (reverse locs) (reverse linetable) ssavtable labltable)))
43234335
0 commit comments