Skip to content

Commit f0b288a

Browse files
rwstaunertekknolagi
authored andcommitted
ZJIT: Put keyword bits in callee frame rather than c_args
1 parent c42f4d8 commit f0b288a

File tree

4 files changed

+29
-16
lines changed

4 files changed

+29
-16
lines changed

zjit/src/codegen.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,6 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
384384
// Give up SendWithoutBlockDirect for 6+ args since asm.ccall() doesn't support it.
385385
Insn::SendWithoutBlockDirect { cd, state, args, .. } if args.len() + 1 > C_ARG_OPNDS.len() => // +1 for self
386386
gen_send_without_block(jit, asm, *cd, &function.frame_state(*state), SendFallbackReason::TooManyArgsForLir),
387-
// Give up SendWithoutBlockDirect for 5+ args (plus 1 arg for keyword bits) since asm.ccall() doesn't support it.
388-
Insn::SendWithoutBlockDirect { cd, state, args, iseq, .. } if args.len() + 2 > C_ARG_OPNDS.len() && unsafe { rb_get_iseq_flags_has_kw(*iseq) } => // +1 for self +1 for keyword bits
389-
gen_send_without_block(jit, asm, *cd, &function.frame_state(*state), SendFallbackReason::TooManyArgsForLir),
390387
Insn::SendWithoutBlockDirect { cme, iseq, recv, args, state, .. } => gen_send_without_block_direct(cb, jit, asm, *cme, *iseq, opnd!(recv), opnds!(args), &function.frame_state(*state)),
391388
&Insn::InvokeSuper { cd, blockiseq, state, reason, .. } => gen_invokesuper(jit, asm, cd, blockiseq, &function.frame_state(state), reason),
392389
&Insn::InvokeBlock { cd, state, reason, .. } => gen_invokeblock(jit, asm, cd, &function.frame_state(state), reason),
@@ -1368,13 +1365,6 @@ fn gen_send_without_block_direct(
13681365
let mut c_args = vec![recv];
13691366
c_args.extend(&args);
13701367

1371-
if unsafe { rb_get_iseq_flags_has_kw(iseq) } {
1372-
// Currently we only get to this point if all the accepted keyword args are required.
1373-
let unspecified_bits = 0;
1374-
// For each optional keyword that isn't passed we would `unspecified_bits |= (0x01 << idx)`.
1375-
c_args.push(VALUE::fixnum_from_usize(unspecified_bits).into());
1376-
}
1377-
13781368
let params = unsafe { iseq.params() };
13791369
let num_optionals_passed = if params.flags.has_opt() != 0 {
13801370
// See vm_call_iseq_setup_normal_opt_start in vm_inshelper.c

zjit/src/hir.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6239,12 +6239,29 @@ fn compile_jit_entry_state(fun: &mut Function, jit_entry_block: BlockId, jit_ent
62396239
let lead_num: usize = params.lead_num.try_into().expect("iseq param lead_num >= 0");
62406240
let passed_opt_num = jit_entry_idx;
62416241

6242+
// If the iseq has keyword parameters, the keyword bits local will be appended to the local table.
6243+
let kw_bits_idx: Option<usize> = if unsafe { rb_get_iseq_flags_has_kw(iseq) } {
6244+
let keyword = unsafe { rb_get_iseq_body_param_keyword(iseq) };
6245+
if !keyword.is_null() {
6246+
Some(unsafe { (*keyword).bits_start } as usize)
6247+
} else {
6248+
None
6249+
}
6250+
} else {
6251+
None
6252+
};
6253+
62426254
let self_param = fun.push_insn(jit_entry_block, Insn::Param);
62436255
let mut entry_state = FrameState::new(iseq);
62446256
for local_idx in 0..num_locals(iseq) {
62456257
if (lead_num + passed_opt_num..lead_num + opt_num).contains(&local_idx) {
62466258
// Omitted optionals are locals, so they start as nils before their code run
62476259
entry_state.locals.push(fun.push_insn(jit_entry_block, Insn::Const { val: Const::Value(Qnil) }));
6260+
} else if Some(local_idx) == kw_bits_idx {
6261+
// We currently only support required keywords so the unspecified bits will always be zero.
6262+
// TODO: Make this a parameter when we start writing anything other than zero.
6263+
let unspecified_bits = VALUE::fixnum_from_usize(0);
6264+
entry_state.locals.push(fun.push_insn(jit_entry_block, Insn::Const { val: Const::Value(unspecified_bits) }));
62486265
} else if local_idx < param_size {
62496266
entry_state.locals.push(fun.push_insn(jit_entry_block, Insn::Param));
62506267
} else {

zjit/src/hir/opt_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,9 @@ mod hir_opt_tests {
626626
v2:BasicObject = GetLocal :k, l0, SP@5
627627
v3:BasicObject = GetLocal <empty>, l0, SP@4
628628
Jump bb2(v1, v2, v3)
629-
bb1(v6:BasicObject, v7:BasicObject, v8:BasicObject):
629+
bb1(v6:BasicObject, v7:BasicObject):
630630
EntryPoint JIT(0)
631+
v8:Fixnum[0] = Const Value(0)
631632
Jump bb2(v6, v7, v8)
632633
bb2(v10:BasicObject, v11:BasicObject, v12:BasicObject):
633634
CheckInterrupts

zjit/src/hir/tests.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,8 +3000,9 @@ pub mod hir_build_tests {
30003000
v3:BasicObject = GetLocal :exception, l0, SP@5
30013001
v4:BasicObject = GetLocal <empty>, l0, SP@4
30023002
Jump bb2(v1, v2, v3, v4)
3003-
bb1(v7:BasicObject, v8:BasicObject, v9:BasicObject, v10:BasicObject):
3003+
bb1(v7:BasicObject, v8:BasicObject, v9:BasicObject):
30043004
EntryPoint JIT(0)
3005+
v10:Fixnum[0] = Const Value(0)
30053006
Jump bb2(v7, v8, v9, v10)
30063007
bb2(v12:BasicObject, v13:BasicObject, v14:BasicObject, v15:BasicObject):
30073008
v19:Float = InvokeBuiltin rb_f_float, v12, v13, v14
@@ -3050,8 +3051,9 @@ pub mod hir_build_tests {
30503051
v5:BasicObject = GetLocal :block, l0, SP@5
30513052
v6:NilClass = Const Value(nil)
30523053
Jump bb2(v1, v2, v3, v4, v5, v6)
3053-
bb1(v9:BasicObject, v10:BasicObject, v11:BasicObject, v12:BasicObject, v13:BasicObject):
3054+
bb1(v9:BasicObject, v10:BasicObject, v11:BasicObject, v13:BasicObject):
30543055
EntryPoint JIT(0)
3056+
v12:Fixnum[0] = Const Value(0)
30553057
v14:NilClass = Const Value(nil)
30563058
Jump bb2(v9, v10, v11, v12, v13, v14)
30573059
bb2(v16:BasicObject, v17:BasicObject, v18:BasicObject, v19:BasicObject, v20:BasicObject, v21:NilClass):
@@ -3112,8 +3114,9 @@ pub mod hir_build_tests {
31123114
v4:BasicObject = GetLocal :immediate_sweep, l0, SP@5
31133115
v5:BasicObject = GetLocal <empty>, l0, SP@4
31143116
Jump bb2(v1, v2, v3, v4, v5)
3115-
bb1(v8:BasicObject, v9:BasicObject, v10:BasicObject, v11:BasicObject, v12:BasicObject):
3117+
bb1(v8:BasicObject, v9:BasicObject, v10:BasicObject, v11:BasicObject):
31163118
EntryPoint JIT(0)
3119+
v12:Fixnum[0] = Const Value(0)
31173120
Jump bb2(v8, v9, v10, v11, v12)
31183121
bb2(v14:BasicObject, v15:BasicObject, v16:BasicObject, v17:BasicObject, v18:BasicObject):
31193122
v25:FalseClass = Const Value(false)
@@ -3532,8 +3535,9 @@ pub mod hir_build_tests {
35323535
v2:BasicObject = GetLocal :kw, l0, SP@5
35333536
v3:BasicObject = GetLocal <empty>, l0, SP@4
35343537
Jump bb2(v1, v2, v3)
3535-
bb1(v6:BasicObject, v7:BasicObject, v8:BasicObject):
3538+
bb1(v6:BasicObject, v7:BasicObject):
35363539
EntryPoint JIT(0)
3540+
v8:Fixnum[0] = Const Value(0)
35373541
Jump bb2(v6, v7, v8)
35383542
bb2(v10:BasicObject, v11:BasicObject, v12:BasicObject):
35393543
v15:BasicObject = GetLocal <empty>, l0, EP@3
@@ -3605,8 +3609,9 @@ pub mod hir_build_tests {
36053609
v34:BasicObject = GetLocal :k33, l0, SP@5
36063610
v35:BasicObject = GetLocal <empty>, l0, SP@4
36073611
Jump bb2(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35)
3608-
bb1(v38:BasicObject, v39:BasicObject, v40:BasicObject, v41:BasicObject, v42:BasicObject, v43:BasicObject, v44:BasicObject, v45:BasicObject, v46:BasicObject, v47:BasicObject, v48:BasicObject, v49:BasicObject, v50:BasicObject, v51:BasicObject, v52:BasicObject, v53:BasicObject, v54:BasicObject, v55:BasicObject, v56:BasicObject, v57:BasicObject, v58:BasicObject, v59:BasicObject, v60:BasicObject, v61:BasicObject, v62:BasicObject, v63:BasicObject, v64:BasicObject, v65:BasicObject, v66:BasicObject, v67:BasicObject, v68:BasicObject, v69:BasicObject, v70:BasicObject, v71:BasicObject, v72:BasicObject):
3612+
bb1(v38:BasicObject, v39:BasicObject, v40:BasicObject, v41:BasicObject, v42:BasicObject, v43:BasicObject, v44:BasicObject, v45:BasicObject, v46:BasicObject, v47:BasicObject, v48:BasicObject, v49:BasicObject, v50:BasicObject, v51:BasicObject, v52:BasicObject, v53:BasicObject, v54:BasicObject, v55:BasicObject, v56:BasicObject, v57:BasicObject, v58:BasicObject, v59:BasicObject, v60:BasicObject, v61:BasicObject, v62:BasicObject, v63:BasicObject, v64:BasicObject, v65:BasicObject, v66:BasicObject, v67:BasicObject, v68:BasicObject, v69:BasicObject, v70:BasicObject, v71:BasicObject):
36093613
EntryPoint JIT(0)
3614+
v72:Fixnum[0] = Const Value(0)
36103615
Jump bb2(v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63, v64, v65, v66, v67, v68, v69, v70, v71, v72)
36113616
bb2(v74:BasicObject, v75:BasicObject, v76:BasicObject, v77:BasicObject, v78:BasicObject, v79:BasicObject, v80:BasicObject, v81:BasicObject, v82:BasicObject, v83:BasicObject, v84:BasicObject, v85:BasicObject, v86:BasicObject, v87:BasicObject, v88:BasicObject, v89:BasicObject, v90:BasicObject, v91:BasicObject, v92:BasicObject, v93:BasicObject, v94:BasicObject, v95:BasicObject, v96:BasicObject, v97:BasicObject, v98:BasicObject, v99:BasicObject, v100:BasicObject, v101:BasicObject, v102:BasicObject, v103:BasicObject, v104:BasicObject, v105:BasicObject, v106:BasicObject, v107:BasicObject, v108:BasicObject):
36123617
SideExit TooManyKeywordParameters

0 commit comments

Comments
 (0)