From 4b8517b27c5029aa949f5894220581edcd52660e Mon Sep 17 00:00:00 2001 From: Gustavo Massaccesi Date: Sat, 14 Feb 2015 15:03:45 -0300 Subject: [PATCH] Recognize more procedures in scheme_optimize_apply_values scheme_optimize_apply_values reduces (call-with-values gen proc) to (#%apply-values proc gen) when recognizes proc as a procedure. This extends the expressions that are recognized as procedures. --- .../tests/racket/optimize.rktl | 24 ++++++++++++++++++- racket/src/racket/src/optimize.c | 5 +++- 2 files changed, 27 insertions(+), 2 deletions(-) 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;