From ab228bd0844758a1c444e39030c153874adf9120 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Fri, 26 Apr 2024 13:02:22 -0700 Subject: [PATCH] YJIT: Try splitting getlocal/setlocal blocks (#10648) --- yjit/src/codegen.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index 000f9fb516..50d65335f4 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -2265,6 +2265,12 @@ fn gen_getlocal_generic( ep_offset: u32, level: u32, ) -> Option { + // Start the block with this instruction for EP-escape invalidation + if level == 0 && !jit.at_current_insn() { + defer_compilation(jit, asm, ocb); + return Some(EndBlock); + } + let local_opnd = if level == 0 && jit.assume_no_ep_escape(asm, ocb) { // Load the local using SP register asm.ctx.ep_opnd(-(ep_offset as i32)) @@ -2326,6 +2332,12 @@ fn gen_setlocal_generic( ep_offset: u32, level: u32, ) -> Option { + // Start the block with this instruction for EP-escape invalidation + if level == 0 && !jit.at_current_insn() { + defer_compilation(jit, asm, ocb); + return Some(EndBlock); + } + let value_type = asm.ctx.get_opnd_type(StackOpnd(0)); // Fallback because of write barrier