2348
2348
'gc_preserve
2349
2349
(lambda (e )
2350
2350
(let* ((s (make-ssavalue))
2351
- (r (gensy )))
2351
+ (r (make-ssavalue )))
2352
2352
`(block
2353
2353
(= ,s (gc_preserve_begin ,@(cddr e)))
2354
2354
(= ,r ,(expand-forms (cadr e)))
@@ -4269,6 +4269,7 @@ f(x) = yt(x)
4269
4269
(linetable ' (list))
4270
4270
(labltable (table))
4271
4271
(ssavtable (table))
4272
+ (reachable #t )
4272
4273
(current-loc 0 )
4273
4274
(current-file file)
4274
4275
(current-line line)
@@ -4279,13 +4280,16 @@ f(x) = yt(x)
4279
4280
(not (and (pair? e) (eq? (car e) 'meta ))))
4280
4281
(begin (set! linetable (cons `(line ,line ,file) linetable))
4281
4282
(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)))))
4285
4288
(let loop ((stmts (cdr body)))
4286
4289
(if (pair? stmts)
4287
4290
(let ((e (car stmts)))
4288
- (cond ((and (pair? e) (eq? (car e) 'line ))
4291
+ (cond ((atom? e) (emit e))
4292
+ ((eq? (car e) 'line )
4289
4293
(if (and (= current-line 0 ) (length= e 2 ) (pair? linetable))
4290
4294
; ; (line n) after push_loc just updates the line for the new file
4291
4295
(begin (set-car! (cdr (car linetable)) (cadr e))
@@ -4311,13 +4315,21 @@ f(x) = yt(x)
4311
4315
(set! current-loc (car l))
4312
4316
(set! current-line (cadr l))
4313
4317
(set! current-file (caddr l))))
4314
- ((and (pair? e) (eq? (car e) 'label ))
4318
+ ((eq? (car e) 'label )
4319
+ (set! reachable #t )
4315
4320
(put! labltable (cadr e) i))
4316
4321
((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))))))
4319
4329
(else
4320
- (emit e)))
4330
+ (emit e)
4331
+ (if (or (eq? (car e) 'goto ) (eq? (car e) 'return ))
4332
+ (set! reachable #f ))))
4321
4333
(loop (cdr stmts)))))
4322
4334
(vector (reverse code) (reverse locs) (reverse linetable) ssavtable labltable)))
4323
4335
0 commit comments