(match (lookup-cont (idx->label n) dfg)
(($ $kargs _ _ body)
(match (find-call body)
- (($ $continue k) (cont-defs k))))
+ (($ $continue k src exp)
+ (match exp
+ (($ $branch) #f)
+ (_ (cont-defs k))))))
(($ $kreceive arity kargs)
(cont-defs kargs))
(($ $kclause arity ($ $cont kargs ($ $kargs names syms)))
(let ((typev (infer-types fun dfg)))
(define (idx->label idx) (+ idx min-label))
(define (var->idx var) (- var min-var))
+ (define (visit-primcall lidx fx name args)
+ (let ((args (map var->idx args)))
+ ;; Negative args are closure variables.
+ (unless (or-map negative? args)
+ (when (primcall-types-check? lidx typev name args)
+ (vector-set! effects lidx
+ (logand fx (lognot &type-check)))))))
(let lp ((lidx 0))
(when (< lidx label-count)
(let ((fx (vector-ref effects lidx)))
(($ $kargs _ _ term)
(match (find-call term)
(($ $continue k src ($ $primcall name args))
- (let ((args (map var->idx args)))
- ;; Negative args are closure variables.
- (unless (or-map negative? args)
- (when (primcall-types-check? lidx typev name args)
- (vector-set! effects lidx
- (logand fx (lognot &type-check)))))))
+ (visit-primcall lidx fx name args))
+ (($ $continue k src ($ $branch _ ($primcall name args)))
+ (visit-primcall lidx fx name args))
(_ #f)))
(_ #f)))))
(lp (1+ lidx)))))))))
(for-each mark-live! args))
(($ $primcall name args)
(for-each mark-live! args))
+ (($ $branch k ($ $primcall name args))
+ (for-each mark-live! args))
+ (($ $branch k ($ $values (arg)))
+ (mark-live! arg))
(($ $values args)
(match (vector-ref defs n)
(#f (for-each mark-live! args))