Skip to content

Commit 8478bb5

Browse files
committed
ZJIT: Skip WriteBarrier if the value being written is immediate
Add a check at run-time.
1 parent 0be1322 commit 8478bb5

File tree

1 file changed

+13
-0
lines changed

1 file changed

+13
-0
lines changed

zjit/src/codegen.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,9 +1113,22 @@ fn gen_write_barrier(asm: &mut Assembler, recv: Opnd, val: Opnd, val_type: Type)
11131113
// See RB_OBJ_WRITE/rb_obj_write: it's just assignment and rb_obj_written()->rb_gc_writebarrier()
11141114
if !val_type.is_immediate() {
11151115
asm_comment!(asm, "Write barrier");
1116+
// TODO(max): Only emit the run-time check if we couldn't prove the value is a HeapBasicObject.
1117+
let val = asm.load(val);
1118+
let skip_wb = asm.new_label("skip_wb");
1119+
// If the value we're writing is an immediate, we don't need to WB
1120+
asm.test(val, (RUBY_IMMEDIATE_MASK as u64).into());
1121+
asm.jnz(skip_wb);
1122+
1123+
// If the value we're writing is nil or false, we don't need to WB
1124+
asm.cmp(val, Qnil.into());
1125+
asm.jbe(skip_wb);
1126+
11161127
let recv = asm.load(recv);
11171128
// TODO(max): Check at run-time if val is an immediate and if so skip the write barrier.
11181129
asm_ccall!(asm, rb_gc_writebarrier, recv, val);
1130+
1131+
asm.write_label(skip_wb);
11191132
}
11201133
}
11211134

0 commit comments

Comments
 (0)