From 60433b15f7fc8fa7197a4fd762544a03eeb3e278 Mon Sep 17 00:00:00 2001 From: Gustavo Massaccesi Date: Sat, 29 Nov 2014 22:36:10 -0300 Subject: [PATCH] optimizer: fix do_make_discarding_sequence The optimizer converts (car (cons X Y)) to (begin0 X Y) and then reduces it to (begin Y X) if X is movable. Check that the movement is safe for space and for continuation captures. --- .../racket-test/tests/racket/optimize.rktl | 26 +++++++++++++++++-- racket/src/racket/src/optimize.c | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 48b44a79a8..20163252d5 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -1340,10 +1340,32 @@ (test-comp '(lambda (w z) (box? (list (cons (random w) z)))) '(lambda (w z) (random w) #f)) +(test-comp '(lambda () (begin0 (random 1) (random 2))) + '(lambda () (car (cons (random 1) (random 2))))) +(test-comp '(lambda () (begin (random 1) (random 2))) + '(lambda () (cdr (cons (random 1) (random 2))))) + (test-comp '(lambda (w) - (car (cons w (random)))) + (begin (random) w)) '(lambda (w) - (begin (random) w))) + (car (cons w (random))))) +;don't exchange if it may capture a continuation +(test-comp '(lambda (f) + (begin (values (f)) (list 7))) + '(lambda (f) + (car (cons (list 7) (values (f))))) + #f) +;don't exchange if it may be not safe for space +(test-comp '(lambda (f) + (let ([big (cons (f) (make-vector 10))]) + (display big) + (begin (make-vector 20) (car big)))) + '(lambda (f) + (let ([big (cons (f) (make-vector 10))]) + (display big) + (car (cons (car big) (make-vector 20))))) + #f) + (test-comp '(lambda (w) (begin (list (random) w) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 17947492f3..389337bd33 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -550,7 +550,7 @@ static Scheme_Object *do_make_discarding_sequence(Scheme_Object *e1, Scheme_Obje return e1; /* use `begin` instead of `begin0` if we can swap the order: */ - if (rev && movable_expression(e2, info, -id_offset, 0, 0, 0, 0, 50)) + if (rev && movable_expression(e2, info, -id_offset, 0, 1, 1, 0, 50)) rev = 0; return scheme_make_sequence_compilation(scheme_make_pair((rev ? e2 : e1),