diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index 0af03d685e..dece1e3213 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -2111,6 +2111,18 @@ '(lambda (z) (lambda () (lambda () z))) #f) +;; Don't move omittable expressions that keep a reference: +(test-comp '(lambda (z) (let ([r (pair? z)]) + (lambda () r))) + '(lambda (z) (lambda () + (lambda () (pair? z)))) + #f) +(test-comp '(lambda (z) (when (list? z) + (let ([r (list->vector z)]) + (lambda () r)))) + '(lambda (z) (when (list? z) + (lambda () (list->vector z)))) + #f) (test-comp '(if (let ([z (random)]) null) 1 2) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 11887408bd..11635cc351 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -1616,8 +1616,10 @@ static int movable_expression(Scheme_Object *expr, Optimize_Info *info, } break; case scheme_application_type: - if (SCHEME_APPN_FLAGS((Scheme_App_Rec *)expr) & APPN_FLAG_OMITTABLE) - can_move = 1; + if (!cross_lambda + && !cross_k + && (SCHEME_APPN_FLAGS((Scheme_App_Rec *)expr) & APPN_FLAG_OMITTABLE)) + can_move = -1; else can_move = is_movable_prim(((Scheme_App_Rec *)expr)->args[0], ((Scheme_App_Rec *)expr)->num_args, cross_lambda, cross_k, info); @@ -1633,8 +1635,10 @@ static int movable_expression(Scheme_Object *expr, Optimize_Info *info, } break; case scheme_application2_type: - if (SCHEME_APPN_FLAGS((Scheme_App2_Rec *)expr) & APPN_FLAG_OMITTABLE) - can_move = 1; + if (!cross_lambda + && !cross_k + && (SCHEME_APPN_FLAGS((Scheme_App2_Rec *)expr) & APPN_FLAG_OMITTABLE)) + can_move = -1; else can_move = is_movable_prim(((Scheme_App2_Rec *)expr)->rator, 1, cross_lambda, cross_k, info); if (can_move) { @@ -1645,8 +1649,10 @@ static int movable_expression(Scheme_Object *expr, Optimize_Info *info, } break; case scheme_application3_type: - if (SCHEME_APPN_FLAGS((Scheme_App3_Rec *)expr) & APPN_FLAG_OMITTABLE) - can_move = 1; + if (!cross_lambda + && !cross_k + && (SCHEME_APPN_FLAGS((Scheme_App3_Rec *)expr) & APPN_FLAG_OMITTABLE)) + can_move = -1; else can_move = is_movable_prim(((Scheme_App3_Rec *)expr)->rator, 2, cross_lambda, cross_k, info); if (can_move) {