mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Add peephole optimizer for newarray(X)/expandarray(X, 0) -> opt_reverse(X)
This renames the reverse instruction to opt_reverse, since now it is only added by the optimizer. Then it uses as a more general form of swap. This optimizes multiple assignment in the popped case with more than two elements.
This commit is contained in:
parent
d9167491db
commit
5089b6acc7
Notes:
git
2022-08-10 14:20:08 +09:00
2 changed files with 11 additions and 2 deletions
11
compile.c
11
compile.c
|
@ -3337,6 +3337,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
|
|||
if (IS_INSN(next) && IS_INSN_ID(next, expandarray) &&
|
||||
OPERAND_AT(iobj, 0) == OPERAND_AT(next, 0) &&
|
||||
OPERAND_AT(next, 1) == INT2FIX(0)) {
|
||||
ELEM_REMOVE(next);
|
||||
/*
|
||||
* newarray 2
|
||||
* expandarray 2, 0
|
||||
|
@ -3344,10 +3345,18 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
|
|||
* swap
|
||||
*/
|
||||
if (OPERAND_AT(iobj, 0) == INT2FIX(2)) {
|
||||
ELEM_REMOVE(next);
|
||||
INSN_OF(iobj) = BIN(swap);
|
||||
iobj->operand_size = 0;
|
||||
}
|
||||
/*
|
||||
* newarray X
|
||||
* expandarray X, 0
|
||||
* =>
|
||||
* opt_reverse X
|
||||
*/
|
||||
else {
|
||||
INSN_OF(iobj) = BIN(opt_reverse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -599,7 +599,7 @@ swap
|
|||
|
||||
/* reverse stack top N order. */
|
||||
DEFINE_INSN
|
||||
reverse
|
||||
opt_reverse
|
||||
(rb_num_t n)
|
||||
(...)
|
||||
(...)
|
||||
|
|
Loading…
Reference in a new issue