From d238007cf8cbf718c2ddcdd2c057ca767a20c03c Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 28 Feb 2019 09:24:28 -0700 Subject: [PATCH] fix JIT-inlined `unsafe-flrandom` Relevant to racket/typed-racket#807 --- .../racket-test-core/tests/racket/unsafe.rktl | 25 +++++++++++++++++++ racket/src/racket/src/jitinline.c | 1 + 2 files changed, 26 insertions(+) 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);