Revert "Revert "Add a specialized instruction for .nil?
calls""
This reverts commit a0980f2446c0db735b8ffeb37e241370c458a626. Retry for macOS Mojave.
This commit is contained in:
parent
e9e17cbc05
commit
086ffe72c7
9
benchmark/nil_p.yml
Normal file
9
benchmark/nil_p.yml
Normal 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
|
@ -3255,6 +3255,7 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
|
|||||||
case idLength: SP_INSN(length); return COMPILE_OK;
|
case idLength: SP_INSN(length); return COMPILE_OK;
|
||||||
case idSize: SP_INSN(size); return COMPILE_OK;
|
case idSize: SP_INSN(size); return COMPILE_OK;
|
||||||
case idEmptyP: SP_INSN(empty_p);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 idSucc: SP_INSN(succ); return COMPILE_OK;
|
||||||
case idNot: SP_INSN(not); return COMPILE_OK;
|
case idNot: SP_INSN(not); return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ firstline, predefined = __LINE__+1, %[\
|
|||||||
max
|
max
|
||||||
min
|
min
|
||||||
freeze
|
freeze
|
||||||
|
nil?
|
||||||
inspect
|
inspect
|
||||||
intern
|
intern
|
||||||
object_id
|
object_id
|
||||||
|
14
insns.def
14
insns.def
@ -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
|
DEFINE_INSN
|
||||||
opt_str_uminus
|
opt_str_uminus
|
||||||
(VALUE str, CALL_INFO ci, CALL_CACHE cc)
|
(VALUE str, CALL_INFO ci, CALL_CACHE cc)
|
||||||
|
2
object.c
2
object.c
@ -1687,7 +1687,7 @@ rb_true(VALUE obj)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
MJIT_FUNC_EXPORTED VALUE
|
||||||
rb_false(VALUE obj)
|
rb_false(VALUE obj)
|
||||||
{
|
{
|
||||||
return Qfalse;
|
return Qfalse;
|
||||||
|
1
vm.c
1
vm.c
@ -1656,6 +1656,7 @@ vm_init_redefined_flag(void)
|
|||||||
OP(Call, CALL), (C(Proc));
|
OP(Call, CALL), (C(Proc));
|
||||||
OP(And, AND), (C(Integer));
|
OP(And, AND), (C(Integer));
|
||||||
OP(Or, OR), (C(Integer));
|
OP(Or, OR), (C(Integer));
|
||||||
|
OP(NilP, NIL_P), (C(NilClass));
|
||||||
#undef C
|
#undef C
|
||||||
#undef OP
|
#undef OP
|
||||||
}
|
}
|
||||||
|
@ -550,6 +550,7 @@ enum ruby_basic_operators {
|
|||||||
BOP_LENGTH,
|
BOP_LENGTH,
|
||||||
BOP_SIZE,
|
BOP_SIZE,
|
||||||
BOP_EMPTY_P,
|
BOP_EMPTY_P,
|
||||||
|
BOP_NIL_P,
|
||||||
BOP_SUCC,
|
BOP_SUCC,
|
||||||
BOP_GT,
|
BOP_GT,
|
||||||
BOP_GE,
|
BOP_GE,
|
||||||
|
@ -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
|
static VALUE
|
||||||
fix_succ(VALUE x)
|
fix_succ(VALUE x)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user