From 65d27d3c0a1235f04ca90f94e29a7f2ddfd1b574 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 5 Apr 2023 00:46:09 -0700 Subject: [PATCH] RJIT: Skip a class guard if known to be T_STRING --- lib/ruby_vm/rjit/insn_compiler.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/ruby_vm/rjit/insn_compiler.rb b/lib/ruby_vm/rjit/insn_compiler.rb index 5ad73dab11..906743ae0f 100644 --- a/lib/ruby_vm/rjit/insn_compiler.rb +++ b/lib/ruby_vm/rjit/insn_compiler.rb @@ -3878,9 +3878,12 @@ module RubyVM::RJIT asm.je(equal_label) # Otherwise guard that b is a T_STRING (from type info) or String (from runtime guard) - # Note: any T_STRING is valid here, but we check for a ::String for simplicity - # To pass a mutable static variable (rb_cString) requires an unsafe block - jit_guard_known_klass(jit, ctx, asm, C.rb_class_of(comptime_b), b_opnd, StackOpnd[0], comptime_b, side_exit) + btype = ctx.get_opnd_type(StackOpnd[0]) + unless btype.string? + # Note: any T_STRING is valid here, but we check for a ::String for simplicity + # To pass a mutable static variable (rb_cString) requires an unsafe block + jit_guard_known_klass(jit, ctx, asm, C.rb_class_of(comptime_b), b_opnd, StackOpnd[0], comptime_b, side_exit) + end asm.comment('call rb_str_eql_internal') asm.mov(C_ARGS[0], a_opnd)