From c8e9083f0e2a14317dab264420fe77720a82cc1a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 5 Jun 2019 10:07:04 -0600 Subject: [PATCH] repair for JIT-inlined `unsafe-make-flrectangular` --- .../tests/racket/jitinline.rktl | 64 +++++++++++++++++++ racket/src/racket/src/jitinline.c | 1 + 2 files changed, 65 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/jitinline.rktl b/pkgs/racket-test-core/tests/racket/jitinline.rktl index cf9453f2eb..ad6989cb2e 100644 --- a/pkgs/racket-test-core/tests/racket/jitinline.rktl +++ b/pkgs/racket-test-core/tests/racket/jitinline.rktl @@ -1197,6 +1197,70 @@ (set! f f) (err/rt-test (f))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Regression test to that used to fail because the inlined form of +;; `unsafe-make-flrectangular` was missing a runstack sync + +(let () + (define *iteration-limit* 50) + + (define (sqr x) (* x x)) + + (define (mandel c) + (define op + (let () + (define (mandel-iter unboxed-real-6 unboxed-imag-7 i) + (let-values (((z) 'check-syntax-binding)) + (if (let ((or-part (>= i *iteration-limit*))) + (if or-part + or-part + (fl> + (let ([r (flabs unboxed-real-6)]) + (let ([i (flabs unboxed-imag-7)]) + (if (zero? i) + r + (if (fl< i r) + (let ([q (fl/ i r)]) + (fl* r (flsqrt (fl+ '1.0 (fl* q q))))) + (let ([q (fl/ r i)]) + (fl* i (flsqrt (fl+ '1.0 (fl* q q))))))))) + 2.0))) + i + (let ([g8 c]) + (let-values (((unboxed-real-9) (flreal-part g8))) + (let-values (((unboxed-imag-10) (flimag-part g8))) + (let-values (((g11) (sqr (unsafe-make-flrectangular + unboxed-real-6 + unboxed-imag-7)))) + (let-values (((unboxed-real-12) (flreal-part g11))) + (let-values (((unboxed-imag-13) (flimag-part g11))) + (let-values (((unboxed-real-14) (fl+ (real->double-flonum + unboxed-real-9) + unboxed-real-12))) + (let-values (((unboxed-imag-15) (fl+ + (real->double-flonum + unboxed-imag-10) + unboxed-imag-13))) + (let-values (((boxed-binding16) (+ i '1))) + (mandel-iter + unboxed-real-14 + unboxed-imag-15 + boxed-binding16))))))))))))) + mandel-iter)) + (op 0.0 0.0 0)) + + (define (brot xs ys) + (for*/list ([y (in-list ys)] + [x (in-list xs)]) + (mandel (unsafe-make-flrectangular x y)))) + + (define (make-ticks min max resolution) + (for/list ([v (in-range min max (/ (fl- max min) resolution))]) + v)) + + (void (brot (make-ticks '-1.5 '0.5 '300) + (make-ticks '-1.0 '1.0 '300)))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/jitinline.c b/racket/src/racket/src/jitinline.c index 813796bcea..4483fefcf5 100644 --- a/racket/src/racket/src/jitinline.c +++ b/racket/src/racket/src/jitinline.c @@ -4459,6 +4459,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i scheme_generate_two_args(app->rand1, app->rand2, jitter, 1, 2); CHECK_LIMIT(); + mz_rs_sync(); allocate_rectangular(jitter, dest);