Chez Scheme: make inlining see through make-wrapper-procedure
For example, (let ([f (make-wrapper-procedure (lambda (x) x) 2 'metadata)]) (f 5)) optimizes to just 5.
This commit is contained in:
parent
cbd7a2b2af
commit
535fa16813
|
@ -3141,3 +3141,65 @@
|
|||
'(#t #f)))
|
||||
|
||||
)
|
||||
|
||||
(mat make-wrapper-procedure
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '((make-wrapper-procedure (lambda (x) x) 2 'ok) 5)))
|
||||
5)
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '((make-arity-wrapper-procedure (lambda (x) x) 2 'ok) 5)))
|
||||
5)
|
||||
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '((make-wrapper-procedure (lambda (x) x) 2 (g)) 5)))
|
||||
(if (= 3 (optimize-level))
|
||||
'(begin (g) 5)
|
||||
'(begin (#3%$value (g)) 5)))
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '((make-arity-wrapper-procedure (lambda (x) x) 2 (g)) 5)))
|
||||
(if (= 3 (optimize-level))
|
||||
'(begin (g) 5)
|
||||
'(begin (#3%$value (g)) 5)))
|
||||
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '(let ([f (make-wrapper-procedure (lambda (x) x) 2 (g))]) (f 5))))
|
||||
(if (= 3 (optimize-level))
|
||||
'(begin (g) 5)
|
||||
'(begin (#3%$value (g)) 5)))
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '(let ([f (make-arity-wrapper-procedure (lambda (x) x) 2 (g))]) (f 5))))
|
||||
(if (= 3 (optimize-level))
|
||||
'(begin (g) 5)
|
||||
'(begin (#3%$value (g)) 5)))
|
||||
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '(let ([g (let ([f (make-wrapper-procedure (lambda (x) x) 2 (g))]) f)]) (g 5))))
|
||||
(if (= 3 (optimize-level))
|
||||
'(begin (g) 5)
|
||||
'(begin (#3%$value (g)) 5)))
|
||||
|
||||
(not
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '(let ([f (#2%make-wrapper-procedure (lambda (x) x) 2 (g))]) (#2%list (g f) (f 5)))))
|
||||
'(#2%list (g (#2%make-wrapper-procedure (lambda (x) x) 2 (g))) 5)))
|
||||
(not
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
(expand/optimize '(let ([f (#2%make-arity-wrapper-procedure (lambda (x) x) 2 (g))]) (#2%list (g f) (f 5)))))
|
||||
'(#2%list (g (#2%make-arity-wrapper-procedure (lambda (x) x) 2 (g))) 5)))
|
||||
|
||||
(not
|
||||
(equivalent-expansion?
|
||||
(parameterize ([enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||||
;; arity mismatch:
|
||||
(expand/optimize '((make-arity-wrapper-procedure (lambda (x) x) 1 'ok) 5)))
|
||||
5))
|
||||
)
|
||||
|
|
|
@ -5117,6 +5117,42 @@
|
|||
(preinfo-call-mask))
|
||||
(preinfo-call-mask no-inline)))])
|
||||
(cp0 `(call ,preinfo ,e ,e* ...) ctxt env sc wd name moi))]
|
||||
[(call ,preinfo ,pr ,e1 ,e2 ,e3)
|
||||
;; remove wrapper for immediately applied
|
||||
(guard (app? ctxt)
|
||||
(or (eq? (primref-name pr) 'make-wrapper-procedure)
|
||||
(eq? (primref-name pr) 'make-arity-wrapper-procedure))
|
||||
(nanopass-case (Lsrc Expr) e2
|
||||
[(quote ,d)
|
||||
(and (exact? d) (integer? d)
|
||||
(bitwise-bit-set? d (length (app-opnds ctxt))))]
|
||||
[else #f]))
|
||||
(let ([e1 (cp0 e1 ctxt env sc wd name moi)])
|
||||
(if (app-used ctxt)
|
||||
(make-1seq ctxt (make-seq* 'ignored (list e2 e3)) e1)
|
||||
(let ([e2 (cp0 e2 'value env sc wd #f moi)]
|
||||
[e3 (cp0 e2 'value env sc wd #f moi)])
|
||||
`(call ,preinfo ,pr ,e1 ,e2 ,e3))))]
|
||||
[(call ,preinfo ,pr ,e1 ,e2 ,e3)
|
||||
;; discard unused, non-error wrapper construction
|
||||
(guard (or (eq? (primref-name pr) 'make-wrapper-procedure)
|
||||
(eq? (primref-name pr) 'make-arity-wrapper-procedure))
|
||||
(unused-value-context? ctxt))
|
||||
(let ([e1 (cp0 e1 'value env sc wd name moi)]
|
||||
[e2 (cp0 e2 'value env sc wd #f moi)]
|
||||
[e3 (cp0 e3 'value env sc wd #f moi)])
|
||||
(cond
|
||||
[(nanopass-case (Lsrc Expr) e2
|
||||
[(quote ,d)
|
||||
(and (exact? d) (integer? d)
|
||||
(nanopass-case (Lsrc Expr) e1
|
||||
[(case-lambda ,preinfo (clause (,x* ...) ,interface ,body) ...) #t]
|
||||
[else #f]))]
|
||||
[else #f])
|
||||
;; can drop call
|
||||
(make-1seq* 'ignored (list e1 e3))]
|
||||
[else
|
||||
`(call ,preinfo ,pr ,e1 ,e2 ,e3)]))]
|
||||
[(call ,preinfo ,e ,e* ...)
|
||||
(let ()
|
||||
(define lift-let
|
||||
|
|
Loading…
Reference in New Issue
Block a user