Skip to content

Commit

Permalink
RJIT: Use case-in for exhaustive matches
Browse files Browse the repository at this point in the history
  • Loading branch information
k0kubun committed Mar 12, 2023
1 parent fe34db5 commit 846fc35
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 33 deletions.
49 changes: 20 additions & 29 deletions lib/ruby_vm/rjit/insn_compiler.rb
Expand Up @@ -3119,23 +3119,20 @@ def jit_call_general(jit, ctx, asm, mid, argc, flags, cme, block_handler, known_
def jit_call_method(jit, ctx, asm, mid, argc, flags, cme, block_handler, known_recv_class, send_shift: 0)
# The main check of vm_call_method before vm_call_method_each_type
case C::METHOD_ENTRY_VISI(cme)
when C::METHOD_VISI_PUBLIC
in C::METHOD_VISI_PUBLIC
# You can always call public methods
when C::METHOD_VISI_PRIVATE
in C::METHOD_VISI_PRIVATE
# Allow only callsites without a receiver
if flags & C::VM_CALL_FCALL == 0
asm.incr_counter(:send_private)
return CantCompile
end
when C::METHOD_VISI_PROTECTED
in C::METHOD_VISI_PROTECTED
# If the method call is an FCALL, it is always valid
if flags & C::VM_CALL_FCALL == 0
# otherwise we need an ancestry check to ensure the receiver is valid to be called as protected
jit_protected_callee_ancestry_guard(asm, cme, side_exit(jit, ctx))
end
else
# TODO: Change them to a constant and use case-in instead
raise 'unreachable'
end

# Get a compile-time receiver
Expand Down Expand Up @@ -3168,40 +3165,37 @@ def jit_protected_callee_ancestry_guard(asm, cme, side_exit)
# @param asm [RubyVM::RJIT::Assembler]
def jit_call_method_each_type(jit, ctx, asm, argc, flags, cme, comptime_recv, recv_opnd, block_handler, known_recv_class, send_shift:)
case cme.def.type
when C::VM_METHOD_TYPE_ISEQ
in C::VM_METHOD_TYPE_ISEQ
iseq = def_iseq_ptr(cme.def)
jit_call_iseq_setup(jit, ctx, asm, cme, flags, argc, iseq, block_handler, send_shift:)
when C::VM_METHOD_TYPE_NOTIMPLEMENTED
in C::VM_METHOD_TYPE_NOTIMPLEMENTED
asm.incr_counter(:send_notimplemented)
return CantCompile
when C::VM_METHOD_TYPE_CFUNC
in C::VM_METHOD_TYPE_CFUNC
jit_call_cfunc(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
when C::VM_METHOD_TYPE_ATTRSET
in C::VM_METHOD_TYPE_ATTRSET
asm.incr_counter(:send_attrset)
return CantCompile
when C::VM_METHOD_TYPE_IVAR
in C::VM_METHOD_TYPE_IVAR
jit_call_ivar(jit, ctx, asm, cme, flags, argc, comptime_recv, recv_opnd, send_shift:)
when C::VM_METHOD_TYPE_MISSING
in C::VM_METHOD_TYPE_MISSING
asm.incr_counter(:send_missing)
return CantCompile
when C::VM_METHOD_TYPE_BMETHOD
in C::VM_METHOD_TYPE_BMETHOD
jit_call_bmethod(jit, ctx, asm, argc, flags, cme, comptime_recv, recv_opnd, block_handler, known_recv_class, send_shift:)
when C::VM_METHOD_TYPE_ALIAS
in C::VM_METHOD_TYPE_ALIAS
jit_call_alias(jit, ctx, asm, argc, flags, cme, comptime_recv, recv_opnd, block_handler, known_recv_class, send_shift:)
when C::VM_METHOD_TYPE_OPTIMIZED
in C::VM_METHOD_TYPE_OPTIMIZED
jit_call_optimized(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
when C::VM_METHOD_TYPE_UNDEF
in C::VM_METHOD_TYPE_UNDEF
asm.incr_counter(:send_undef)
return CantCompile
when C::VM_METHOD_TYPE_ZSUPER
in C::VM_METHOD_TYPE_ZSUPER
asm.incr_counter(:send_zsuper)
return CantCompile
when C::VM_METHOD_TYPE_REFINED
in C::VM_METHOD_TYPE_REFINED
asm.incr_counter(:send_refined)
return CantCompile
else
asm.incr_counter(:send_unknown_type)
return CantCompile
end
end

Expand Down Expand Up @@ -3457,21 +3451,18 @@ def jit_call_optimized(jit, ctx, asm, cme, flags, argc, block_handler, known_rec
end

case cme.def.body.optimized.type
when C::OPTIMIZED_METHOD_TYPE_SEND
in C::OPTIMIZED_METHOD_TYPE_SEND
jit_call_opt_send(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
when C::OPTIMIZED_METHOD_TYPE_CALL
in C::OPTIMIZED_METHOD_TYPE_CALL
jit_call_opt_call(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
when C::OPTIMIZED_METHOD_TYPE_BLOCK_CALL
in C::OPTIMIZED_METHOD_TYPE_BLOCK_CALL
asm.incr_counter(:send_optimized_block_call)
return CantCompile
when C::OPTIMIZED_METHOD_TYPE_STRUCT_AREF
in C::OPTIMIZED_METHOD_TYPE_STRUCT_AREF
jit_call_opt_struct_aref(jit, ctx, asm, cme, flags, argc, block_handler, known_recv_class, send_shift:)
when C::OPTIMIZED_METHOD_TYPE_STRUCT_ASET
in C::OPTIMIZED_METHOD_TYPE_STRUCT_ASET
asm.incr_counter(:send_optimized_struct_aset)
return CantCompile
else
asm.incr_counter(:send_optimized_unknown_type)
return CantCompile
end
end

Expand Down
2 changes: 0 additions & 2 deletions rjit_c.h
Expand Up @@ -37,7 +37,6 @@ RJIT_RUNTIME_COUNTERS(
send_undef,
send_zsuper,
send_refined,
send_unknown_type,
send_stackoverflow,
send_arity,
send_c_tracing,
Expand Down Expand Up @@ -75,7 +74,6 @@ RJIT_RUNTIME_COUNTERS(
send_optimized_blockarg,
send_optimized_block_call,
send_optimized_struct_aset,
send_optimized_unknown_type,

send_bmethod_not_iseq,
send_bmethod_blockarg,
Expand Down
2 changes: 0 additions & 2 deletions rjit_c.rb
Expand Up @@ -1097,7 +1097,6 @@ def C.rb_rjit_runtime_counters
send_undef: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_undef)")],
send_zsuper: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_zsuper)")],
send_refined: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_refined)")],
send_unknown_type: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_unknown_type)")],
send_stackoverflow: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_stackoverflow)")],
send_arity: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_arity)")],
send_c_tracing: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_c_tracing)")],
Expand Down Expand Up @@ -1129,7 +1128,6 @@ def C.rb_rjit_runtime_counters
send_optimized_blockarg: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_optimized_blockarg)")],
send_optimized_block_call: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_optimized_block_call)")],
send_optimized_struct_aset: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_optimized_struct_aset)")],
send_optimized_unknown_type: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_optimized_unknown_type)")],
send_bmethod_not_iseq: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_bmethod_not_iseq)")],
send_bmethod_blockarg: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), send_bmethod_blockarg)")],
invokesuper_me_changed: [CType::Immediate.parse("size_t"), Primitive.cexpr!("OFFSETOF((*((struct rb_rjit_runtime_counters *)NULL)), invokesuper_me_changed)")],
Expand Down

0 comments on commit 846fc35

Please sign in to comment.