Eliminate array allocation for f(*a, **lvar) and f(*a, **@iv)

The compiler already eliminates the array allocation for
f(*a, &lvar) and f(*a, &@iv), and eliminating the array allocation
for keyword splat is as safe as eliminating it for block passes.
This commit is contained in:
Jeremy Evans 2023-11-06 12:37:16 -08:00
parent c70c1d2a95
commit 1731dd05a7

View File

@ -3876,6 +3876,21 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
if ((flag & VM_CALL_ARGS_BLOCKARG) && !(flag & VM_CALL_KW_SPLAT)) {
OPERAND_AT(iobj, 0) = Qfalse;
}
/*
* Eliminate array allocation for f(*a, **lvar) and f(*a, **@iv)
*
* splatarray true
* getlocal / getinstancevariable
* send ARGS_SPLAT|KW_SPLAT and not ARGS_BLOCKARG
* =>
* splatarray false
* getlocal / getinstancevariable
* send
*/
else if (!(flag & VM_CALL_ARGS_BLOCKARG) && (flag & VM_CALL_KW_SPLAT)) {
OPERAND_AT(iobj, 0) = Qfalse;
}
}
}
}