diff options
author | Jeremy Evans <code@jeremyevans.net> | 2022-07-20 12:28:48 -0700 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2022-08-09 22:19:46 -0700 |
commit | 5089b6acc7b57605823704d28c82e286f49661e6 (patch) | |
tree | 104920296e88e68093bce28f2b22f3d68b0452e3 | |
parent | d9167491db220756df159048348f006619df28c1 (diff) |
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.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6158
-rw-r--r-- | compile.c | 11 | ||||
-rw-r--r-- | insns.def | 2 |
2 files changed, 11 insertions, 2 deletions
@@ -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) (...) (...) |