1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Revert "Revert "Add a specialized instruction for .nil? calls""

This reverts commit a0980f2446.

Retry for macOS Mojave.
This commit is contained in:
Yusuke Endoh 2019-08-02 23:25:38 +09:00
parent e9e17cbc05
commit 086ffe72c7
8 changed files with 48 additions and 1 deletions

9
benchmark/nil_p.yml Normal file
View file

@ -0,0 +1,9 @@
prelude: |
class Niller; def nil?; true; end; end
xnil, notnil = nil, Object.new
niller = Niller.new
benchmark:
- xnil.nil?
- notnil.nil?
- niller.nil?
loop_count: 10000000

View file

@ -3255,6 +3255,7 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
case idLength: SP_INSN(length); return COMPILE_OK;
case idSize: SP_INSN(size); return COMPILE_OK;
case idEmptyP: SP_INSN(empty_p);return COMPILE_OK;
case idNilP: SP_INSN(nil_p); return COMPILE_OK;
case idSucc: SP_INSN(succ); return COMPILE_OK;
case idNot: SP_INSN(not); return COMPILE_OK;
}

View file

@ -3,6 +3,7 @@ firstline, predefined = __LINE__+1, %[\
max
min
freeze
nil?
inspect
intern
object_id

View file

@ -808,6 +808,20 @@ opt_str_freeze
}
}
/* optimized nil? */
DEFINE_INSN
opt_nil_p
(CALL_INFO ci, CALL_CACHE cc)
(VALUE recv)
(VALUE val)
{
val = vm_opt_nil_p(ci, cc, recv);
if (val == Qundef) {
CALL_SIMPLE_METHOD();
}
}
DEFINE_INSN
opt_str_uminus
(VALUE str, CALL_INFO ci, CALL_CACHE cc)

View file

@ -1687,7 +1687,7 @@ rb_true(VALUE obj)
*/
static VALUE
MJIT_FUNC_EXPORTED VALUE
rb_false(VALUE obj)
{
return Qfalse;

1
vm.c
View file

@ -1656,6 +1656,7 @@ vm_init_redefined_flag(void)
OP(Call, CALL), (C(Proc));
OP(And, AND), (C(Integer));
OP(Or, OR), (C(Integer));
OP(NilP, NIL_P), (C(NilClass));
#undef C
#undef OP
}

View file

@ -550,6 +550,7 @@ enum ruby_basic_operators {
BOP_LENGTH,
BOP_SIZE,
BOP_EMPTY_P,
BOP_NIL_P,
BOP_SUCC,
BOP_GT,
BOP_GE,

View file

@ -4228,6 +4228,26 @@ vm_opt_empty_p(VALUE recv)
}
}
VALUE rb_false(VALUE obj);
static VALUE
vm_opt_nil_p(CALL_INFO ci, CALL_CACHE cc, VALUE recv)
{
if (recv == Qnil) {
if (BASIC_OP_UNREDEFINED_P(BOP_NIL_P, NIL_REDEFINED_OP_FLAG)) {
return Qtrue;
} else {
return Qundef;
}
} else {
if (vm_method_cfunc_is(ci, cc, recv, rb_false)) {
return Qfalse;
} else {
return Qundef;
}
}
}
static VALUE
fix_succ(VALUE x)
{