summaryrefslogtreecommitdiff
path: root/yjit_codegen.c
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2021-04-22 10:10:15 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:34 -0400
commit9bd779cbf96fc6abc6135502d8580a4765d4b28d (patch)
tree436af214be7d1a5d1ff6372376062a57d9de0ff6 /yjit_codegen.c
parente66c9f8c621eb710085b45a4274e2a2135de57d5 (diff)
Don't check if value is immediate if context has type info
Diffstat (limited to 'yjit_codegen.c')
-rw-r--r--yjit_codegen.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/yjit_codegen.c b/yjit_codegen.c
index e835d3442d..4d4f182b6d 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -775,13 +775,20 @@ gen_set_ivar(jitstate_t *jit, ctx_t *ctx, const int max_chain_depth, VALUE compt
if (iv_index_tbl && rb_iv_index_tbl_lookup(iv_index_tbl, id, &ent)) {
uint32_t ivar_index = ent->index;
- x86opnd_t val_to_write = ctx_stack_pop(ctx, 1);
+ val_type_t val_type = ctx_get_opnd_type(ctx, OPND_STACK(0));
+ x86opnd_t val_to_write = ctx_stack_opnd(ctx, 0);
mov(cb, REG1, val_to_write);
// Bail if the value to write is a heap object, because this needs a write barrier
- ADD_COMMENT(cb, "guard value is immediate");
- test(cb, REG1, imm_opnd(RUBY_IMMEDIATE_MASK));
- jz_ptr(cb, COUNTED_EXIT(side_exit, setivar_val_heapobject));
+ if (!val_type.is_imm) {
+ ADD_COMMENT(cb, "guard value is immediate");
+ test(cb, REG1, imm_opnd(RUBY_IMMEDIATE_MASK));
+ jz_ptr(cb, COUNTED_EXIT(side_exit, setivar_val_heapobject));
+ ctx_set_opnd_type(ctx, OPND_STACK(0), TYPE_IMM);
+ }
+
+ // Pop the value to write
+ ctx_stack_pop(ctx, 1);
// Bail if this object is frozen
ADD_COMMENT(cb, "guard self is not frozen");