summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-07-20 12:28:48 -0700
committerJeremy Evans <code@jeremyevans.net>2022-08-09 22:19:46 -0700
commit5089b6acc7b57605823704d28c82e286f49661e6 (patch)
tree104920296e88e68093bce28f2b22f3d68b0452e3
parentd9167491db220756df159048348f006619df28c1 (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.c11
-rw-r--r--insns.def2
2 files changed, 11 insertions, 2 deletions
diff --git a/compile.c b/compile.c
index f38a320b76..9716f04374 100644
--- a/compile.c
+++ b/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);
+ }
}
}
diff --git a/insns.def b/insns.def
index ebdbed6237..15c4734b8b 100644
--- a/insns.def
+++ b/insns.def
@@ -599,7 +599,7 @@ swap
/* reverse stack top N order. */
DEFINE_INSN
-reverse
+opt_reverse
(rb_num_t n)
(...)
(...)