From 02b52b2733baf5a65b0e40a376cdb1bba61c8d6c Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 12 Sep 2018 03:39:36 +0000
Subject: make opt_str_freeze leaf

Simply use DISPATCH_ORIGINAL_INSN instead of rb_funcall.  This is,
when possible, overall performant because method dispatch results are
cached inside of CALL_CACHE.  Should also be good for JIT.

----

trunk: ruby 2.6.0dev (2018-09-12 trunk 64689) [x86_64-darwin15]
ours: ruby 2.6.0dev (2018-09-12 leaf-insn 64688) [x86_64-darwin15]
last_commit=make opt_str_freeze leaf
Calculating -------------------------------------
                          trunk        ours
    vm2_freezestring     5.440M     31.411M i/s -      6.000M times in 1.102968s 0.191017s

Comparison:
                 vm2_freezestring
                ours:  31410864.5 i/s
               trunk:   5439865.4 i/s - 5.77x  slower



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64690 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 insns.def | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

(limited to 'insns.def')

diff --git a/insns.def b/insns.def
index ced6054cce..d606fa722b 100644
--- a/insns.def
+++ b/insns.def
@@ -753,22 +753,36 @@ send
 
 DEFINE_INSN
 opt_str_freeze
-(VALUE str)
+(VALUE str, CALL_INFO ci, CALL_CACHE cc)
 ()
 (VALUE val)
-// attr bool leaf = BASIC_OP_UNREDEFINED_P(BOP_FREEZE, STRING_REDEFINED_OP_FLAG);
 {
     val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze);
+
+    if (val == Qundef) {
+        PUSH(str);
+#ifndef MJIT_HEADER
+        ADD_PC(-WIDTH_OF_opt_send_without_block);
+#endif
+        DISPATCH_ORIGINAL_INSN(opt_send_without_block);
+    }
 }
 
 DEFINE_INSN
 opt_str_uminus
-(VALUE str)
+(VALUE str, CALL_INFO ci, CALL_CACHE cc)
 ()
 (VALUE val)
-// attr bool leaf = BASIC_OP_UNREDEFINED_P(BOP_UMINUS, STRING_REDEFINED_OP_FLAG);
 {
     val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus);
+
+    if (val == Qundef) {
+        PUSH(str);
+#ifndef MJIT_HEADER
+        ADD_PC(-WIDTH_OF_opt_send_without_block);
+#endif
+        DISPATCH_ORIGINAL_INSN(opt_send_without_block);
+    }
 }
 
 DEFINE_INSN
-- 
cgit v1.2.3

