[前][次][番号順一覧][スレッド一覧]

ruby-changes:73687

From: HParker <ko1@a...>
Date: Fri, 23 Sep 2022 01:47:32 +0900 (JST)
Subject: [ruby-changes:73687] fbaac837cf (master): avoid extra dup and pop in compile_op_asgn2

https://git.ruby-lang.org/ruby.git/commit/?id=fbaac837cf

From fbaac837cfba23a9d34dc7ee144d7940248222a2 Mon Sep 17 00:00:00 2001
From: HParker <HParker@g...>
Date: Wed, 21 Sep 2022 14:12:45 -0700
Subject: avoid extra dup and pop in compile_op_asgn2

Co-authored-by: John Hawthorn <jhawthorn@g...>
---
 benchmark/vm_lvar_cond_set.yml |  8 ++++++++
 compile.c                      | 35 ++++++++++++++++++++++++-----------
 2 files changed, 32 insertions(+), 11 deletions(-)
 create mode 100644 benchmark/vm_lvar_cond_set.yml

diff --git a/benchmark/vm_lvar_cond_set.yml b/benchmark/vm_lvar_cond_set.yml
new file mode 100644
index 0000000000..1845f9d12e
--- /dev/null
+++ b/benchmark/vm_lvar_cond_set.yml
@@ -0,0 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/benchmark/vm_lvar_cond_set.yml#L1
+benchmark:
+  vm_lvar_cond_set: |
+    a ||= 1
+    b ||= 1
+    c ||= 1
+    d ||= 1
+    nil
+loop_count: 30000000
diff --git a/compile.c b/compile.c
index c6cd941d22..1296f8fb46 100644
--- a/compile.c
+++ b/compile.c
@@ -8663,6 +8663,17 @@ compile_op_asgn2(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node https://github.com/ruby/ruby/blob/trunk/compile.c#L8663
       lfin:       # o ?
       pop       # o
 
+      # or (popped)
+      if lcfin  # r
+      eval v    # r v
+      send a=   # ?
+      jump lfin # ?
+
+      lcfin:      # r
+
+      lfin:       # ?
+      pop       #
+
       # and
       dup       # r o o
       unless lcfin
@@ -8691,32 +8702,36 @@ compile_op_asgn2(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node https://github.com/ruby/ruby/blob/trunk/compile.c#L8702
     ADD_SEND_WITH_FLAG(ret, node, vid, INT2FIX(0), INT2FIX(asgnflag));
 
     if (atype == idOROP || atype == idANDOP) {
-        ADD_INSN(ret, node, dup);
+        if (!popped) {
+            ADD_INSN(ret, node, dup);
+        }
         if (atype == idOROP) {
             ADD_INSNL(ret, node, branchif, lcfin);
         }
         else { /* idANDOP */
             ADD_INSNL(ret, node, branchunless, lcfin);
         }
-        ADD_INSN(ret, node, pop);
+        if (!popped) {
+            ADD_INSN(ret, node, pop);
+        }
         CHECK(COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value));
-        ADD_INSN(ret, node, swap);
-        ADD_INSN1(ret, node, topn, INT2FIX(1));
+        if (!popped) {
+            ADD_INSN(ret, node, swap);
+            ADD_INSN1(ret, node, topn, INT2FIX(1));
+        }
         ADD_SEND_WITH_FLAG(ret, node, aid, INT2FIX(1), INT2FIX(asgnflag));
         ADD_INSNL(ret, node, jump, lfin);
 
         ADD_LABEL(ret, lcfin);
-        ADD_INSN(ret, node, swap);
+        if (!popped) {
+            ADD_INSN(ret, node, swap);
+        }
 
         ADD_LABEL(ret, lfin);
         ADD_INSN(ret, node, pop);
         if (lskip) {
             ADD_LABEL(ret, lskip);
         }
-        if (popped) {
-            /* we can apply more optimize */
-            ADD_INSN(ret, node, pop);
-        }
     }
     else {
         CHECK(COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value));
@@ -8848,9 +8863,7 @@ compile_op_log(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, https://github.com/ruby/ruby/blob/trunk/compile.c#L8863
     }
 
     ADD_LABEL(ret, lassign);
-
     CHECK(COMPILE_(ret, "NODE_OP_ASGN_AND/OR#nd_value", node->nd_value, popped));
-
     ADD_LABEL(ret, lfin);
     return COMPILE_OK;
 }
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]