diff --git a/compile.c b/compile.c index 823d6b5718..ecc123f0a2 100644 --- a/compile.c +++ b/compile.c @@ -3452,20 +3452,15 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal static int insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id) { - if (insn_id == BIN(opt_neq)) { - // Be careful to not write to iobj before allocating so the old operand stays alive. - VALUE original_ci = iobj->operands[0]; - VALUE *new_operands = compile_data_calloc2(iseq, 2, sizeof(VALUE)); - new_operands[0] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE); - new_operands[1] = original_ci; + iobj->insn_id = insn_id; + iobj->operand_size = insn_len(insn_id) - 1; - iobj->insn_id = insn_id; + if (insn_id == BIN(opt_neq)) { + VALUE *old_operands = iobj->operands; iobj->operand_size = 2; - iobj->operands = new_operands; - } - else { - iobj->insn_id = insn_id; - iobj->operand_size = insn_len(insn_id) - 1; + iobj->operands = compile_data_calloc2(iseq, iobj->operand_size, sizeof(VALUE)); + iobj->operands[0] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE); + iobj->operands[1] = old_operands[0]; } return COMPILE_OK;