Skip to content

Commit 2ad3fbb

Browse files
st0012tekknolagi
authored andcommitted
ZJIT: Simplify NewHash HIR and Codegen
We can use `Vec<Opnd>` instead of `Vec<(Opnd, Opnd)>` in NewHash HIR as it's the only usage of such type, which requires special handling.
1 parent 642188f commit 2ad3fbb

File tree

2 files changed

+15
-33
lines changed

2 files changed

+15
-33
lines changed

zjit/src/codegen.rs

Lines changed: 5 additions & 14 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, elements, &function.frame_state(*state)),
349+
Insn::NewHash { elements, state } => gen_new_hash(jit, asm, opnds!(elements), &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,7 +1259,7 @@ fn gen_new_array(
12591259
fn gen_new_hash(
12601260
jit: &mut JITState,
12611261
asm: &mut Assembler,
1262-
elements: &[(InsnId, InsnId)],
1262+
elements: Vec<Opnd>,
12631263
state: &FrameState,
12641264
) -> lir::Opnd {
12651265
gen_prepare_non_leaf_call(jit, asm, state);
@@ -1268,19 +1268,10 @@ fn gen_new_hash(
12681268
let new_hash = asm_ccall!(asm, rb_hash_new_with_size, lir::Opnd::Imm(cap));
12691269

12701270
if !elements.is_empty() {
1271-
let mut pairs = Vec::new();
1272-
for (key_id, val_id) in elements.iter() {
1273-
let key = jit.get_opnd(*key_id);
1274-
let val = jit.get_opnd(*val_id);
1275-
pairs.push(key);
1276-
pairs.push(val);
1277-
}
1278-
1279-
let argv = gen_push_opnds(jit, asm, &pairs);
1280-
let argc = (elements.len() * 2) as ::std::os::raw::c_long;
1281-
asm_ccall!(asm, rb_hash_bulk_insert, lir::Opnd::Imm(argc), argv, new_hash);
1271+
let argv = gen_push_opnds(jit, asm, &elements);
1272+
asm_ccall!(asm, rb_hash_bulk_insert, elements.len().into(), argv, new_hash);
12821273

1283-
gen_pop_opnds(asm, &pairs);
1274+
gen_pop_opnds(asm, &elements);
12841275
}
12851276

12861277
new_hash

zjit/src/hir.rs

Lines changed: 10 additions & 19 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,InsnId)>, state: InsnId },
552+
NewHash { elements: Vec<InsnId>, 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 },
@@ -816,9 +816,11 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
816816
Insn::NewHash { elements, .. } => {
817817
write!(f, "NewHash")?;
818818
let mut prefix = " ";
819-
for (key, value) in elements {
820-
write!(f, "{prefix}{key}: {value}")?;
821-
prefix = ", ";
819+
for chunk in elements.chunks(2) {
820+
if let [key, value] = chunk {
821+
write!(f, "{prefix}{key}: {value}")?;
822+
prefix = ", ";
823+
}
822824
}
823825
Ok(())
824826
}
@@ -1462,13 +1464,7 @@ impl Function {
14621464
&Defined { op_type, obj, pushval, v, state } => Defined { op_type, obj, pushval, v: find!(v), state: find!(state) },
14631465
&DefinedIvar { self_val, pushval, id, state } => DefinedIvar { self_val: find!(self_val), pushval, id, state },
14641466
&NewArray { ref elements, state } => NewArray { elements: find_vec!(elements), state: find!(state) },
1465-
&NewHash { ref elements, state } => {
1466-
let mut found_elements = vec![];
1467-
for &(key, value) in elements {
1468-
found_elements.push((find!(key), find!(value)));
1469-
}
1470-
NewHash { elements: found_elements, state: find!(state) }
1471-
}
1467+
&NewHash { ref elements, state } => NewHash { elements: find_vec!(elements), state: find!(state) },
14721468
&NewRange { low, high, flag, state } => NewRange { low: find!(low), high: find!(high), flag, state: find!(state) },
14731469
&NewRangeFixnum { low, high, flag, state } => NewRangeFixnum { low: find!(low), high: find!(high), flag, state: find!(state) },
14741470
&ArrayMax { ref elements, state } => ArrayMax { elements: find_vec!(elements), state: find!(state) },
@@ -2369,17 +2365,11 @@ impl Function {
23692365
worklist.push_back(state);
23702366
}
23712367
&Insn::ArrayMax { ref elements, state }
2368+
| &Insn::NewHash { ref elements, state }
23722369
| &Insn::NewArray { ref elements, state } => {
23732370
worklist.extend(elements);
23742371
worklist.push_back(state);
23752372
}
2376-
&Insn::NewHash { ref elements, state } => {
2377-
for &(key, value) in elements {
2378-
worklist.push_back(key);
2379-
worklist.push_back(value);
2380-
}
2381-
worklist.push_back(state);
2382-
}
23832373
&Insn::NewRange { low, high, state, .. }
23842374
| &Insn::NewRangeFixnum { low, high, state, .. } => {
23852375
worklist.push_back(low);
@@ -3430,7 +3420,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
34303420
for _ in 0..(count/2) {
34313421
let value = state.stack_pop()?;
34323422
let key = state.stack_pop()?;
3433-
elements.push((key, value));
3423+
elements.push(value);
3424+
elements.push(key);
34343425
}
34353426
elements.reverse();
34363427
state.stack_push(fun.push_insn(block, Insn::NewHash { elements, state: exit_id }));

0 commit comments

Comments
 (0)