diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index a04c5ce91b..7780838439 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -3444,6 +3444,28 @@ (err/rt-test (cwv-2-5-f (lambda () 1) (lambda (y z) (+ y 2))) exn:fail:contract:arity?) (err/rt-test (cwv-2-5-f (lambda () (values 1 2 3)) (lambda (y z) (+ y 2))) exn:fail:contract:arity?) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Transform call-with-values to direct aplication: +(test-comp '(lambda (f) (f 7)) + '(lambda (f) (call-with-values (lambda () 7) (lambda (x) (f x))))) +(test-comp '(lambda () (car 7)) + '(lambda () (call-with-values (lambda () 7) car))) +(test-comp '(lambda () ('not-a-procedure 7)) + '(lambda () (call-with-values (lambda () 7) 'not-a-procedure)) + #f) +(test-comp '(module ? racket/base + (define f (lambda (x) (list x 0))) + (lambda () (display f) (f 7))) + '(module ? racket/base + (define f (lambda (x) (list x 0))) + (lambda () (display f) (call-with-values (lambda () 7) f)))) +(test-comp '(module ? racket/base + (define f (let ([tmp (list 0)]) (lambda (x) (list x tmp)))) + (lambda () (f 7))) + '(module ? racket/base + (define f (let ([tmp (list 0)]) (lambda (x) (list x tmp)))) + (lambda () (call-with-values (lambda () 7) f)))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Inlining with higher-order functions: @@ -4520,7 +4542,7 @@ (report-answer-all 8))))))) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Check that cross-module inlining decmopiles a function +;; Check that cross-module inlining decompiles a function ;; with correct use counts on arguments (specifically: B is used ;; twice, so the argument expression can't be inlined for two uses) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 2f630e17be..fe2d89e7c6 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -3626,7 +3626,10 @@ Scheme_Object *scheme_optimize_apply_values(Scheme_Object *f, Scheme_Object *e, if (rev) { int rator2_flags; Scheme_Object *o_f; - o_f = optimize_for_inline(info, rev, 1, NULL, NULL, NULL, &rator2_flags, context, 0, 0); + o_f = lookup_constant_proc(info, rev, 0); + if (!o_f) + o_f = optimize_for_inline(info, rev, 1, NULL, NULL, NULL, &rator2_flags, context, 0, 0); + if (o_f) { f_is_proc = rev;