From fd883dbf32a1635c28d3e6e4553f2dd1fd60bdb7 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 23 Apr 2013 20:05:41 -0600 Subject: [PATCH] fix a JIT bug related to inlined structure constructors Merge to v5.3.4 --- collects/tests/racket/optimize.rktl | 11 +++++++++++ src/racket/src/jitinline.c | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/collects/tests/racket/optimize.rktl b/collects/tests/racket/optimize.rktl index 8b974b6788..372828da4d 100644 --- a/collects/tests/racket/optimize.rktl +++ b/collects/tests/racket/optimize.rktl @@ -3096,6 +3096,17 @@ (go '(foo-x (foo 1)))) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; The JIT should check an inlined-constructor guess +;; to make sure that it's "simple" (e.g., no guards) + +(let ([f #f]) + (set! f (lambda (f x) (f x))) + (struct a (x)) + (struct b (y) #:property prop:procedure 0) + (test 1 a-x (f a 1)) + (test 2 (f b (lambda () 2)))) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index dae98e31a2..a53e852326 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -756,7 +756,8 @@ int scheme_generate_struct_alloc(mz_jit_state *jitter, int num_args, mz_patch_branch(ref); (void)mz_bnei_t(refslow, JIT_R0, scheme_prim_type, JIT_R2); jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Primitive_Proc *)0x0)->pp.flags); - (void)jit_bmci_i(refslow, JIT_R2, SCHEME_PRIM_STRUCT_TYPE_SIMPLE_CONSTR); + jit_andi_i(JIT_R2, JIT_R2, SCHEME_PRIM_OTHER_TYPE_MASK); + (void)jit_bnei_i(refslow, JIT_R2, SCHEME_PRIM_STRUCT_TYPE_SIMPLE_CONSTR); CHECK_LIMIT(); jit_ldxi_p(JIT_R2, JIT_R0, &(SCHEME_PRIM_CLOSURE_ELS(0x0)[0]));