diff --git a/pkgs/racket-test-core/tests/racket/unsafe.rktl b/pkgs/racket-test-core/tests/racket/unsafe.rktl index a7905d80e8..697badc6c0 100644 --- a/pkgs/racket-test-core/tests/racket/unsafe.rktl +++ b/pkgs/racket-test-core/tests/racket/unsafe.rktl @@ -934,6 +934,31 @@ (unsafe-fxlshift 1 63) (unsafe-fxlshift 1 31))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check that allocation by inlined `unsafe-flrandom` is ok + +(test #t + symbol? + (let ([r (current-pseudo-random-generator)]) + (for/fold ([v #f]) ([i (in-range 1000000)]) + ;; The pattern of `if`s here is intended to check the JIT's + ;; runstack pointer is syned for allocation + (let* ([a (let ([v (unsafe-flrandom r)]) + (if (negative? v) + (error "oops") + v))] + [b (let ([v (unsafe-flrandom r)]) + (if (negative? v) + (error "oops") + v))] + [c (let ([v (unsafe-flrandom r)]) + (if (negative? v) + (error "oops") + v))]) + (if (and (eqv? a b) (eqv? b c)) + 'same + 'diff))))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/jitinline.c b/racket/src/racket/src/jitinline.c index 3b60f5b6b0..21a79baf44 100644 --- a/racket/src/racket/src/jitinline.c +++ b/racket/src/racket/src/jitinline.c @@ -2151,6 +2151,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in scheme_mz_unbox_restore(jitter, &ubs); mz_runstack_unskipped(jitter, 1); + mz_rs_sync(); mz_prepare(1); jit_pusharg_p(JIT_R0);