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

ruby-changes:52638

From: k0kubun <ko1@a...>
Date: Wed, 26 Sep 2018 11:38:51 +0900 (JST)
Subject: [ruby-changes:52638] k0kubun:r64850 (trunk): revert r64847, r64846 and r64839

k0kubun	2018-09-26 11:38:45 +0900 (Wed, 26 Sep 2018)

  New Revision: 64850

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64850

  Log:
    revert r64847, r64846 and r64839
    
    because r64849 seems to fix issues which we were confused about.

  Modified files:
    trunk/compile.c
    trunk/defs/id.def
    trunk/insns.def
    trunk/test/ruby/test_jit.rb
    trunk/test/ruby/test_optimization.rb
    trunk/tool/transform_mjit_header.rb
    trunk/vm.c
    trunk/vm_core.h
    trunk/vm_insnhelper.c
Index: defs/id.def
===================================================================
--- defs/id.def	(revision 64849)
+++ defs/id.def	(revision 64850)
@@ -97,6 +97,8 @@ token_ops = %[\ https://github.com/ruby/ruby/blob/trunk/defs/id.def#L97
   Eqq           ===     EQQ
   Neq           !=      NEQ
   Not           !
+  And           &
+  Or            |
   Backquote     `
   EqTilde       =~      MATCH
   NeqTilde      !~      NMATCH
Index: insns.def
===================================================================
--- insns.def	(revision 64849)
+++ insns.def	(revision 64850)
@@ -1216,6 +1216,34 @@ opt_ltlt https://github.com/ruby/ruby/blob/trunk/insns.def#L1216
     }
 }
 
+/* optimized X&Y. */
+DEFINE_INSN
+opt_and
+(CALL_INFO ci, CALL_CACHE cc)
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+    val = vm_opt_and(recv, obj);
+
+    if (val == Qundef) {
+        CALL_SIMPLE_METHOD();
+    }
+}
+
+/* optimized X|Y. */
+DEFINE_INSN
+opt_or
+(CALL_INFO ci, CALL_CACHE cc)
+(VALUE recv, VALUE obj)
+(VALUE val)
+{
+    val = vm_opt_or(recv, obj);
+
+    if (val == Qundef) {
+        CALL_SIMPLE_METHOD();
+    }
+}
+
 /* [] */
 DEFINE_INSN
 opt_aref
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 64849)
+++ vm_core.h	(revision 64850)
@@ -531,6 +531,8 @@ enum ruby_basic_operators { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L531
     BOP_MAX,
     BOP_MIN,
     BOP_CALL,
+    BOP_AND,
+    BOP_OR,
 
     BOP_LAST_
 };
Index: compile.c
===================================================================
--- compile.c	(revision 64849)
+++ compile.c	(revision 64850)
@@ -3245,6 +3245,8 @@ iseq_specialized_instruction(rb_iseq_t * https://github.com/ruby/ruby/blob/trunk/compile.c#L3245
 		  case idGE:	 SP_INSN(ge);	  return COMPILE_OK;
 		  case idLTLT:	 SP_INSN(ltlt);	  return COMPILE_OK;
 		  case idAREF:	 SP_INSN(aref);	  return COMPILE_OK;
+                  case idAnd:    SP_INSN(and);    return COMPILE_OK;
+                  case idOr:     SP_INSN(or);    return COMPILE_OK;
 		}
 		break;
 	      case 2:
@@ -6441,17 +6443,17 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6443
 	INIT_ANCHOR(args);
 #if SUPPORT_JOKE
 	if (nd_type(node) == NODE_VCALL) {
-            ID id_bitblt;
+	    ID id_bitblt;
 	    ID id_answer;
 
-            CONST_ID(id_bitblt, "bitblt");
+	    CONST_ID(id_bitblt, "bitblt");
 	    CONST_ID(id_answer, "the_answer_to_life_the_universe_and_everything");
 
-            if (mid == id_bitblt) {
-                ADD_INSN(ret, line, bitblt);
-                break;
-            }
-            else if (mid == id_answer) {
+	    if (mid == id_bitblt) {
+		ADD_INSN(ret, line, bitblt);
+		break;
+	    }
+	    else if (mid == id_answer) {
 		ADD_INSN(ret, line, answer);
 		break;
 	    }
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 64849)
+++ vm_insnhelper.c	(revision 64850)
@@ -3653,6 +3653,30 @@ vm_opt_ltlt(VALUE recv, VALUE obj) https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L3653
 }
 
 static VALUE
+vm_opt_and(VALUE recv, VALUE obj)
+{
+    if (FIXNUM_2_P(recv, obj) &&
+        BASIC_OP_UNREDEFINED_P(BOP_AND, INTEGER_REDEFINED_OP_FLAG)) {
+        return LONG2NUM(FIX2LONG(recv) & FIX2LONG(obj));
+    }
+    else {
+        return Qundef;
+    }
+}
+
+static VALUE
+vm_opt_or(VALUE recv, VALUE obj)
+{
+    if (FIXNUM_2_P(recv, obj) &&
+        BASIC_OP_UNREDEFINED_P(BOP_OR, INTEGER_REDEFINED_OP_FLAG)) {
+        return LONG2NUM(FIX2LONG(recv) | FIX2LONG(obj));
+    }
+    else {
+        return Qundef;
+    }
+}
+
+static VALUE
 vm_opt_aref(VALUE recv, VALUE obj)
 {
     if (SPECIAL_CONST_P(recv)) {
Index: vm.c
===================================================================
--- vm.c	(revision 64849)
+++ vm.c	(revision 64850)
@@ -1610,6 +1610,8 @@ vm_init_redefined_flag(void) https://github.com/ruby/ruby/blob/trunk/vm.c#L1610
     OP(Max, MAX), (C(Array));
     OP(Min, MIN), (C(Array));
     OP(Call, CALL), (C(Proc));
+    OP(And, AND), (C(Integer));
+    OP(Or, OR), (C(Integer));
 #undef C
 #undef OP
 }
Index: tool/transform_mjit_header.rb
===================================================================
--- tool/transform_mjit_header.rb	(revision 64849)
+++ tool/transform_mjit_header.rb	(revision 64850)
@@ -52,6 +52,8 @@ module MJITHeader https://github.com/ruby/ruby/blob/trunk/tool/transform_mjit_header.rb#L52
     'vm_opt_gt',
     'vm_opt_ge',
     'vm_opt_ltlt',
+    'vm_opt_and',
+    'vm_opt_or',
     'vm_opt_aref',
     'vm_opt_aset',
     'vm_opt_aref_with',
Index: test/ruby/test_optimization.rb
===================================================================
--- test/ruby/test_optimization.rb	(revision 64849)
+++ test/ruby/test_optimization.rb	(revision 64850)
@@ -187,6 +187,16 @@ class TestRubyOptimization < Test::Unit: https://github.com/ruby/ruby/blob/trunk/test/ruby/test_optimization.rb#L187
     assert_redefine_method('String', '<<', 'assert_equal "b", "a" << "b"')
   end
 
+  def test_fixnum_and
+    assert_equal 1, 1&3
+    assert_redefine_method('Integer', '&', 'assert_equal 3, 1&3')
+  end
+
+  def test_fixnum_or
+    assert_equal 3, 1|3
+    assert_redefine_method('Integer', '|', 'assert_equal 1, 3|1')
+  end
+
   def test_array_plus
     assert_equal [1,2], [1]+[2]
     assert_redefine_method('Array', '+', 'assert_equal [2], [1]+[2]')
Index: test/ruby/test_jit.rb
===================================================================
--- test/ruby/test_jit.rb	(revision 64849)
+++ test/ruby/test_jit.rb	(revision 64850)
@@ -478,6 +478,14 @@ class TestJIT < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_jit.rb#L478
     assert_compile_once('[1] << 2', result_inspect: '[1, 2]', insns: %i[opt_ltlt])
   end
 
+  def test_compile_insn_opt_and
+    assert_compile_once('1 & 3', result_inspect: '1', insns: %i[opt_and])
+  end
+
+  def test_compile_insn_opt_or
+    assert_compile_once('1 | 3', result_inspect: '3', insns: %i[opt_or])
+  end
+
   def test_compile_insn_opt_aref
     skip_on_mswin
     # optimized call (optimized JIT) -> send call

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

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