Skip to content

Commit 3be52d5

Browse files
committed
WIP
1 parent 743dcc8 commit 3be52d5

2 files changed

Lines changed: 15 additions & 29 deletions

File tree

zjit/src/codegen.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ fn gen_insn(cb: &mut CodeBlock, jit: &mut JITState, asm: &mut Assembler, functio
346346
Insn::Const { val: Const::Value(val) } => gen_const(*val),
347347
Insn::Const { .. } => panic!("Unexpected Const in gen_insn: {insn}"),
348348
Insn::NewArray { elements, state } => gen_new_array(asm, opnds!(elements), &function.frame_state(*state)),
349-
Insn::NewHash { elements, state } => gen_new_hash(jit, asm, opnds!(elements), &function.frame_state(*state)),
349+
Insn::NewHash { elements_ptr, elements_count, state } => gen_new_hash(jit, asm, opnd!(elements_ptr), *elements_count, &function.frame_state(*state)),
350350
Insn::NewRange { low, high, flag, state } => gen_new_range(jit, asm, opnd!(low), opnd!(high), *flag, &function.frame_state(*state)),
351351
Insn::NewRangeFixnum { low, high, flag, state } => gen_new_range_fixnum(asm, opnd!(low), opnd!(high), *flag, &function.frame_state(*state)),
352352
Insn::ArrayDup { val, state } => gen_array_dup(asm, opnd!(val), &function.frame_state(*state)),
@@ -1259,19 +1259,17 @@ fn gen_new_array(
12591259
fn gen_new_hash(
12601260
jit: &mut JITState,
12611261
asm: &mut Assembler,
1262-
elements: Vec<Opnd>,
1262+
elements_ptr: Opnd,
1263+
elements_count: usize,
12631264
state: &FrameState,
12641265
) -> lir::Opnd {
12651266
gen_prepare_non_leaf_call(jit, asm, state);
12661267

1267-
let cap: c_long = elements.len().try_into().expect("Unable to fit length of elements into c_long");
1268+
let cap: c_long = elements_count.try_into().expect("Unable to fit length of elements into c_long");
12681269
let new_hash = asm_ccall!(asm, rb_hash_new_with_size, lir::Opnd::Imm(cap));
12691270

1270-
if !elements.is_empty() {
1271-
let argv = gen_push_opnds(jit, asm, &elements);
1272-
asm_ccall!(asm, rb_hash_bulk_insert, elements.len().into(), argv, new_hash);
1273-
1274-
gen_pop_opnds(asm, &elements);
1271+
if elements_count > 0 {
1272+
asm_ccall!(asm, rb_hash_bulk_insert, elements_count.into(), elements_ptr, new_hash);
12751273
}
12761274

12771275
new_hash

zjit/src/hir.rs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ pub enum Insn {
549549
ToNewArray { val: InsnId, state: InsnId },
550550
NewArray { elements: Vec<InsnId>, state: InsnId },
551551
/// NewHash contains a vec of (key, value) pairs
552-
NewHash { elements: Vec<InsnId>, state: InsnId },
552+
NewHash { elements_ptr: InsnId, elements_count: usize, state: InsnId },
553553
NewRange { low: InsnId, high: InsnId, flag: RangeType, state: InsnId },
554554
NewRangeFixnum { low: InsnId, high: InsnId, flag: RangeType, state: InsnId },
555555
ArrayDup { val: InsnId, state: InsnId },
@@ -755,7 +755,7 @@ impl Insn {
755755
Insn::NewArray { .. } => false,
756756
// NewHash's operands may be hashed and compared for equality, which could have
757757
// side-effects.
758-
Insn::NewHash { elements, .. } => !elements.is_empty(),
758+
Insn::NewHash { elements_count, .. } => *elements_count > 0,
759759
Insn::ArrayDup { .. } => false,
760760
Insn::HashDup { .. } => false,
761761
Insn::Test { .. } => false,
@@ -817,16 +817,8 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
817817
}
818818
Ok(())
819819
}
820-
Insn::NewHash { elements, .. } => {
821-
write!(f, "NewHash")?;
822-
let mut prefix = " ";
823-
for chunk in elements.chunks(2) {
824-
if let [key, value] = chunk {
825-
write!(f, "{prefix}{key}: {value}")?;
826-
prefix = ", ";
827-
}
828-
}
829-
Ok(())
820+
Insn::NewHash { elements_ptr, elements_count, .. } => {
821+
write!(f, "NewHash {elements_ptr} ({elements_count})")
830822
}
831823
Insn::NewRange { low, high, flag, .. } => {
832824
write!(f, "NewRange {low} {flag} {high}")
@@ -1462,7 +1454,7 @@ impl Function {
14621454
&Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v: find!(v), state: find!(state) },
14631455
&DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val: find!(self_val), pushval, id, state },
14641456
&NewArray { ref elements, state } => NewArray { elements: find_vec!(elements), state: find!(state) },
1465-
&NewHash { ref elements, state } => NewHash { elements: find_vec!(elements), state: find!(state) },
1457+
&NewHash { elements_ptr, elements_count, state } => NewHash { elements_ptr: find!(elements_ptr), elements_count, state: find!(state) },
14661458
&NewRange { low, high, flag, state } => NewRange { low: find!(low), high: find!(high), flag, state: find!(state) },
14671459
&NewRangeFixnum { low, high, flag, state } => NewRangeFixnum { low: find!(low), high: find!(high), flag, state: find!(state) },
14681460
&ArrayMax { ref elements, state } => ArrayMax { elements: find_vec!(elements), state: find!(state) },
@@ -2375,13 +2367,8 @@ impl Function {
23752367
worklist.extend(elements);
23762368
worklist.push_back(state);
23772369
}
2378-
&Insn::NewHash { ref elements, state } => {
2379-
for chunk in elements.chunks(2) {
2380-
if let &[key, value] = chunk {
2381-
worklist.push_back(key);
2382-
worklist.push_back(value);
2383-
}
2384-
}
2370+
&Insn::NewHash { elements_ptr, state, .. } => {
2371+
worklist.push_back(elements_ptr);
23852372
worklist.push_back(state);
23862373
}
23872374
&Insn::NewRange { low, high, state, .. }
@@ -3451,7 +3438,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
34513438
elements.push(key);
34523439
elements.push(value);
34533440
}
3454-
state.stack_push(fun.push_insn(block, Insn::NewHash { elements, state: exit_id }));
3441+
let elements_ptr = fun.push_insn(block, Insn::PushOpnds { opnds: elements });
3442+
state.stack_push(fun.push_insn(block, Insn::NewHash { elements_ptr, elements_count: count, state: exit_id }));
34553443
}
34563444
YARVINSN_duphash => {
34573445
let val = fun.push_insn(block, Insn::Const { val: Const::Value(get_arg(pc, 0)) });

0 commit comments

Comments
 (0)