Skip to content

Commit d6b1f76

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

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

zjit/src/codegen.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,9 +1113,19 @@ 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 skip_wb = asm.new_label("skip_wb");
1118+
// If the value we're writing is an immediate, we don't need to WB
1119+
asm.test(val, (RUBY_IMMEDIATE_MASK as u64).into());
1120+
asm.jnz(skip_wb.clone());
1121+
// If the value we're writing is nil or false, we don't need to WB
1122+
asm.cmp(val, Qnil.into());
1123+
asm.jbe(skip_wb.clone());
1124+
11161125
let recv = asm.load(recv);
1117-
// TODO(max): Check at run-time if val is an immediate and if so skip the write barrier.
11181126
asm_ccall!(asm, rb_gc_writebarrier, recv, val);
1127+
1128+
asm.write_label(skip_wb);
11191129
}
11201130
}
11211131

0 commit comments

Comments
 (0)