From 73854a4b65fcea8e409440b88d014d8fb18bbc68 Mon Sep 17 00:00:00 2001 From: Jun Aruga Date: Wed, 3 Sep 2025 12:03:14 +0100 Subject: [PATCH 1/4] Use no-inline version rb_current_ec on ppc64le This commit fixes the failures in bootstraptest/test_ractor.rb reported on the issue ticket . TLS (Thread-Local Storage) may not be accessed across .so on ppc64le too. I am not sure about that. The comment "// TLS can not be accessed across .so on ..." in this commit comes from the following commit. https://github.com/ruby/ruby/commit/319afed20fba8f9b44611d16e4930260f7b56b86#diff-408391c43b2372cfe1fefb3e1c2531df0184ed711f46d229b08964ec9e8fa8c7R118 > // on Darwin, TLS can not be accessed across .so` This failures only happened when configuring with cppflags=-DRUBY_DEBUG and -O3 on ppc64le. The reproducing steps were below. ``` $ ./autogen.sh $ ./configure -C --disable-install-doc cppflags=-DRUBY_DEBUG $ make -j4 $ make btest BTESTS=bootstraptest/test_ractor.rb ... FAIL 2/147 tests failed make: *** [uncommon.mk:913: yes-btest] Error 1 ``` The steps with a reproducing script based on the `bootstraptest/test_ractor.rb` were below. ``` $ cat test_ractor_1.rb counts = [] counts << Ractor.count p counts.inspect ractors = (1..2).map { Ractor.new { Ractor.receive } } counts << Ractor.count p counts.inspect ractors[0].send('End 0').join sleep 0.1 until ractors[0].inspect =~ /terminated/ counts << Ractor.count p counts.inspect ractors[1].send('End 1').join sleep 0.1 until ractors[1].inspect =~ /terminated/ counts << Ractor.count p counts.inspect $ make run TESTRUN_SCRIPT=test_ractor_1.rb ... vm_core.h:2017: Assertion Failed: rb_current_execution_context:ec == rb_current_ec_noinline() ... ``` The assertion failure happened at the following line. https://github.com/ruby/ruby/blob/f3206cc79bec2fd852e81ec56de59f0a67ab32b7/vm_core.h#L2017 This fix is similar with the following commit for the arm64. https://github.com/ruby/ruby/commit/f7059af50a31a4d27a04ace0beadb60616f3f971 Fixes [Bug #21534] --- .github/workflows/ubuntu-ibm.yml | 10 ++-------- thread_pthread.h | 4 ++-- vm.c | 2 +- vm_core.h | 2 +- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ubuntu-ibm.yml b/.github/workflows/ubuntu-ibm.yml index f5d93365c28685..c58934007020a6 100644 --- a/.github/workflows/ubuntu-ibm.yml +++ b/.github/workflows/ubuntu-ibm.yml @@ -104,14 +104,8 @@ jobs: - name: Run configure env: configure: ${{ matrix.configure }} - # Don't set cppflags=-DRUBY_DEBUG on ppc64le, due to some Ractor tests - # failing in the case. - # https://bugs.ruby-lang.org/issues/21534 - run: | - if [ "$(uname -m)" != "ppc64le" ]; then - configure="${configure:-cppflags=-DRUBY_DEBUG}" - fi - ../src/configure -C --disable-install-doc ${configure} + run: >- + ../src/configure -C --disable-install-doc ${configure:-cppflags=-DRUBY_DEBUG} - run: make diff --git a/thread_pthread.h b/thread_pthread.h index 22e5f3652b05ec..20a3876759c713 100644 --- a/thread_pthread.h +++ b/thread_pthread.h @@ -133,8 +133,8 @@ struct rb_thread_sched { #ifdef RB_THREAD_LOCAL_SPECIFIER NOINLINE(void rb_current_ec_set(struct rb_execution_context_struct *)); - # if defined(__arm64__) || defined(__aarch64__) - // on Arm64, TLS can not be accessed across .so + # if defined(__arm64__) || defined(__aarch64__) || defined(__powerpc64__) + // TLS can not be accessed across .so on arm64 and perhaps ppc64le too. NOINLINE(struct rb_execution_context_struct *rb_current_ec(void)); # else RUBY_EXTERN RB_THREAD_LOCAL_SPECIFIER struct rb_execution_context_struct *ruby_current_ec; diff --git a/vm.c b/vm.c index b947f9aeaebb58..7f0a477ad65480 100644 --- a/vm.c +++ b/vm.c @@ -594,7 +594,7 @@ rb_current_ec_set(rb_execution_context_t *ec) } -#if defined(__arm64__) || defined(__aarch64__) +#if defined(__arm64__) || defined(__aarch64__) || defined(__powerpc64__) rb_execution_context_t * rb_current_ec(void) { diff --git a/vm_core.h b/vm_core.h index 972e6b267cde5d..9986d3e9231163 100644 --- a/vm_core.h +++ b/vm_core.h @@ -2001,7 +2001,7 @@ static inline rb_execution_context_t * rb_current_execution_context(bool expect_ec) { #ifdef RB_THREAD_LOCAL_SPECIFIER - #if defined(__arm64__) || defined(__aarch64__) + #if defined(__arm64__) || defined(__aarch64__) || defined(__powerpc64__) rb_execution_context_t * volatile ec = rb_current_ec(); #else rb_execution_context_t * volatile ec = ruby_current_ec; From aff3e5a6f6b78b65252aa106851d4e872f118561 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 4 Sep 2025 09:42:28 -0700 Subject: [PATCH 2/4] ZJIT: Support compiling ISEQs for opt_pc = 0 (#14441) * ZJIT: Support compiling ISEQs for opt_pc = 0 * Test send with optional arguments --- test/ruby/test_zjit.rb | 16 ++++++++++++++++ zjit/src/codegen.rs | 17 ++++++++++++++++- zjit/src/hir.rs | 13 +++++++++---- zjit/src/stats.rs | 3 +-- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/test/ruby/test_zjit.rb b/test/ruby/test_zjit.rb index 348907c79b7bec..9cd0f59ffbdb97 100644 --- a/test/ruby/test_zjit.rb +++ b/test/ruby/test_zjit.rb @@ -327,6 +327,22 @@ def function_stub_exit(init) }, call_threshold: 2, allowed_iseqs: 'entry@-e:2' end + def test_send_optional_arguments + assert_compiles '[[1, 2], [3, 4]]', %q{ + def test(a, b = 2) = [a, b] + def entry = [test(1), test(3, 4)] + entry + entry + }, call_threshold: 2 + end + + def test_iseq_with_optional_arguments + assert_compiles '[[1, 2], [3, 4]]', %q{ + def test(a, b = 2) = [a, b] + [test(1), test(3, 4)] + } + end + def test_invokebuiltin omit 'Test fails at the moment due to not handling optional parameters' assert_compiles '["."]', %q{ diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index 6d4e5cfab5e437..7501cbd2c5106d 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -770,7 +770,22 @@ fn gen_entry_prologue(asm: &mut Assembler, iseq: IseqPtr) { // Load the current SP from the CFP into REG_SP asm.mov(SP, Opnd::mem(64, CFP, RUBY_OFFSET_CFP_SP)); - // TODO: Support entry chain guard when ISEQ has_opt + // Currently, we support only the case that no optional arguments are given. + // Bail out if any optional argument is supplied. + let opt_num = unsafe { get_iseq_body_param_opt_num(iseq) }; + if opt_num > 0 { + asm_comment!(asm, "guard no optional arguments"); + let no_opts_pc = unsafe { rb_iseq_pc_at_idx(iseq, 0) }; + asm.cmp(Opnd::mem(64, CFP, RUBY_OFFSET_CFP_PC), Opnd::const_ptr(no_opts_pc)); + let no_opts_label = asm.new_label("no_opts"); + asm.je(no_opts_label.clone()); + + gen_incr_counter(asm, Counter::exit_optional_arguments); + asm.frame_teardown(lir::JIT_PRESERVED_REGS); + asm.cret(Qundef.into()); + + asm.write_label(no_opts_label); + } } /// Assign method arguments to basic block arguments at JIT entry diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 91730dc5be0353..3a0b3e976f9042 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2883,7 +2883,6 @@ pub enum CallType { #[derive(Clone, Debug, PartialEq)] pub enum ParameterType { - Optional, /// For example, `foo(...)`. Interaction of JIT /// calling convention and side exits currently unsolved. Forwardable, @@ -2967,7 +2966,6 @@ impl ProfileOracle { pub const SELF_PARAM_IDX: usize = 0; fn filter_unknown_parameter_type(iseq: *const rb_iseq_t) -> Result<(), ParseError> { - if unsafe { rb_get_iseq_body_param_opt_num(iseq) } != 0 { return Err(ParseError::UnknownParameterType(ParameterType::Optional)); } if unsafe { rb_get_iseq_flags_forwardable(iseq) } { return Err(ParseError::UnknownParameterType(ParameterType::Forwardable)); } Ok(()) } @@ -4129,9 +4127,16 @@ mod tests { } #[test] - fn test_cant_compile_optional() { + fn test_compile_optional() { eval("def test(x=1) = 123"); - assert_compile_fails("test", ParseError::UnknownParameterType(ParameterType::Optional)); + assert_snapshot!(hir_string("test"), @r" + fn test@:1: + bb0(v0:BasicObject, v1:BasicObject): + v3:Fixnum[1] = Const Value(1) + v4:Fixnum[123] = Const Value(123) + CheckInterrupts + Return v4 + "); } #[test] diff --git a/zjit/src/stats.rs b/zjit/src/stats.rs index cc6c9452e6d26f..2e7d743f7be42a 100644 --- a/zjit/src/stats.rs +++ b/zjit/src/stats.rs @@ -101,6 +101,7 @@ make_counters! { exit_callee_side_exit, exit_obj_to_string_fallback, exit_interrupt, + exit_optional_arguments, } // unhanded_call_: Unhandled call types @@ -126,7 +127,6 @@ make_counters! { compile_error_parse_malformed_iseq, compile_error_parse_validation, compile_error_parse_not_allowed, - compile_error_parse_parameter_type_optional, compile_error_parse_parameter_type_forwardable, // The number of times YARV instructions are executed on JIT code @@ -208,7 +208,6 @@ pub fn exit_counter_for_compile_error(compile_error: &CompileError) -> Counter { Validation(_) => compile_error_parse_validation, NotAllowed => compile_error_parse_not_allowed, UnknownParameterType(parameter_type) => match parameter_type { - Optional => compile_error_parse_parameter_type_optional, Forwardable => compile_error_parse_parameter_type_forwardable, } } From 856db87a2a0718c5d5e1d00ec3da7bd3e20e6db2 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Thu, 4 Sep 2025 19:37:06 +0100 Subject: [PATCH 3/4] ZJIT: Add patchpoint for TracePoint (#14420) ZJIT: Add patchpoint for TracePoint activation Co-authored-by: Takashi Kokubun Co-authored-by: Alan Wu --- test/ruby/test_zjit.rb | 46 + zjit/bindgen/src/main.rs | 1 + zjit/src/codegen.rs | 6 +- zjit/src/cruby_bindings.inc.rs | 1 + zjit/src/hir.rs | 1881 ++++++++++++++++---------------- zjit/src/invariants.rs | 19 + 6 files changed, 1028 insertions(+), 926 deletions(-) diff --git a/test/ruby/test_zjit.rb b/test/ruby/test_zjit.rb index 9cd0f59ffbdb97..3877a0ca2673f2 100644 --- a/test/ruby/test_zjit.rb +++ b/test/ruby/test_zjit.rb @@ -2256,6 +2256,52 @@ def foo = 1 } end + def test_line_tracepoint_on_c_method + assert_compiles '"[[:line, true]]"', %q{ + events = [] + events.instance_variable_set( + :@tp, + TracePoint.new(:line) { |tp| events << [tp.event, tp.lineno] if tp.path == __FILE__ } + ) + def events.to_str + @tp.enable; '' + end + + # Stay in generated code while enabling tracing + def events.compiled(obj) + String(obj) + @tp.disable; __LINE__ + end + + line = events.compiled(events) + events[0][-1] = (events[0][-1] == line) + + events.to_s # can't dump events as it's a singleton object AND it has a TracePoint instance variable, which also can't be dumped + } + end + + def test_targeted_line_tracepoint_in_c_method_call + assert_compiles '"[true]"', %q{ + events = [] + events.instance_variable_set(:@tp, TracePoint.new(:line) { |tp| events << tp.lineno }) + def events.to_str + @tp.enable(target: method(:compiled)) + '' + end + + # Stay in generated code while enabling tracing + def events.compiled(obj) + String(obj) + __LINE__ + end + + line = events.compiled(events) + events[0] = (events[0] == line) + + events.to_s # can't dump events as it's a singleton object AND it has a TracePoint instance variable, which also can't be dumped + } + end + def test_opt_case_dispatch assert_compiles '[true, false]', %q{ def test(x) diff --git a/zjit/bindgen/src/main.rs b/zjit/bindgen/src/main.rs index c608d482e2c987..354ea6338f7fd1 100644 --- a/zjit/bindgen/src/main.rs +++ b/zjit/bindgen/src/main.rs @@ -330,6 +330,7 @@ fn main() { .allowlist_type("vm_check_match_type") .allowlist_type("vm_opt_newarray_send_type") .allowlist_type("rb_iseq_type") + .allowlist_type("rb_event_flag_t") // From zjit.c .allowlist_function("rb_object_shape_count") diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index 7501cbd2c5106d..bea7706854a1f8 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -9,7 +9,7 @@ use std::slice; use crate::asm::Label; use crate::backend::current::{Reg, ALLOC_REGS}; -use crate::invariants::{track_bop_assumption, track_cme_assumption, track_single_ractor_assumption, track_stable_constant_names_assumption}; +use crate::invariants::{track_bop_assumption, track_cme_assumption, track_single_ractor_assumption, track_stable_constant_names_assumption, track_no_trace_point_assumption}; use crate::gc::{append_gc_offsets, get_or_create_iseq_payload, get_or_create_iseq_payload_ptr, IseqPayload, IseqStatus}; use crate::state::ZJITState; use crate::stats::{exit_counter_for_compile_error, incr_counter, incr_counter_by, CompileError}; @@ -593,6 +593,10 @@ fn gen_patch_point(jit: &mut JITState, asm: &mut Assembler, invariant: &Invarian let side_exit_ptr = cb.resolve_label(label); track_stable_constant_names_assumption(idlist, code_ptr, side_exit_ptr, payload_ptr); } + Invariant::NoTracePoint => { + let side_exit_ptr = cb.resolve_label(label); + track_no_trace_point_assumption(code_ptr, side_exit_ptr, payload_ptr); + } Invariant::SingleRactorMode => { let side_exit_ptr = cb.resolve_label(label); track_single_ractor_assumption(code_ptr, side_exit_ptr, payload_ptr); diff --git a/zjit/src/cruby_bindings.inc.rs b/zjit/src/cruby_bindings.inc.rs index 95727566881511..071ec282472b74 100644 --- a/zjit/src/cruby_bindings.inc.rs +++ b/zjit/src/cruby_bindings.inc.rs @@ -162,6 +162,7 @@ pub const RMODULE_IS_REFINEMENT: ruby_rmodule_flags = 8192; pub type ruby_rmodule_flags = u32; pub const ROBJECT_HEAP: ruby_robject_flags = 65536; pub type ruby_robject_flags = u32; +pub type rb_event_flag_t = u32; pub const RUBY_ENCODING_INLINE_MAX: ruby_encoding_consts = 127; pub const RUBY_ENCODING_SHIFT: ruby_encoding_consts = 22; pub const RUBY_ENCODING_MASK: ruby_encoding_consts = 532676608; diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 3a0b3e976f9042..467d8483eb0a98 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -134,6 +134,8 @@ pub enum Invariant { StableConstantNames { idlist: *const ID, }, + /// TracePoint is not enabled. If TracePoint is enabled, this is invalidated. + NoTracePoint, /// There is one ractor running. If a non-root ractor gets spawned, this is invalidated. SingleRactorMode, } @@ -247,6 +249,7 @@ impl<'a> std::fmt::Display for InvariantPrinter<'a> { } write!(f, ")") } + Invariant::NoTracePoint => write!(f, "NoTracePoint"), Invariant::SingleRactorMode => write!(f, "SingleRactorMode"), } } @@ -939,7 +942,7 @@ impl Block { /// Pretty printer for [`Function`]. pub struct FunctionPrinter<'a> { fun: &'a Function, - display_snapshot: bool, + display_snapshot_and_tp_patchpoints: bool, ptr_map: PtrPrintMap, } @@ -949,12 +952,12 @@ impl<'a> FunctionPrinter<'a> { if cfg!(test) { ptr_map.map_ptrs = true; } - Self { fun, display_snapshot: false, ptr_map } + Self { fun, display_snapshot_and_tp_patchpoints: false, ptr_map } } pub fn with_snapshot(fun: &'a Function) -> FunctionPrinter<'a> { let mut printer = Self::without_snapshot(fun); - printer.display_snapshot = true; + printer.display_snapshot_and_tp_patchpoints = true; printer } } @@ -2571,7 +2574,8 @@ impl<'a> std::fmt::Display for FunctionPrinter<'a> { writeln!(f, "):")?; for insn_id in &fun.blocks[block_id.0].insns { let insn = fun.find(*insn_id); - if !self.display_snapshot && matches!(insn, Insn::Snapshot {..}) { + if !self.display_snapshot_and_tp_patchpoints && + matches!(insn, Insn::Snapshot {..} | Insn::PatchPoint { invariant: Invariant::NoTracePoint, .. }) { continue; } write!(f, " ")?; @@ -3068,6 +3072,17 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result { profiles.profile_stack(&exit_state); } + unsafe extern "C" { + fn rb_iseq_event_flags(iseq: IseqPtr, pos: usize) -> rb_event_flag_t; + } + + // We add NoTracePoint patch points before every instruction that could be affected by TracePoint. + // This ensures that if TracePoint is enabled, we can exit the generated code as fast as possible. + if unsafe { rb_iseq_event_flags(iseq, insn_idx as usize) } != 0 { + let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state.clone() }); + fun.push_insn(block, Insn::PatchPoint { invariant: Invariant::NoTracePoint, state: exit_id }); + } + // Increment zjit_insn_count for each YARV instruction if --zjit-stats is enabled. if get_option!(stats) { fun.push_insn(block, Insn::IncrCounter(Counter::zjit_insn_count)); @@ -4133,9 +4148,9 @@ mod tests { fn test@:1: bb0(v0:BasicObject, v1:BasicObject): v3:Fixnum[1] = Const Value(1) - v4:Fixnum[123] = Const Value(123) + v6:Fixnum[123] = Const Value(123) CheckInterrupts - Return v4 + Return v6 "); } @@ -4146,9 +4161,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:Fixnum[123] = Const Value(123) + v4:Fixnum[123] = Const Value(123) CheckInterrupts - Return v2 + Return v4 "); } @@ -4159,9 +4174,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v3:ArrayExact = NewArray + v5:ArrayExact = NewArray CheckInterrupts - Return v3 + Return v5 "); } @@ -4172,9 +4187,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject): - v4:ArrayExact = NewArray v1 + v6:ArrayExact = NewArray v1 CheckInterrupts - Return v4 + Return v6 "); } @@ -4185,9 +4200,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:ArrayExact = NewArray v1, v2 + v7:ArrayExact = NewArray v1, v2 CheckInterrupts - Return v5 + Return v7 "); } @@ -4198,10 +4213,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[10] = Const Value(10) - v5:RangeExact = NewRange v1 NewRangeInclusive v3 + v5:Fixnum[10] = Const Value(10) + v7:RangeExact = NewRange v1 NewRangeInclusive v5 CheckInterrupts - Return v5 + Return v7 "); } @@ -4212,9 +4227,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:RangeExact = NewRange v1 NewRangeInclusive v2 + v7:RangeExact = NewRange v1 NewRangeInclusive v2 CheckInterrupts - Return v5 + Return v7 "); } @@ -4225,10 +4240,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[10] = Const Value(10) - v5:RangeExact = NewRange v1 NewRangeExclusive v3 + v5:Fixnum[10] = Const Value(10) + v7:RangeExact = NewRange v1 NewRangeExclusive v5 CheckInterrupts - Return v5 + Return v7 "); } @@ -4239,9 +4254,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:RangeExact = NewRange v1 NewRangeExclusive v2 + v7:RangeExact = NewRange v1 NewRangeExclusive v2 CheckInterrupts - Return v5 + Return v7 "); } @@ -4252,10 +4267,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:ArrayExact = ArrayDup v2 + v4:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:ArrayExact = ArrayDup v4 CheckInterrupts - Return v4 + Return v6 "); } @@ -4266,10 +4281,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:HashExact = HashDup v2 + v4:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:HashExact = HashDup v4 CheckInterrupts - Return v4 + Return v6 "); } @@ -4280,9 +4295,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v3:HashExact = NewHash + v5:HashExact = NewHash CheckInterrupts - Return v3 + Return v5 "); } @@ -4293,11 +4308,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v4:StaticSymbol[:a] = Const Value(VALUE(0x1000)) - v5:StaticSymbol[:b] = Const Value(VALUE(0x1008)) - v7:HashExact = NewHash v4: v1, v5: v2 + v6:StaticSymbol[:a] = Const Value(VALUE(0x1000)) + v7:StaticSymbol[:b] = Const Value(VALUE(0x1008)) + v9:HashExact = NewHash v6: v1, v7: v2 CheckInterrupts - Return v7 + Return v9 "); } @@ -4308,10 +4323,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:StringExact = StringCopy v2 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact = StringCopy v4 CheckInterrupts - Return v4 + Return v6 "); } @@ -4322,9 +4337,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:Bignum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:Bignum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -4335,9 +4350,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:Flonum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:Flonum[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -4348,9 +4363,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:HeapFloat[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:HeapFloat[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -4361,9 +4376,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:StaticSymbol[:foo] = Const Value(VALUE(0x1000)) + v4:StaticSymbol[:foo] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -4374,11 +4389,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) - v5:BasicObject = SendWithoutBlock v2, :+, v3 + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) + v9:BasicObject = SendWithoutBlock v4, :+, v5 CheckInterrupts - Return v5 + Return v9 "); } @@ -4391,10 +4406,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:BasicObject = SendWithoutBlock v3, :freeze + v5:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:BasicObject = SendWithoutBlock v5, :freeze CheckInterrupts - Return v4 + Return v6 "); } @@ -4407,10 +4422,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:BasicObject = SendWithoutBlock v3, :freeze + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:BasicObject = SendWithoutBlock v5, :freeze CheckInterrupts - Return v4 + Return v6 "); } @@ -4423,10 +4438,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:BasicObject = SendWithoutBlock v3, :freeze + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:BasicObject = SendWithoutBlock v5, :freeze CheckInterrupts - Return v4 + Return v6 "); } @@ -4439,10 +4454,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:BasicObject = SendWithoutBlock v3, :-@ + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:BasicObject = SendWithoutBlock v5, :-@ CheckInterrupts - Return v4 + Return v6 "); } @@ -4459,9 +4474,9 @@ mod tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) CheckInterrupts - Return v3 + Return v5 "); } @@ -4490,18 +4505,18 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn block (3 levels) in @:10: bb0(v0:BasicObject): - v2:BasicObject = GetLocal l2, EP@4 - SetLocal l1, EP@3, v2 - v4:BasicObject = GetLocal l1, EP@3 - v5:BasicObject = GetLocal l2, EP@4 - v7:BasicObject = SendWithoutBlock v4, :+, v5 - SetLocal l2, EP@4, v7 + v4:BasicObject = GetLocal l2, EP@4 + SetLocal l1, EP@3, v4 + v8:BasicObject = GetLocal l1, EP@3 v9:BasicObject = GetLocal l2, EP@4 - v10:BasicObject = GetLocal l3, EP@5 - v12:BasicObject = SendWithoutBlock v9, :+, v10 - SetLocal l3, EP@5, v12 - CheckInterrupts - Return v12 + v13:BasicObject = SendWithoutBlock v8, :+, v9 + SetLocal l2, EP@4, v13 + v17:BasicObject = GetLocal l2, EP@4 + v18:BasicObject = GetLocal l3, EP@5 + v22:BasicObject = SendWithoutBlock v17, :+, v18 + SetLocal l3, EP@5, v22 + CheckInterrupts + Return v22 " ); } @@ -4515,9 +4530,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:BasicObject = DefinedIvar v0, :@foo + v5:BasicObject = DefinedIvar v0, :@foo CheckInterrupts - Return v3 + Return v5 "); } @@ -4530,14 +4545,14 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:NilClass = Const Value(nil) - v4:StringExact|NilClass = Defined constant, v2 - v6:StringExact|NilClass = Defined func, v0 - v7:NilClass = Const Value(nil) - v9:StringExact|NilClass = Defined global-variable, v7 - v11:ArrayExact = NewArray v4, v6, v9 + v4:NilClass = Const Value(nil) + v6:StringExact|NilClass = Defined constant, v4 + v8:StringExact|NilClass = Defined func, v0 + v9:NilClass = Const Value(nil) + v11:StringExact|NilClass = Defined global-variable, v9 + v13:ArrayExact = NewArray v6, v8, v11 CheckInterrupts - Return v11 + Return v13 "); } @@ -4557,15 +4572,15 @@ mod tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject): CheckInterrupts - v5:CBool = Test v1 - IfFalse v5, bb1(v0, v1) - v7:Fixnum[3] = Const Value(3) + v7:CBool = Test v1 + IfFalse v7, bb1(v0, v1) + v11:Fixnum[3] = Const Value(3) CheckInterrupts - Return v7 - bb1(v11:BasicObject, v12:BasicObject): - v14:Fixnum[4] = Const Value(4) + Return v11 + bb1(v17:BasicObject, v18:BasicObject): + v22:Fixnum[4] = Const Value(4) CheckInterrupts - Return v14 + Return v22 "); } @@ -4586,17 +4601,17 @@ mod tests { bb0(v0:BasicObject, v1:BasicObject): v2:NilClass = Const Value(nil) CheckInterrupts - v6:CBool = Test v1 - IfFalse v6, bb1(v0, v1, v2) - v8:Fixnum[3] = Const Value(3) + v8:CBool = Test v1 + IfFalse v8, bb1(v0, v1, v2) + v12:Fixnum[3] = Const Value(3) CheckInterrupts - Jump bb2(v0, v1, v8) - bb1(v12:BasicObject, v13:BasicObject, v14:NilClass): - v16:Fixnum[4] = Const Value(4) - Jump bb2(v12, v13, v16) - bb2(v18:BasicObject, v19:BasicObject, v20:Fixnum): + Jump bb2(v0, v1, v12) + bb1(v16:BasicObject, v17:BasicObject, v18:NilClass): + v22:Fixnum[4] = Const Value(4) + Jump bb2(v16, v17, v22) + bb2(v24:BasicObject, v25:BasicObject, v26:Fixnum): CheckInterrupts - Return v20 + Return v26 "); } @@ -4610,9 +4625,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :+, v2 + v9:BasicObject = SendWithoutBlock v1, :+, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4626,9 +4641,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :-, v2 + v9:BasicObject = SendWithoutBlock v1, :-, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4642,9 +4657,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :*, v2 + v9:BasicObject = SendWithoutBlock v1, :*, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4658,9 +4673,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :/, v2 + v9:BasicObject = SendWithoutBlock v1, :/, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4674,9 +4689,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :%, v2 + v9:BasicObject = SendWithoutBlock v1, :%, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4690,9 +4705,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :==, v2 + v9:BasicObject = SendWithoutBlock v1, :==, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4706,9 +4721,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :!=, v2 + v9:BasicObject = SendWithoutBlock v1, :!=, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4722,9 +4737,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :<, v2 + v9:BasicObject = SendWithoutBlock v1, :<, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4738,9 +4753,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :<=, v2 + v9:BasicObject = SendWithoutBlock v1, :<=, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4754,9 +4769,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :>, v2 + v9:BasicObject = SendWithoutBlock v1, :>, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4779,25 +4794,25 @@ mod tests { bb0(v0:BasicObject): v1:NilClass = Const Value(nil) v2:NilClass = Const Value(nil) - v4:Fixnum[0] = Const Value(0) - v5:Fixnum[10] = Const Value(10) + v6:Fixnum[0] = Const Value(0) + v9:Fixnum[10] = Const Value(10) CheckInterrupts - Jump bb2(v0, v4, v5) - bb2(v9:BasicObject, v10:BasicObject, v11:BasicObject): - v13:Fixnum[0] = Const Value(0) - v15:BasicObject = SendWithoutBlock v11, :>, v13 + Jump bb2(v0, v6, v9) + bb2(v15:BasicObject, v16:BasicObject, v17:BasicObject): + v19:Fixnum[0] = Const Value(0) + v23:BasicObject = SendWithoutBlock v17, :>, v19 CheckInterrupts - v18:CBool = Test v15 - IfTrue v18, bb1(v9, v10, v11) - v20:NilClass = Const Value(nil) + v26:CBool = Test v23 + IfTrue v26, bb1(v15, v16, v17) + v28:NilClass = Const Value(nil) CheckInterrupts - Return v10 - bb1(v24:BasicObject, v25:BasicObject, v26:BasicObject): - v28:Fixnum[1] = Const Value(1) - v30:BasicObject = SendWithoutBlock v25, :+, v28 - v31:Fixnum[1] = Const Value(1) - v33:BasicObject = SendWithoutBlock v26, :-, v31 - Jump bb2(v24, v30, v33) + Return v16 + bb1(v36:BasicObject, v37:BasicObject, v38:BasicObject): + v42:Fixnum[1] = Const Value(1) + v46:BasicObject = SendWithoutBlock v37, :+, v42 + v49:Fixnum[1] = Const Value(1) + v53:BasicObject = SendWithoutBlock v38, :-, v49 + Jump bb2(v36, v46, v53) "); } @@ -4811,9 +4826,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :>=, v2 + v9:BasicObject = SendWithoutBlock v1, :>=, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -4833,17 +4848,17 @@ mod tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v3:TrueClass = Const Value(true) + v5:TrueClass = Const Value(true) CheckInterrupts - v6:CBool[true] = Test v3 - IfFalse v6, bb1(v0, v3) - v8:Fixnum[3] = Const Value(3) + v10:CBool[true] = Test v5 + IfFalse v10, bb1(v0, v5) + v14:Fixnum[3] = Const Value(3) CheckInterrupts - Return v8 - bb1(v12, v13): - v15 = Const Value(4) + Return v14 + bb1(v20, v21): + v25 = Const Value(4) CheckInterrupts - Return v15 + Return v25 "); } @@ -4861,11 +4876,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:6: bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - v3:Fixnum[3] = Const Value(3) - v5:BasicObject = SendWithoutBlock v0, :bar, v2, v3 + v4:Fixnum[2] = Const Value(2) + v5:Fixnum[3] = Const Value(3) + v7:BasicObject = SendWithoutBlock v0, :bar, v4, v5 CheckInterrupts - Return v5 + Return v7 "); } @@ -4883,11 +4898,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:BasicObject = GetLocal l0, EP@3 - v5:BasicObject = Send v3, 0x1000, :each - v6:BasicObject = GetLocal l0, EP@3 + v5:BasicObject = GetLocal l0, EP@3 + v7:BasicObject = Send v5, 0x1000, :each + v8:BasicObject = GetLocal l0, EP@3 CheckInterrupts - Return v5 + Return v7 "); } @@ -4902,14 +4917,14 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v3:Fixnum[123] = Const Value(123) - v5:BasicObject = ObjToString v3 - v7:String = AnyToString v3, str: v5 - v9:StringExact = StringConcat v2, v7 - v11:Symbol = StringIntern v9 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:Fixnum[123] = Const Value(123) + v7:BasicObject = ObjToString v5 + v9:String = AnyToString v5, str: v7 + v11:StringExact = StringConcat v4, v9 + v13:Symbol = StringIntern v11 CheckInterrupts - Return v11 + Return v13 "); } @@ -4921,17 +4936,17 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:1: bb0(v0:BasicObject): - v2:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:ArrayExact = ArrayDup v2 - v5:ArrayExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - v7:ArrayExact = ArrayDup v5 - v8:StringExact[VALUE(0x1010)] = Const Value(VALUE(0x1010)) - v10:StringExact = StringCopy v8 - v11:StringExact[VALUE(0x1010)] = Const Value(VALUE(0x1010)) - v13:StringExact = StringCopy v11 - v15:BasicObject = SendWithoutBlock v0, :unknown_method, v4, v7, v10, v13 + v4:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:ArrayExact = ArrayDup v4 + v7:ArrayExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v9:ArrayExact = ArrayDup v7 + v10:StringExact[VALUE(0x1010)] = Const Value(VALUE(0x1010)) + v12:StringExact = StringCopy v10 + v13:StringExact[VALUE(0x1010)] = Const Value(VALUE(0x1010)) + v15:StringExact = StringCopy v13 + v17:BasicObject = SendWithoutBlock v0, :unknown_method, v6, v9, v12, v15 CheckInterrupts - Return v15 + Return v17 "); } @@ -4943,7 +4958,7 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:ArrayExact = ToArray v1 + v6:ArrayExact = ToArray v1 SideExit UnhandledCallType(Splat) "); } @@ -4956,7 +4971,7 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:BasicObject = GetLocal l0, EP@3 + v5:BasicObject = GetLocal l0, EP@3 SideExit UnhandledCallType(BlockArg) "); } @@ -4969,7 +4984,7 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) SideExit UnhandledCallType(Kwarg) "); } @@ -5036,13 +5051,13 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) - v5:HashExact = NewHash - v7:BasicObject = SendWithoutBlock v3, :core#hash_merge_kwd, v5, v1 - v8:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) - v9:StaticSymbol[:b] = Const Value(VALUE(0x1008)) - v10:Fixnum[1] = Const Value(1) - v12:BasicObject = SendWithoutBlock v8, :core#hash_merge_ptr, v7, v9, v10 + v5:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) + v7:HashExact = NewHash + v9:BasicObject = SendWithoutBlock v5, :core#hash_merge_kwd, v7, v1 + v10:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) + v11:StaticSymbol[:b] = Const Value(VALUE(0x1008)) + v12:Fixnum[1] = Const Value(1) + v14:BasicObject = SendWithoutBlock v10, :core#hash_merge_ptr, v9, v11, v12 SideExit UnhandledCallType(KwSplatMut) "); } @@ -5055,9 +5070,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:ArrayExact): - v4:ArrayExact = ToNewArray v1 - v5:Fixnum[1] = Const Value(1) - ArrayPush v4, v5 + v6:ArrayExact = ToNewArray v1 + v7:Fixnum[1] = Const Value(1) + ArrayPush v6, v7 SideExit UnhandledCallType(SplatMut) "); } @@ -5080,16 +5095,16 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:BasicObject = GetConstantPath 0x1000 - v4:NilClass = Const Value(nil) + v5:BasicObject = GetConstantPath 0x1000 + v6:NilClass = Const Value(nil) CheckInterrupts - Jump bb1(v0, v4, v3) - bb1(v8:BasicObject, v9:NilClass, v10:BasicObject): - v13:BasicObject = SendWithoutBlock v10, :new - Jump bb2(v8, v13, v9) - bb2(v15:BasicObject, v16:BasicObject, v17:NilClass): + Jump bb1(v0, v6, v5) + bb1(v10:BasicObject, v11:NilClass, v12:BasicObject): + v15:BasicObject = SendWithoutBlock v12, :new + Jump bb2(v10, v15, v11) + bb2(v17:BasicObject, v18:BasicObject, v19:NilClass): CheckInterrupts - Return v16 + Return v18 "); } @@ -5104,9 +5119,9 @@ mod tests { fn test@:2: bb0(v0:BasicObject): PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_MAX) - v4:BasicObject = ArrayMax + v6:BasicObject = ArrayMax CheckInterrupts - Return v4 + Return v6 "); } @@ -5120,9 +5135,9 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_MAX) - v6:BasicObject = ArrayMax v1, v2 + v8:BasicObject = ArrayMax v1, v2 CheckInterrupts - Return v6 + Return v8 "); } @@ -5137,14 +5152,14 @@ mod tests { end "); assert_contains_opcode("test", YARVINSN_opt_newarray_send); - assert_snapshot!(hir_string("test"), @r#" - fn test@:3: - bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v3:NilClass = Const Value(nil) - v4:NilClass = Const Value(nil) - v7:BasicObject = SendWithoutBlock v1, :+, v2 - SideExit UnknownNewarraySend(MIN) - "#); + assert_snapshot!(hir_string("test"), @r" + fn test@:3: + bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + v3:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) + v11:BasicObject = SendWithoutBlock v1, :+, v2 + SideExit UnknownNewarraySend(MIN) + "); } #[test] @@ -5158,14 +5173,14 @@ mod tests { end "); assert_contains_opcode("test", YARVINSN_opt_newarray_send); - assert_snapshot!(hir_string("test"), @r#" - fn test@:3: - bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v3:NilClass = Const Value(nil) - v4:NilClass = Const Value(nil) - v7:BasicObject = SendWithoutBlock v1, :+, v2 - SideExit UnknownNewarraySend(HASH) - "#); + assert_snapshot!(hir_string("test"), @r" + fn test@:3: + bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + v3:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) + v11:BasicObject = SendWithoutBlock v1, :+, v2 + SideExit UnknownNewarraySend(HASH) + "); } #[test] @@ -5179,16 +5194,16 @@ mod tests { end "); assert_contains_opcode("test", YARVINSN_opt_newarray_send); - assert_snapshot!(hir_string("test"), @r#" - fn test@:3: - bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v3:NilClass = Const Value(nil) - v4:NilClass = Const Value(nil) - v7:BasicObject = SendWithoutBlock v1, :+, v2 - v8:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v10:StringExact = StringCopy v8 - SideExit UnknownNewarraySend(PACK) - "#); + assert_snapshot!(hir_string("test"), @r" + fn test@:3: + bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + v3:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) + v11:BasicObject = SendWithoutBlock v1, :+, v2 + v14:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v16:StringExact = StringCopy v14 + SideExit UnknownNewarraySend(PACK) + "); } // TODO(max): Add a test for VM_OPT_NEWARRAY_SEND_PACK_BUFFER @@ -5204,14 +5219,14 @@ mod tests { end "); assert_contains_opcode("test", YARVINSN_opt_newarray_send); - assert_snapshot!(hir_string("test"), @r#" - fn test@:3: - bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v3:NilClass = Const Value(nil) - v4:NilClass = Const Value(nil) - v7:BasicObject = SendWithoutBlock v1, :+, v2 - SideExit UnknownNewarraySend(INCLUDE_P) - "#); + assert_snapshot!(hir_string("test"), @r" + fn test@:3: + bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + v3:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) + v11:BasicObject = SendWithoutBlock v1, :+, v2 + SideExit UnknownNewarraySend(INCLUDE_P) + "); } #[test] @@ -5223,10 +5238,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:ArrayExact = NewArray v1, v2 - v7:BasicObject = SendWithoutBlock v5, :length + v7:ArrayExact = NewArray v1, v2 + v11:BasicObject = SendWithoutBlock v7, :length CheckInterrupts - Return v7 + Return v11 "); } @@ -5239,10 +5254,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:ArrayExact = NewArray v1, v2 - v7:BasicObject = SendWithoutBlock v5, :size + v7:ArrayExact = NewArray v1, v2 + v11:BasicObject = SendWithoutBlock v7, :size CheckInterrupts - Return v7 + Return v11 "); } @@ -5257,9 +5272,9 @@ mod tests { fn test@:2: bb0(v0:BasicObject): PatchPoint SingleRactorMode - v4:BasicObject = GetIvar v0, :@foo + v6:BasicObject = GetIvar v0, :@foo CheckInterrupts - Return v4 + Return v6 "); } @@ -5273,11 +5288,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) PatchPoint SingleRactorMode - SetIvar v0, :@foo, v2 + SetIvar v0, :@foo, v4 CheckInterrupts - Return v2 + Return v4 "); } @@ -5291,10 +5306,10 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - SetGlobal :$foo, v2 + v4:Fixnum[1] = Const Value(1) + SetGlobal :$foo, v4 CheckInterrupts - Return v2 + Return v4 "); } @@ -5308,9 +5323,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:BasicObject = GetGlobal :$foo + v5:BasicObject = GetGlobal :$foo CheckInterrupts - Return v3 + Return v5 "); } @@ -5323,9 +5338,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:ArrayExact = ToNewArray v1 + v6:ArrayExact = ToNewArray v1 CheckInterrupts - Return v4 + Return v6 "); } @@ -5338,12 +5353,12 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) - v5:ArrayExact = NewArray v3 - v7:ArrayExact = ToArray v1 - ArrayExtend v5, v7 + v5:Fixnum[1] = Const Value(1) + v7:ArrayExact = NewArray v5 + v9:ArrayExact = ToArray v1 + ArrayExtend v7, v9 CheckInterrupts - Return v5 + Return v7 "); } @@ -5356,11 +5371,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:ArrayExact = ToNewArray v1 - v5:Fixnum[1] = Const Value(1) - ArrayPush v4, v5 + v6:ArrayExact = ToNewArray v1 + v7:Fixnum[1] = Const Value(1) + ArrayPush v6, v7 CheckInterrupts - Return v4 + Return v6 "); } @@ -5373,15 +5388,15 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:ArrayExact = ToNewArray v1 - v5:Fixnum[1] = Const Value(1) - v6:Fixnum[2] = Const Value(2) - v7:Fixnum[3] = Const Value(3) - ArrayPush v4, v5 - ArrayPush v4, v6 - ArrayPush v4, v7 + v6:ArrayExact = ToNewArray v1 + v7:Fixnum[1] = Const Value(1) + v8:Fixnum[2] = Const Value(2) + v9:Fixnum[3] = Const Value(3) + ArrayPush v6, v7 + ArrayPush v6, v8 + ArrayPush v6, v9 CheckInterrupts - Return v4 + Return v6 "); } @@ -5394,11 +5409,11 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v4:NilClass = Const Value(nil) - v5:Fixnum[1] = Const Value(1) - v7:BasicObject = SendWithoutBlock v1, :[]=, v2, v5 + v6:NilClass = Const Value(nil) + v7:Fixnum[1] = Const Value(1) + v11:BasicObject = SendWithoutBlock v1, :[]=, v2, v7 CheckInterrupts - Return v5 + Return v7 "); } @@ -5411,9 +5426,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :[], v2 + v9:BasicObject = SendWithoutBlock v1, :[], v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -5426,9 +5441,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:BasicObject = SendWithoutBlock v1, :empty? + v8:BasicObject = SendWithoutBlock v1, :empty? CheckInterrupts - Return v4 + Return v8 "); } @@ -5441,9 +5456,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:BasicObject = SendWithoutBlock v1, :succ + v8:BasicObject = SendWithoutBlock v1, :succ CheckInterrupts - Return v4 + Return v8 "); } @@ -5456,9 +5471,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :&, v2 + v9:BasicObject = SendWithoutBlock v1, :&, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -5471,9 +5486,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :|, v2 + v9:BasicObject = SendWithoutBlock v1, :|, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -5486,9 +5501,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v4:BasicObject = SendWithoutBlock v1, :! + v8:BasicObject = SendWithoutBlock v1, :! CheckInterrupts - Return v4 + Return v8 "); } @@ -5501,9 +5516,9 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :=~, v2 + v9:BasicObject = SendWithoutBlock v1, :=~, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -5520,13 +5535,13 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) - v3:BasicObject = PutSpecialObject CBase - v4:StaticSymbol[:aliased] = Const Value(VALUE(0x1008)) - v5:StaticSymbol[:__callee__] = Const Value(VALUE(0x1010)) - v7:BasicObject = SendWithoutBlock v2, :core#set_method_alias, v3, v4, v5 + v4:Class[VMFrozenCore] = Const Value(VALUE(0x1000)) + v5:BasicObject = PutSpecialObject CBase + v6:StaticSymbol[:aliased] = Const Value(VALUE(0x1008)) + v7:StaticSymbol[:__callee__] = Const Value(VALUE(0x1010)) + v9:BasicObject = SendWithoutBlock v4, :core#set_method_alias, v5, v6, v7 CheckInterrupts - Return v7 + Return v9 "); } @@ -5551,14 +5566,14 @@ mod tests { v2:NilClass = Const Value(nil) v3:NilClass = Const Value(nil) PatchPoint SingleRactorMode - v7:BasicObject = GetIvar v0, :@a + v9:BasicObject = GetIvar v0, :@a PatchPoint SingleRactorMode - v10:BasicObject = GetIvar v0, :@b + v12:BasicObject = GetIvar v0, :@b PatchPoint SingleRactorMode - v13:BasicObject = GetIvar v0, :@c - v15:ArrayExact = NewArray v7, v10, v13 + v15:BasicObject = GetIvar v0, :@c + v19:ArrayExact = NewArray v9, v12, v15 CheckInterrupts - Return v15 + Return v19 "); assert_contains_opcode("reverse_even", YARVINSN_opt_reverse); assert_snapshot!(hir_string("reverse_even"), @r" @@ -5569,16 +5584,16 @@ mod tests { v3:NilClass = Const Value(nil) v4:NilClass = Const Value(nil) PatchPoint SingleRactorMode - v8:BasicObject = GetIvar v0, :@a + v10:BasicObject = GetIvar v0, :@a PatchPoint SingleRactorMode - v11:BasicObject = GetIvar v0, :@b + v13:BasicObject = GetIvar v0, :@b PatchPoint SingleRactorMode - v14:BasicObject = GetIvar v0, :@c + v16:BasicObject = GetIvar v0, :@c PatchPoint SingleRactorMode - v17:BasicObject = GetIvar v0, :@d - v19:ArrayExact = NewArray v8, v11, v14, v17 + v19:BasicObject = GetIvar v0, :@d + v23:ArrayExact = NewArray v10, v13, v16, v19 CheckInterrupts - Return v19 + Return v23 "); } @@ -5592,13 +5607,13 @@ mod tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): CheckInterrupts - v5:CBool = IsNil v1 - IfTrue v5, bb1(v0, v1, v1) - v8:BasicObject = SendWithoutBlock v1, :itself - Jump bb1(v0, v1, v8) - bb1(v10:BasicObject, v11:BasicObject, v12:BasicObject): + v7:CBool = IsNil v1 + IfTrue v7, bb1(v0, v1, v1) + v10:BasicObject = SendWithoutBlock v1, :itself + Jump bb1(v0, v1, v10) + bb1(v12:BasicObject, v13:BasicObject, v14:BasicObject): CheckInterrupts - Return v12 + Return v14 "); } @@ -5608,11 +5623,11 @@ mod tests { assert_snapshot!(hir_string("Float"), @r" fn Float@: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject, v3:BasicObject): - v6:Float = InvokeBuiltin rb_f_float, v0, v1, v2 - Jump bb1(v0, v1, v2, v3, v6) - bb1(v8:BasicObject, v9:BasicObject, v10:BasicObject, v11:BasicObject, v12:Float): + v8:Float = InvokeBuiltin rb_f_float, v0, v1, v2 + Jump bb1(v0, v1, v2, v3, v8) + bb1(v10:BasicObject, v11:BasicObject, v12:BasicObject, v13:BasicObject, v14:Float): CheckInterrupts - Return v12 + Return v14 "); } @@ -5622,11 +5637,11 @@ mod tests { assert_snapshot!(hir_string("class"), @r" fn class@: bb0(v0:BasicObject): - v3:Class = InvokeBuiltin _bi20, v0 - Jump bb1(v0, v3) - bb1(v5:BasicObject, v6:Class): + v5:Class = InvokeBuiltin _bi20, v0 + Jump bb1(v0, v5) + bb1(v7:BasicObject, v8:Class): CheckInterrupts - Return v6 + Return v8 "); } @@ -5640,7 +5655,7 @@ mod tests { fn open@: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject, v3:BasicObject, v4:BasicObject): v5:NilClass = Const Value(nil) - v8:BasicObject = InvokeBuiltin dir_s_open, v0, v1, v2 + v10:BasicObject = InvokeBuiltin dir_s_open, v0, v1, v2 SideExit UnhandledYARVInsn(getblockparamproxy) "); } @@ -5653,11 +5668,11 @@ mod tests { assert_snapshot!(hir_string_function(&function), @r" fn enable@: bb0(v0:BasicObject): - v3:BasicObject = InvokeBuiltin gc_enable, v0 - Jump bb1(v0, v3) - bb1(v5:BasicObject, v6:BasicObject): + v5:BasicObject = InvokeBuiltin gc_enable, v0 + Jump bb1(v0, v5) + bb1(v7:BasicObject, v8:BasicObject): CheckInterrupts - Return v6 + Return v8 "); } @@ -5669,10 +5684,10 @@ mod tests { assert_snapshot!(hir_string_function(&function), @r" fn start@: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject, v3:BasicObject, v4:BasicObject): - v6:FalseClass = Const Value(false) - v8:BasicObject = InvokeBuiltin gc_start_internal, v0, v1, v2, v3, v6 + v8:FalseClass = Const Value(false) + v10:BasicObject = InvokeBuiltin gc_start_internal, v0, v1, v2, v3, v8 CheckInterrupts - Return v8 + Return v10 "); } @@ -5685,20 +5700,20 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:NilClass = Const Value(nil) - v4:Fixnum[0] = Const Value(0) - v5:Fixnum[1] = Const Value(1) - v7:BasicObject = SendWithoutBlock v1, :[], v4, v5 + v5:NilClass = Const Value(nil) + v6:Fixnum[0] = Const Value(0) + v7:Fixnum[1] = Const Value(1) + v9:BasicObject = SendWithoutBlock v1, :[], v6, v7 CheckInterrupts - v10:CBool = Test v7 - IfTrue v10, bb1(v0, v1, v3, v1, v4, v5, v7) - v12:Fixnum[2] = Const Value(2) - v14:BasicObject = SendWithoutBlock v1, :[]=, v4, v5, v12 + v12:CBool = Test v9 + IfTrue v12, bb1(v0, v1, v5, v1, v6, v7, v9) + v14:Fixnum[2] = Const Value(2) + v16:BasicObject = SendWithoutBlock v1, :[]=, v6, v7, v14 CheckInterrupts - Return v12 - bb1(v18:BasicObject, v19:BasicObject, v20:NilClass, v21:BasicObject, v22:Fixnum[0], v23:Fixnum[1], v24:BasicObject): + Return v14 + bb1(v22:BasicObject, v23:BasicObject, v24:NilClass, v25:BasicObject, v26:Fixnum[0], v27:Fixnum[1], v28:BasicObject): CheckInterrupts - Return v24 + Return v28 "); } @@ -5711,13 +5726,13 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v3:Fixnum[1] = Const Value(1) - v5:BasicObject = ObjToString v3 - v7:String = AnyToString v3, str: v5 - v9:StringExact = StringConcat v2, v7 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:Fixnum[1] = Const Value(1) + v7:BasicObject = ObjToString v5 + v9:String = AnyToString v5, str: v7 + v11:StringExact = StringConcat v4, v9 CheckInterrupts - Return v9 + Return v11 "); } @@ -5730,18 +5745,18 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v4:BasicObject = ObjToString v2 - v6:String = AnyToString v2, str: v4 - v7:Fixnum[2] = Const Value(2) - v9:BasicObject = ObjToString v7 - v11:String = AnyToString v7, str: v9 - v12:Fixnum[3] = Const Value(3) - v14:BasicObject = ObjToString v12 - v16:String = AnyToString v12, str: v14 - v18:StringExact = StringConcat v6, v11, v16 + v4:Fixnum[1] = Const Value(1) + v6:BasicObject = ObjToString v4 + v8:String = AnyToString v4, str: v6 + v9:Fixnum[2] = Const Value(2) + v11:BasicObject = ObjToString v9 + v13:String = AnyToString v9, str: v11 + v14:Fixnum[3] = Const Value(3) + v16:BasicObject = ObjToString v14 + v18:String = AnyToString v14, str: v16 + v20:StringExact = StringConcat v8, v13, v18 CheckInterrupts - Return v18 + Return v20 "); } @@ -5754,13 +5769,13 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v3:NilClass = Const Value(nil) - v5:BasicObject = ObjToString v3 - v7:String = AnyToString v3, str: v5 - v9:StringExact = StringConcat v2, v7 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:NilClass = Const Value(nil) + v7:BasicObject = ObjToString v5 + v9:String = AnyToString v5, str: v7 + v11:StringExact = StringConcat v4, v9 CheckInterrupts - Return v9 + Return v11 "); } @@ -5773,18 +5788,18 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v4:BasicObject = ObjToString v2 - v6:String = AnyToString v2, str: v4 - v7:Fixnum[2] = Const Value(2) - v9:BasicObject = ObjToString v7 - v11:String = AnyToString v7, str: v9 - v12:Fixnum[3] = Const Value(3) - v14:BasicObject = ObjToString v12 - v16:String = AnyToString v12, str: v14 - v18:RegexpExact = ToRegexp v6, v11, v16 + v4:Fixnum[1] = Const Value(1) + v6:BasicObject = ObjToString v4 + v8:String = AnyToString v4, str: v6 + v9:Fixnum[2] = Const Value(2) + v11:BasicObject = ObjToString v9 + v13:String = AnyToString v9, str: v11 + v14:Fixnum[3] = Const Value(3) + v16:BasicObject = ObjToString v14 + v18:String = AnyToString v14, str: v16 + v20:RegexpExact = ToRegexp v8, v13, v18 CheckInterrupts - Return v18 + Return v20 "); } @@ -5797,15 +5812,15 @@ mod tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v4:BasicObject = ObjToString v2 - v6:String = AnyToString v2, str: v4 - v7:Fixnum[2] = Const Value(2) - v9:BasicObject = ObjToString v7 - v11:String = AnyToString v7, str: v9 - v13:RegexpExact = ToRegexp v6, v11, MULTILINE|IGNORECASE|EXTENDED|NOENCODING + v4:Fixnum[1] = Const Value(1) + v6:BasicObject = ObjToString v4 + v8:String = AnyToString v4, str: v6 + v9:Fixnum[2] = Const Value(2) + v11:BasicObject = ObjToString v9 + v13:String = AnyToString v9, str: v11 + v15:RegexpExact = ToRegexp v8, v13, MULTILINE|IGNORECASE|EXTENDED|NOENCODING CheckInterrupts - Return v13 + Return v15 "); } @@ -5816,21 +5831,21 @@ mod tests { define_method(:throw_break) { break 2 } "); assert_contains_opcode("throw_return", YARVINSN_throw); - assert_snapshot!(hir_string("throw_return"), @r#" - fn block in @:2: - bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - Throw TAG_RETURN, v2 - "#); + assert_snapshot!(hir_string("throw_return"), @r" + fn block in @:2: + bb0(v0:BasicObject): + v6:Fixnum[1] = Const Value(1) + Throw TAG_RETURN, v6 + "); assert_contains_opcode("throw_break", YARVINSN_throw); - assert_snapshot!(hir_string("throw_break"), @r#" - fn block in @:3: - bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - Throw TAG_BREAK, v2 - "#); - } -} + assert_snapshot!(hir_string("throw_break"), @r" + fn block in @:3: + bb0(v0:BasicObject): + v6:Fixnum[2] = Const Value(2) + Throw TAG_BREAK, v6 + "); + } +} #[cfg(test)] mod graphviz_tests { @@ -5860,12 +5875,15 @@ mod graphviz_tests { mode=hier; overlap=false; splines=true; bb0 [label=< - - - - - - + + + + + + + + +
bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject) 
PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) 
v10:Fixnum = GuardType v1, Fixnum 
v11:Fixnum = GuardType v2, Fixnum 
v12:Fixnum = FixnumOr v10, v11 
CheckInterrupts 
Return v12 
PatchPoint NoTracePoint 
PatchPoint NoTracePoint 
PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) 
v16:Fixnum = GuardType v1, Fixnum 
v17:Fixnum = GuardType v2, Fixnum 
v18:Fixnum = FixnumOr v16, v17 
PatchPoint NoTracePoint 
CheckInterrupts 
Return v18 
>]; } "#); @@ -5891,19 +5909,24 @@ mod graphviz_tests { mode=hier; overlap=false; splines=true; bb0 [label=< - - - - - - + + + + + + + + +
bb0(v0:BasicObject, v1:BasicObject) 
CheckInterrupts 
v5:CBool = Test v1 
IfFalse v5, bb1(v0, v1) 
v7:Fixnum[3] = Const Value(3) 
CheckInterrupts 
Return v7 
PatchPoint NoTracePoint 
CheckInterrupts 
v7:CBool = Test v1 
IfFalse v7, bb1(v0, v1) 
PatchPoint NoTracePoint 
v11:Fixnum[3] = Const Value(3) 
PatchPoint NoTracePoint 
CheckInterrupts 
Return v11 
>]; - bb0:v6 -> bb1:params:n; + bb0:v8 -> bb1:params:n; bb1 [label=< - - - - + + + + + +
bb1(v11:BasicObject, v12:BasicObject) 
v14:Fixnum[4] = Const Value(4) 
CheckInterrupts 
Return v14 
bb1(v17:BasicObject, v18:BasicObject) 
PatchPoint NoTracePoint 
v22:Fixnum[4] = Const Value(4) 
PatchPoint NoTracePoint 
CheckInterrupts 
Return v22 
>]; } "#); @@ -5940,11 +5963,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:TrueClass = Const Value(true) + v1:NilClass = Const Value(nil) + v5:TrueClass = Const Value(true) CheckInterrupts - v8:Fixnum[3] = Const Value(3) + v14:Fixnum[3] = Const Value(3) CheckInterrupts - Return v8 + Return v14 "); } @@ -5963,11 +5987,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:FalseClass = Const Value(false) + v1:NilClass = Const Value(nil) + v5:FalseClass = Const Value(false) CheckInterrupts - v15:Fixnum[4] = Const Value(4) + v25:Fixnum[4] = Const Value(4) CheckInterrupts - Return v15 + Return v25 "); } @@ -5981,15 +6006,15 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v16:Fixnum[3] = Const Value(3) - v6:Fixnum[3] = Const Value(3) + v24:Fixnum[3] = Const Value(3) + v10:Fixnum[3] = Const Value(3) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v17:Fixnum[6] = Const Value(6) + v25:Fixnum[6] = Const Value(6) CheckInterrupts - Return v17 + Return v25 "); } @@ -6003,15 +6028,15 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[5] = Const Value(5) - v3:Fixnum[3] = Const Value(3) + v4:Fixnum[5] = Const Value(5) + v5:Fixnum[3] = Const Value(3) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v16:Fixnum[2] = Const Value(2) - v6:Fixnum[1] = Const Value(1) + v24:Fixnum[2] = Const Value(2) + v10:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v17:Fixnum[1] = Const Value(1) + v25:Fixnum[1] = Const Value(1) CheckInterrupts - Return v17 + Return v25 "); } @@ -6025,12 +6050,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[0] = Const Value(0) - v3:Fixnum[1073741825] = Const Value(1073741825) + v4:Fixnum[0] = Const Value(0) + v5:Fixnum[1073741825] = Const Value(1073741825) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v11:Fixnum[-1073741825] = Const Value(-1073741825) + v17:Fixnum[-1073741825] = Const Value(-1073741825) CheckInterrupts - Return v11 + Return v17 "); } @@ -6044,12 +6069,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[6] = Const Value(6) - v3:Fixnum[7] = Const Value(7) + v4:Fixnum[6] = Const Value(6) + v5:Fixnum[7] = Const Value(7) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v11:Fixnum[42] = Const Value(42) + v17:Fixnum[42] = Const Value(42) CheckInterrupts - Return v11 + Return v17 "); } @@ -6064,18 +6089,18 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[0] = Const Value(0) + v5:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v15:Fixnum = GuardType v1, Fixnum - v22:Fixnum[0] = Const Value(0) - v6:Fixnum[0] = Const Value(0) + v25:Fixnum = GuardType v1, Fixnum + v32:Fixnum[0] = Const Value(0) + v10:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v18:Fixnum = GuardType v1, Fixnum - v23:Fixnum[0] = Const Value(0) + v28:Fixnum = GuardType v1, Fixnum + v33:Fixnum[0] = Const Value(0) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v24:Fixnum[0] = Const Value(0) + v34:Fixnum[0] = Const Value(0) CheckInterrupts - Return v24 + Return v34 "); } @@ -6093,14 +6118,14 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v22:TrueClass = Const Value(true) + v34:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[3] = Const Value(3) + v16:Fixnum[3] = Const Value(3) CheckInterrupts - Return v10 + Return v16 "); } @@ -6118,19 +6143,19 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v32:TrueClass = Const Value(true) + v46:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[2] = Const Value(2) - v11:Fixnum[2] = Const Value(2) + v14:Fixnum[2] = Const Value(2) + v15:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v34:TrueClass = Const Value(true) + v48:TrueClass = Const Value(true) CheckInterrupts - v18:Fixnum[3] = Const Value(3) + v26:Fixnum[3] = Const Value(3) CheckInterrupts - Return v18 + Return v26 "); } @@ -6148,14 +6173,14 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - v3:Fixnum[1] = Const Value(1) + v4:Fixnum[2] = Const Value(2) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GT) - v22:TrueClass = Const Value(true) + v34:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[3] = Const Value(3) + v16:Fixnum[3] = Const Value(3) CheckInterrupts - Return v10 + Return v16 "); } @@ -6173,19 +6198,19 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - v3:Fixnum[1] = Const Value(1) + v4:Fixnum[2] = Const Value(2) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v32:TrueClass = Const Value(true) + v46:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[2] = Const Value(2) - v11:Fixnum[2] = Const Value(2) + v14:Fixnum[2] = Const Value(2) + v15:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v34:TrueClass = Const Value(true) + v48:TrueClass = Const Value(true) CheckInterrupts - v18:Fixnum[3] = Const Value(3) + v26:Fixnum[3] = Const Value(3) CheckInterrupts - Return v18 + Return v26 "); } @@ -6203,14 +6228,14 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v22:FalseClass = Const Value(false) + v34:FalseClass = Const Value(false) CheckInterrupts - v16:Fixnum[4] = Const Value(4) + v26:Fixnum[4] = Const Value(4) CheckInterrupts - Return v16 + Return v26 "); } @@ -6228,14 +6253,14 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[2] = Const Value(2) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v22:TrueClass = Const Value(true) + v34:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[3] = Const Value(3) + v16:Fixnum[3] = Const Value(3) CheckInterrupts - Return v10 + Return v16 "); } @@ -6253,15 +6278,15 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v23:TrueClass = Const Value(true) + v35:TrueClass = Const Value(true) CheckInterrupts - v10:Fixnum[3] = Const Value(3) + v16:Fixnum[3] = Const Value(3) CheckInterrupts - Return v10 + Return v16 "); } @@ -6279,15 +6304,15 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[2] = Const Value(2) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[2] = Const Value(2) + v5:Fixnum[2] = Const Value(2) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v23:FalseClass = Const Value(false) + v35:FalseClass = Const Value(false) CheckInterrupts - v16:Fixnum[4] = Const Value(4) + v26:Fixnum[4] = Const Value(4) CheckInterrupts - Return v16 + Return v26 "); } @@ -6302,12 +6327,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = FixnumAdd v10, v3 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = FixnumAdd v16, v5 CheckInterrupts - Return v11 + Return v17 "); } @@ -6343,9 +6368,9 @@ mod opt_tests { assert_snapshot!(hir_string("block"), @r" fn block@:6: bb0(v0:BasicObject, v1:BasicObject): - v3:NilClass = Const Value(nil) + v5:NilClass = Const Value(nil) CheckInterrupts - Return v3 + Return v5 "); assert_snapshot!(hir_string("post"), @r" fn post@:5: @@ -6369,10 +6394,10 @@ mod opt_tests { fn test@:5: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + v12:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v13:BasicObject = SendWithoutBlockDirect v12, :foo (0x1038) CheckInterrupts - Return v9 + Return v13 "); } @@ -6390,9 +6415,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:5: bb0(v0:BasicObject): - v3:BasicObject = SendWithoutBlock v0, :foo + v5:BasicObject = SendWithoutBlock v0, :foo CheckInterrupts - Return v3 + Return v5 "); } @@ -6411,10 +6436,10 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + v12:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v13:BasicObject = SendWithoutBlockDirect v12, :foo (0x1038) CheckInterrupts - Return v9 + Return v13 "); } @@ -6429,12 +6454,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[3] = Const Value(3) + v4:Fixnum[3] = Const Value(3) PatchPoint MethodRedefined(Object@0x1000, Integer@0x1008, cme:0x1010) - v9:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v10:BasicObject = SendWithoutBlockDirect v9, :Integer (0x1038), v2 + v13:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v14:BasicObject = SendWithoutBlockDirect v13, :Integer (0x1038), v4 CheckInterrupts - Return v10 + Return v14 "); } @@ -6451,13 +6476,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:5: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[2] = Const Value(2) + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[2] = Const Value(2) PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v10:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v11:BasicObject = SendWithoutBlockDirect v10, :foo (0x1038), v2, v3 + v14:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v15:BasicObject = SendWithoutBlockDirect v14, :foo (0x1038), v4, v5 CheckInterrupts - Return v11 + Return v15 "); } @@ -6478,13 +6503,13 @@ mod opt_tests { fn test@:7: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v10:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v11:BasicObject = SendWithoutBlockDirect v10, :foo (0x1038) + v16:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v17:BasicObject = SendWithoutBlockDirect v16, :foo (0x1038) PatchPoint MethodRedefined(Object@0x1000, bar@0x1040, cme:0x1048) - v13:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v14:BasicObject = SendWithoutBlockDirect v13, :bar (0x1038) + v19:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v20:BasicObject = SendWithoutBlockDirect v19, :bar (0x1038) CheckInterrupts - Return v14 + Return v20 "); } @@ -6502,9 +6527,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:7: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:BasicObject = SendWithoutBlock v1, :+, v2 + v9:BasicObject = SendWithoutBlock v1, :+, v2 CheckInterrupts - Return v5 + Return v9 "); } @@ -6518,11 +6543,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = GuardType v2, Fixnum - v12:Fixnum = FixnumAdd v10, v11 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = GuardType v2, Fixnum + v18:Fixnum = FixnumAdd v16, v17 CheckInterrupts - Return v12 + Return v18 "); } @@ -6535,12 +6560,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = FixnumAdd v10, v3 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = FixnumAdd v16, v5 CheckInterrupts - Return v11 + Return v17 "); } @@ -6553,12 +6578,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = FixnumAdd v3, v10 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = FixnumAdd v5, v16 CheckInterrupts - Return v11 + Return v17 "); } @@ -6572,11 +6597,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = GuardType v2, Fixnum - v12:BoolExact = FixnumLt v10, v11 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = GuardType v2, Fixnum + v18:BoolExact = FixnumLt v16, v17 CheckInterrupts - Return v12 + Return v18 "); } @@ -6589,12 +6614,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v10:Fixnum = GuardType v1, Fixnum - v11:BoolExact = FixnumLt v10, v3 + v16:Fixnum = GuardType v1, Fixnum + v17:BoolExact = FixnumLt v16, v5 CheckInterrupts - Return v11 + Return v17 "); } @@ -6607,12 +6632,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v10:Fixnum = GuardType v1, Fixnum - v11:BoolExact = FixnumLt v3, v10 + v16:Fixnum = GuardType v1, Fixnum + v17:BoolExact = FixnumLt v5, v16 CheckInterrupts - Return v11 + Return v17 "); } @@ -6627,9 +6652,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -6644,9 +6669,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -6661,11 +6686,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) - v9:Fixnum = GuardType v1, Fixnum - v10:RangeExact = NewRangeFixnum v3 NewRangeInclusive v9 + v5:Fixnum[1] = Const Value(1) + v13:Fixnum = GuardType v1, Fixnum + v14:RangeExact = NewRangeFixnum v5 NewRangeInclusive v13 CheckInterrupts - Return v10 + Return v14 "); } @@ -6680,11 +6705,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) - v9:Fixnum = GuardType v1, Fixnum - v10:RangeExact = NewRangeFixnum v3 NewRangeExclusive v9 + v5:Fixnum[1] = Const Value(1) + v13:Fixnum = GuardType v1, Fixnum + v14:RangeExact = NewRangeFixnum v5 NewRangeExclusive v13 CheckInterrupts - Return v10 + Return v14 "); } @@ -6699,11 +6724,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[10] = Const Value(10) - v9:Fixnum = GuardType v1, Fixnum - v10:RangeExact = NewRangeFixnum v9 NewRangeInclusive v3 + v5:Fixnum[10] = Const Value(10) + v13:Fixnum = GuardType v1, Fixnum + v14:RangeExact = NewRangeFixnum v13 NewRangeInclusive v5 CheckInterrupts - Return v10 + Return v14 "); } @@ -6718,11 +6743,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[10] = Const Value(10) - v9:Fixnum = GuardType v1, Fixnum - v10:RangeExact = NewRangeFixnum v9 NewRangeExclusive v3 + v5:Fixnum[10] = Const Value(10) + v13:Fixnum = GuardType v1, Fixnum + v14:RangeExact = NewRangeFixnum v13 NewRangeExclusive v5 CheckInterrupts - Return v10 + Return v14 "); } @@ -6739,10 +6764,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:ArrayExact = NewArray - v5:Fixnum[5] = Const Value(5) + v6:ArrayExact = NewArray + v9:Fixnum[5] = Const Value(5) CheckInterrupts - Return v5 + Return v9 "); } @@ -6758,10 +6783,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:Fixnum[5] = Const Value(5) + v1:NilClass = Const Value(nil) + v5:RangeExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v8:Fixnum[5] = Const Value(5) CheckInterrupts - Return v4 + Return v8 "); } @@ -6778,14 +6804,14 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_UMINUS) - v6:StringExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - v8:StringExact = StringCopy v6 - v10:RangeExact = NewRange v4 NewRangeInclusive v8 - v11:Fixnum[0] = Const Value(0) + v8:StringExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v10:StringExact = StringCopy v8 + v12:RangeExact = NewRange v6 NewRangeInclusive v10 + v15:Fixnum[0] = Const Value(0) CheckInterrupts - Return v11 + Return v15 "); } @@ -6802,10 +6828,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject): v2:NilClass = Const Value(nil) - v5:ArrayExact = NewArray v1 - v6:Fixnum[5] = Const Value(5) + v7:ArrayExact = NewArray v1 + v10:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v10 "); } @@ -6821,10 +6847,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:HashExact = NewHash - v5:Fixnum[5] = Const Value(5) + v6:HashExact = NewHash + v9:Fixnum[5] = Const Value(5) CheckInterrupts - Return v5 + Return v9 "); } @@ -6840,12 +6866,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): v3:NilClass = Const Value(nil) - v5:StaticSymbol[:a] = Const Value(VALUE(0x1000)) - v6:StaticSymbol[:b] = Const Value(VALUE(0x1008)) - v8:HashExact = NewHash v5: v1, v6: v2 - v9:Fixnum[5] = Const Value(5) + v7:StaticSymbol[:a] = Const Value(VALUE(0x1000)) + v8:StaticSymbol[:b] = Const Value(VALUE(0x1008)) + v10:HashExact = NewHash v7: v1, v8: v2 + v13:Fixnum[5] = Const Value(5) CheckInterrupts - Return v9 + Return v13 "); } @@ -6862,11 +6888,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v5:ArrayExact = ArrayDup v3 - v6:Fixnum[5] = Const Value(5) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v7:ArrayExact = ArrayDup v5 + v10:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v10 "); } @@ -6882,11 +6908,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v5:HashExact = HashDup v3 - v6:Fixnum[5] = Const Value(5) + v5:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v7:HashExact = HashDup v5 + v10:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v10 "); } @@ -6902,9 +6928,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:Fixnum[5] = Const Value(5) + v1:NilClass = Const Value(nil) + v7:Fixnum[5] = Const Value(5) CheckInterrupts - Return v3 + Return v7 "); } @@ -6921,11 +6948,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v5:StringExact = StringCopy v3 - v6:Fixnum[5] = Const Value(5) + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v7:StringExact = StringCopy v5 + v10:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v10 "); } @@ -6942,11 +6969,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_PLUS) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -6963,11 +6990,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MINUS) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -6984,11 +7011,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MULT) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7005,12 +7032,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_DIV) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v13:Fixnum = FixnumDiv v11, v12 - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v21:Fixnum = FixnumDiv v19, v20 + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7027,12 +7054,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_MOD) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v13:Fixnum = FixnumMod v11, v12 - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v21:Fixnum = FixnumMod v19, v20 + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7049,11 +7076,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LT) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7070,11 +7097,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_LE) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7091,11 +7118,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GT) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7112,11 +7139,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_GE) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7133,11 +7160,11 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) - v11:Fixnum = GuardType v1, Fixnum - v12:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v19:Fixnum = GuardType v1, Fixnum + v20:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7155,11 +7182,11 @@ mod opt_tests { bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_EQ) PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, BOP_NEQ) - v12:Fixnum = GuardType v1, Fixnum - v13:Fixnum = GuardType v2, Fixnum - v6:Fixnum[5] = Const Value(5) + v20:Fixnum = GuardType v1, Fixnum + v21:Fixnum = GuardType v2, Fixnum + v12:Fixnum[5] = Const Value(5) CheckInterrupts - Return v6 + Return v12 "); } @@ -7174,10 +7201,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:BasicObject = GetConstantPath 0x1000 - v4:Fixnum[5] = Const Value(5) + v5:BasicObject = GetConstantPath 0x1000 + v8:Fixnum[5] = Const Value(5) CheckInterrupts - Return v4 + Return v8 "); } @@ -7192,10 +7219,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) - v9:Fixnum = GuardType v1, Fixnum - v10:BasicObject = CCall itself@0x1038, v9 + v13:Fixnum = GuardType v1, Fixnum + v14:BasicObject = CCall itself@0x1038, v13 CheckInterrupts - Return v10 + Return v14 "); } @@ -7207,11 +7234,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact = NewArray + v5:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) - v10:BasicObject = CCall itself@0x1038, v3 + v14:BasicObject = CCall itself@0x1038, v5 CheckInterrupts - Return v10 + Return v14 "); } @@ -7227,12 +7254,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:ArrayExact = NewArray + v6:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, itself@0x1008, cme:0x1010) - v12:BasicObject = CCall itself@0x1038, v4 - v7:Fixnum[1] = Const Value(1) + v18:BasicObject = CCall itself@0x1038, v6 + v11:Fixnum[1] = Const Value(1) CheckInterrupts - Return v7 + Return v11 "); } @@ -7252,12 +7279,12 @@ mod opt_tests { v1:NilClass = Const Value(nil) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, M) - v13:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v19:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Module@0x1010, name@0x1018, cme:0x1020) - v15:StringExact|NilClass = CCall name@0x1048, v13 - v7:Fixnum[1] = Const Value(1) + v21:StringExact|NilClass = CCall name@0x1048, v19 + v11:Fixnum[1] = Const Value(1) CheckInterrupts - Return v7 + Return v11 "); } @@ -7273,12 +7300,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:ArrayExact = NewArray + v6:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) - v12:Fixnum = CCall length@0x1038, v4 - v7:Fixnum[5] = Const Value(5) + v20:Fixnum = CCall length@0x1038, v6 + v13:Fixnum[5] = Const Value(5) CheckInterrupts - Return v7 + Return v13 "); } @@ -7294,9 +7321,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v9:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) CheckInterrupts - Return v9 + Return v13 "); } @@ -7311,19 +7338,19 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, String) - v17:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v21:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1010, Class) - v20:Class[VALUE(0x1018)] = Const Value(VALUE(0x1018)) + v24:Class[VALUE(0x1018)] = Const Value(VALUE(0x1018)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1020, Module) - v23:Class[VALUE(0x1028)] = Const Value(VALUE(0x1028)) + v27:Class[VALUE(0x1028)] = Const Value(VALUE(0x1028)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1030, BasicObject) - v26:Class[VALUE(0x1038)] = Const Value(VALUE(0x1038)) - v11:ArrayExact = NewArray v17, v20, v23, v26 + v30:Class[VALUE(0x1038)] = Const Value(VALUE(0x1038)) + v13:ArrayExact = NewArray v21, v24, v27, v30 CheckInterrupts - Return v11 + Return v13 "); } @@ -7338,13 +7365,13 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Enumerable) - v13:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v17:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1010, Kernel) - v16:ModuleExact[VALUE(0x1018)] = Const Value(VALUE(0x1018)) - v7:ArrayExact = NewArray v13, v16 + v20:ModuleExact[VALUE(0x1018)] = Const Value(VALUE(0x1018)) + v9:ArrayExact = NewArray v17, v20 CheckInterrupts - Return v7 + Return v9 "); } @@ -7361,9 +7388,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, MY_MODULE) - v9:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) CheckInterrupts - Return v9 + Return v13 "); } @@ -7379,12 +7406,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): v1:NilClass = Const Value(nil) - v4:ArrayExact = NewArray + v6:ArrayExact = NewArray PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) - v12:Fixnum = CCall size@0x1038, v4 - v7:Fixnum[5] = Const Value(5) + v20:Fixnum = CCall size@0x1038, v6 + v13:Fixnum[5] = Const Value(5) CheckInterrupts - Return v7 + Return v13 "); } @@ -7399,11 +7426,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v3:Fixnum[0] = Const Value(0) - v5:BasicObject = SendWithoutBlock v2, :itself, v3 + v4:Fixnum[1] = Const Value(1) + v5:Fixnum[0] = Const Value(0) + v7:BasicObject = SendWithoutBlock v4, :itself, v5 CheckInterrupts - Return v5 + Return v7 "); } @@ -7415,11 +7442,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject): - v3:Fixnum[1] = Const Value(1) + v5:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, zero?@0x1008, cme:0x1010) - v10:BasicObject = SendWithoutBlockDirect v3, :zero? (0x1038) + v14:BasicObject = SendWithoutBlockDirect v5, :zero? (0x1038) CheckInterrupts - Return v10 + Return v14 "); } @@ -7435,12 +7462,12 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject): v2:NilClass = Const Value(nil) - v4:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v6:ArrayExact = ArrayDup v4 + v6:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v8:ArrayExact = ArrayDup v6 PatchPoint MethodRedefined(Array@0x1008, first@0x1010, cme:0x1018) - v13:BasicObject = SendWithoutBlockDirect v6, :first (0x1040) + v19:BasicObject = SendWithoutBlockDirect v8, :first (0x1040) CheckInterrupts - Return v13 + Return v19 "); } @@ -7457,11 +7484,11 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, M) - v11:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v15:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(Module@0x1010, class@0x1018, cme:0x1020) - v13:BasicObject = SendWithoutBlockDirect v11, :class (0x1048) + v17:BasicObject = SendWithoutBlockDirect v15, :class (0x1048) CheckInterrupts - Return v13 + Return v17 "); } @@ -7484,10 +7511,10 @@ mod opt_tests { fn test@:8: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v10:BasicObject = SendWithoutBlockDirect v9, :foo (0x1038) + v13:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v14:BasicObject = SendWithoutBlockDirect v13, :foo (0x1038) CheckInterrupts - Return v10 + Return v14 "); } @@ -7502,10 +7529,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v4:BasicObject = SendWithoutBlock v0, :foo, v2 + v4:Fixnum[1] = Const Value(1) + v6:BasicObject = SendWithoutBlock v0, :foo, v4 CheckInterrupts - Return v4 + Return v6 "); } @@ -7520,9 +7547,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:BasicObject = Send v0, 0x1000, :foo + v5:BasicObject = Send v0, 0x1000, :foo CheckInterrupts - Return v3 + Return v5 "); } @@ -7541,12 +7568,14 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:4: bb0(v0:BasicObject): - v3:Fixnum[1] = Const Value(1) - SetLocal l0, EP@3, v3 - v6:BasicObject = Send v0, 0x1000, :foo - v8:BasicObject = GetLocal l0, EP@3 + v1:NilClass = Const Value(nil) + v5:Fixnum[1] = Const Value(1) + SetLocal l0, EP@3, v5 + v10:BasicObject = Send v0, 0x1000, :foo + v11:BasicObject = GetLocal l0, EP@3 + v14:BasicObject = GetLocal l0, EP@3 CheckInterrupts - Return v8 + Return v14 "); } @@ -7561,10 +7590,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) - v4:BasicObject = SendWithoutBlock v0, :foo, v2 + v4:Fixnum[1] = Const Value(1) + v6:BasicObject = SendWithoutBlock v0, :foo, v4 CheckInterrupts - Return v4 + Return v6 "); } @@ -7579,7 +7608,7 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) SideExit UnhandledCallType(Kwarg) "); } @@ -7595,7 +7624,7 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) SideExit UnhandledCallType(Kwarg) "); } @@ -7610,12 +7639,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:StringExact = StringCopy v2 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact = StringCopy v4 PatchPoint MethodRedefined(String@0x1008, bytesize@0x1010, cme:0x1018) - v11:Fixnum = CCall bytesize@0x1040, v4 + v15:Fixnum = CCall bytesize@0x1040, v6 CheckInterrupts - Return v11 + Return v15 "); } @@ -7627,9 +7656,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:BasicObject = GetConstantPath 0x1000 + v5:BasicObject = GetConstantPath 0x1000 CheckInterrupts - Return v3 + Return v5 "); } @@ -7643,9 +7672,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:BasicObject = GetConstantPath 0x1000 + v5:BasicObject = GetConstantPath 0x1000 CheckInterrupts - Return v3 + Return v5 "); } @@ -7660,9 +7689,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Kernel) - v9:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:ModuleExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) CheckInterrupts - Return v9 + Return v13 "); } @@ -7683,9 +7712,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, Foo::Bar::C) - v9:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) CheckInterrupts - Return v9 + Return v13 "); } @@ -7701,12 +7730,12 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v24:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - v4:NilClass = Const Value(nil) + v28:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v6:NilClass = Const Value(nil) CheckInterrupts - v13:BasicObject = SendWithoutBlock v24, :new + v15:BasicObject = SendWithoutBlock v28, :new CheckInterrupts - Return v13 + Return v15 "); } @@ -7726,13 +7755,13 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, C) - v26:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - v4:NilClass = Const Value(nil) - v5:Fixnum[1] = Const Value(1) + v30:Class[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v6:NilClass = Const Value(nil) + v7:Fixnum[1] = Const Value(1) CheckInterrupts - v15:BasicObject = SendWithoutBlock v26, :new, v5 + v17:BasicObject = SendWithoutBlock v30, :new, v7 CheckInterrupts - Return v15 + Return v17 "); } @@ -7744,11 +7773,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:ArrayExact = NewArray v1, v2 + v7:ArrayExact = NewArray v1, v2 PatchPoint MethodRedefined(Array@0x1000, length@0x1008, cme:0x1010) - v12:Fixnum = CCall length@0x1038, v5 + v18:Fixnum = CCall length@0x1038, v7 CheckInterrupts - Return v12 + Return v18 "); } @@ -7760,11 +7789,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): - v5:ArrayExact = NewArray v1, v2 + v7:ArrayExact = NewArray v1, v2 PatchPoint MethodRedefined(Array@0x1000, size@0x1008, cme:0x1010) - v12:Fixnum = CCall size@0x1038, v5 + v18:Fixnum = CCall size@0x1038, v7 CheckInterrupts - Return v12 + Return v18 "); } @@ -7777,9 +7806,9 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject): PatchPoint SingleRactorMode - v4:BasicObject = GetIvar v0, :@foo + v6:BasicObject = GetIvar v0, :@foo CheckInterrupts - Return v4 + Return v6 "); } @@ -7791,11 +7820,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) PatchPoint SingleRactorMode - SetIvar v0, :@foo, v2 + SetIvar v0, :@foo, v4 CheckInterrupts - Return v2 + Return v4 "); } @@ -7807,10 +7836,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7825,10 +7854,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:5: bb0(v0:BasicObject): - v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:BasicObject = SendWithoutBlock v3, :freeze + v5:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:BasicObject = SendWithoutBlock v5, :freeze CheckInterrupts - Return v4 + Return v6 "); } @@ -7840,11 +7869,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:HashExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(HASH_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7856,11 +7885,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:HashExact = NewHash - v5:BasicObject = SendWithoutBlock v3, :dup - v7:BasicObject = SendWithoutBlock v5, :freeze + v5:HashExact = NewHash + v7:BasicObject = SendWithoutBlock v5, :dup + v9:BasicObject = SendWithoutBlock v7, :freeze CheckInterrupts - Return v7 + Return v9 "); } @@ -7872,11 +7901,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:HashExact = NewHash - v4:NilClass = Const Value(nil) - v6:BasicObject = SendWithoutBlock v3, :freeze, v4 + v5:HashExact = NewHash + v6:NilClass = Const Value(nil) + v8:BasicObject = SendWithoutBlock v5, :freeze, v6 CheckInterrupts - Return v6 + Return v8 "); } @@ -7888,10 +7917,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7903,11 +7932,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7919,11 +7948,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact = NewArray - v5:BasicObject = SendWithoutBlock v3, :dup - v7:BasicObject = SendWithoutBlock v5, :freeze + v5:ArrayExact = NewArray + v7:BasicObject = SendWithoutBlock v5, :dup + v9:BasicObject = SendWithoutBlock v7, :freeze CheckInterrupts - Return v7 + Return v9 "); } @@ -7935,11 +7964,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact = NewArray - v4:NilClass = Const Value(nil) - v6:BasicObject = SendWithoutBlock v3, :freeze, v4 + v5:ArrayExact = NewArray + v6:NilClass = Const Value(nil) + v8:BasicObject = SendWithoutBlock v5, :freeze, v6 CheckInterrupts - Return v6 + Return v8 "); } @@ -7951,10 +7980,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7966,11 +7995,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) CheckInterrupts - Return v3 + Return v5 "); } @@ -7982,12 +8011,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:StringExact = StringCopy v2 - v6:BasicObject = SendWithoutBlock v4, :dup - v8:BasicObject = SendWithoutBlock v6, :freeze + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact = StringCopy v4 + v8:BasicObject = SendWithoutBlock v6, :dup + v10:BasicObject = SendWithoutBlock v8, :freeze CheckInterrupts - Return v8 + Return v10 "); } @@ -7999,12 +8028,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:StringExact = StringCopy v2 - v5:NilClass = Const Value(nil) - v7:BasicObject = SendWithoutBlock v4, :freeze, v5 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact = StringCopy v4 + v7:NilClass = Const Value(nil) + v9:BasicObject = SendWithoutBlock v6, :freeze, v7 CheckInterrupts - Return v7 + Return v9 "); } @@ -8016,10 +8045,10 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_UMINUS) CheckInterrupts - Return v3 + Return v5 "); } @@ -8031,11 +8060,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_FREEZE) PatchPoint BOPRedefined(STRING_REDEFINED_OP_FLAG, BOP_UMINUS) CheckInterrupts - Return v3 + Return v5 "); } @@ -8047,12 +8076,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:StringExact = StringCopy v2 - v6:BasicObject = SendWithoutBlock v4, :dup - v8:BasicObject = SendWithoutBlock v6, :-@ + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:StringExact = StringCopy v4 + v8:BasicObject = SendWithoutBlock v6, :dup + v10:BasicObject = SendWithoutBlock v8, :-@ CheckInterrupts - Return v8 + Return v10 "); } @@ -8064,12 +8093,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v3:StringExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) - v5:StringExact = StringCopy v3 - v11:StringExact = StringConcat v2, v5 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v7:StringExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v9:StringExact = StringCopy v7 + v15:StringExact = StringConcat v4, v9 CheckInterrupts - Return v11 + Return v15 "); } @@ -8081,13 +8110,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v3:Fixnum[1] = Const Value(1) - v5:BasicObject = ObjToString v3 - v7:String = AnyToString v3, str: v5 - v9:StringExact = StringConcat v2, v7 + v4:StringExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:Fixnum[1] = Const Value(1) + v7:BasicObject = ObjToString v5 + v9:String = AnyToString v5, str: v7 + v11:StringExact = StringConcat v4, v9 CheckInterrupts - Return v9 + Return v11 "); } @@ -8103,10 +8132,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:NilClass = Const Value(nil) + v1:NilClass = Const Value(nil) + v5:NilClass = Const Value(nil) CheckInterrupts CheckInterrupts - Return v3 + Return v5 "); } @@ -8122,12 +8152,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v3:Fixnum[1] = Const Value(1) + v1:NilClass = Const Value(nil) + v5:Fixnum[1] = Const Value(1) CheckInterrupts PatchPoint MethodRedefined(Integer@0x1000, itself@0x1008, cme:0x1010) - v19:BasicObject = CCall itself@0x1038, v3 + v25:BasicObject = CCall itself@0x1038, v5 CheckInterrupts - Return v19 + Return v25 "); } @@ -8139,13 +8170,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) - v5:Fixnum[1] = Const Value(1) + v7:Fixnum[1] = Const Value(1) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v13:Fixnum[5] = Const Value(5) + v19:Fixnum[5] = Const Value(5) CheckInterrupts - Return v13 + Return v19 "); } @@ -8157,13 +8188,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) - v5:Fixnum[-3] = Const Value(-3) + v7:Fixnum[-3] = Const Value(-3) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v13:Fixnum[4] = Const Value(4) + v19:Fixnum[4] = Const Value(4) CheckInterrupts - Return v13 + Return v19 "); } @@ -8175,13 +8206,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) - v5:Fixnum[-10] = Const Value(-10) + v7:Fixnum[-10] = Const Value(-10) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v13:NilClass = Const Value(nil) + v19:NilClass = Const Value(nil) CheckInterrupts - Return v13 + Return v19 "); } @@ -8193,13 +8224,13 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) - v5:Fixnum[10] = Const Value(10) + v7:Fixnum[10] = Const Value(10) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_AREF) - v13:NilClass = Const Value(nil) + v19:NilClass = Const Value(nil) CheckInterrupts - Return v13 + Return v19 "); } @@ -8214,12 +8245,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:5: bb0(v0:BasicObject): - v3:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v5:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) PatchPoint BOPRedefined(ARRAY_REDEFINED_OP_FLAG, BOP_FREEZE) - v5:Fixnum[10] = Const Value(10) - v7:BasicObject = SendWithoutBlock v3, :[], v5 + v7:Fixnum[10] = Const Value(10) + v11:BasicObject = SendWithoutBlock v5, :[], v7 CheckInterrupts - Return v7 + Return v11 "); } @@ -8234,12 +8265,12 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:5: bb0(v0:BasicObject): - v2:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) - v4:ArrayExact = ArrayDup v2 + v4:ArrayExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v6:ArrayExact = ArrayDup v4 PatchPoint MethodRedefined(Array@0x1008, max@0x1010, cme:0x1018) - v11:BasicObject = SendWithoutBlockDirect v4, :max (0x1040) + v15:BasicObject = SendWithoutBlockDirect v6, :max (0x1040) CheckInterrupts - Return v11 + Return v15 "); } @@ -8258,9 +8289,9 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, MY_SET) - v9:SetExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v13:SetExact[VALUE(0x1008)] = Const Value(VALUE(0x1008)) CheckInterrupts - Return v9 + Return v13 "); } @@ -8272,9 +8303,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:RegexpExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) + v4:RegexpExact[VALUE(0x1000)] = Const Value(VALUE(0x1000)) CheckInterrupts - Return v2 + Return v4 "); } @@ -8286,11 +8317,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v9:TrueClass = CCall nil?@0x1038, v2 + v15:TrueClass = CCall nil?@0x1038, v4 CheckInterrupts - Return v9 + Return v15 "); } @@ -8305,11 +8336,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:NilClass = Const Value(nil) + v4:NilClass = Const Value(nil) PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v5:Fixnum[1] = Const Value(1) + v11:Fixnum[1] = Const Value(1) CheckInterrupts - Return v5 + Return v11 "); } @@ -8321,11 +8352,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:2: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v9:FalseClass = CCall nil?@0x1038, v2 + v15:FalseClass = CCall nil?@0x1038, v4 CheckInterrupts - Return v9 + Return v15 "); } @@ -8340,11 +8371,11 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:3: bb0(v0:BasicObject): - v2:Fixnum[1] = Const Value(1) + v4:Fixnum[1] = Const Value(1) PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v5:Fixnum[2] = Const Value(2) + v11:Fixnum[2] = Const Value(2) CheckInterrupts - Return v5 + Return v11 "); } @@ -8359,10 +8390,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(NilClass@0x1000, nil?@0x1008, cme:0x1010) - v9:NilClass = GuardType v1, NilClass - v10:TrueClass = CCall nil?@0x1038, v9 + v15:NilClass = GuardType v1, NilClass + v16:TrueClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8377,10 +8408,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(FalseClass@0x1000, nil?@0x1008, cme:0x1010) - v9:FalseClass = GuardType v1, FalseClass - v10:FalseClass = CCall nil?@0x1038, v9 + v15:FalseClass = GuardType v1, FalseClass + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8395,10 +8426,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(TrueClass@0x1000, nil?@0x1008, cme:0x1010) - v9:TrueClass = GuardType v1, TrueClass - v10:FalseClass = CCall nil?@0x1038, v9 + v15:TrueClass = GuardType v1, TrueClass + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8413,10 +8444,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Symbol@0x1000, nil?@0x1008, cme:0x1010) - v9:StaticSymbol = GuardType v1, StaticSymbol - v10:FalseClass = CCall nil?@0x1038, v9 + v15:StaticSymbol = GuardType v1, StaticSymbol + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8431,10 +8462,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Integer@0x1000, nil?@0x1008, cme:0x1010) - v9:Fixnum = GuardType v1, Fixnum - v10:FalseClass = CCall nil?@0x1038, v9 + v15:Fixnum = GuardType v1, Fixnum + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8449,10 +8480,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Float@0x1000, nil?@0x1008, cme:0x1010) - v9:Flonum = GuardType v1, Flonum - v10:FalseClass = CCall nil?@0x1038, v9 + v15:Flonum = GuardType v1, Flonum + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8467,10 +8498,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(String@0x1000, nil?@0x1008, cme:0x1010) - v9:StringExact = GuardType v1, StringExact - v10:FalseClass = CCall nil?@0x1038, v9 + v15:StringExact = GuardType v1, StringExact + v16:FalseClass = CCall nil?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8485,10 +8516,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Array@0x1000, !@0x1008, cme:0x1010) - v9:ArrayExact = GuardType v1, ArrayExact - v10:BoolExact = CCall !@0x1038, v9 + v15:ArrayExact = GuardType v1, ArrayExact + v16:BoolExact = CCall !@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8503,10 +8534,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Array@0x1000, empty?@0x1008, cme:0x1010) - v9:ArrayExact = GuardType v1, ArrayExact - v10:BoolExact = CCall empty?@0x1038, v9 + v15:ArrayExact = GuardType v1, ArrayExact + v16:BoolExact = CCall empty?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8521,10 +8552,10 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(Hash@0x1000, empty?@0x1008, cme:0x1010) - v9:HashExact = GuardType v1, HashExact - v10:BoolExact = CCall empty?@0x1038, v9 + v15:HashExact = GuardType v1, HashExact + v16:BoolExact = CCall empty?@0x1038, v15 CheckInterrupts - Return v10 + Return v16 "); } @@ -8540,10 +8571,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint MethodRedefined(C@0x1000, ==@0x1008, cme:0x1010) - v10:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v11:BoolExact = CCall ==@0x1038, v10, v2 + v16:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v17:BoolExact = CCall ==@0x1038, v16, v2 CheckInterrupts - Return v11 + Return v17 "); } @@ -8558,11 +8589,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 28) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = GuardType v2, Fixnum - v12:Fixnum = FixnumAnd v10, v11 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = GuardType v2, Fixnum + v18:Fixnum = FixnumAnd v16, v17 CheckInterrupts - Return v12 + Return v18 "); } @@ -8577,11 +8608,11 @@ mod opt_tests { fn test@:2: bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): PatchPoint BOPRedefined(INTEGER_REDEFINED_OP_FLAG, 29) - v10:Fixnum = GuardType v1, Fixnum - v11:Fixnum = GuardType v2, Fixnum - v12:Fixnum = FixnumOr v10, v11 + v16:Fixnum = GuardType v1, Fixnum + v17:Fixnum = GuardType v2, Fixnum + v18:Fixnum = FixnumOr v16, v17 CheckInterrupts - Return v12 + Return v18 "); } @@ -8598,10 +8629,10 @@ mod opt_tests { fn test@:3: bb0(v0:BasicObject): PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010) - v8:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] - v9:BasicObject = SendWithoutBlockDirect v8, :foo (0x1038) + v12:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v0, HeapObject[class_exact*:Object@VALUE(0x1000)] + v13:BasicObject = SendWithoutBlockDirect v12, :foo (0x1038) CheckInterrupts - Return v9 + Return v13 "); } @@ -8624,11 +8655,11 @@ mod opt_tests { fn test@:10: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v12:HeapObject[class_exact:C] = GuardShape v9, 0x1038 - v13:BasicObject = LoadIvarEmbedded v12, :@foo@0x1039 + v13:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v16:HeapObject[class_exact:C] = GuardShape v13, 0x1038 + v17:BasicObject = LoadIvarEmbedded v16, :@foo@0x1039 CheckInterrupts - Return v13 + Return v17 "); } @@ -8651,11 +8682,11 @@ mod opt_tests { fn test@:10: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v12:HeapObject[class_exact:C] = GuardShape v9, 0x1038 - v13:BasicObject = LoadIvarEmbedded v12, :@foo@0x1039 + v13:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v16:HeapObject[class_exact:C] = GuardShape v13, 0x1038 + v17:BasicObject = LoadIvarEmbedded v16, :@foo@0x1039 CheckInterrupts - Return v13 + Return v17 "); } @@ -8689,9 +8720,9 @@ mod opt_tests { assert_snapshot!(hir_string("test"), @r" fn test@:20: bb0(v0:BasicObject, v1:BasicObject): - v4:BasicObject = SendWithoutBlock v1, :foo + v6:BasicObject = SendWithoutBlock v1, :foo CheckInterrupts - Return v4 + Return v6 "); } @@ -8712,13 +8743,13 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, O) - v11:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v15:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(C@0x1010, foo@0x1018, cme:0x1020) - v14:HeapObject[VALUE(0x1008)] = GuardType v11, HeapObject - v15:HeapObject[VALUE(0x1008)] = GuardShape v14, 0x1048 - v16:NilClass = Const Value(nil) + v18:HeapObject[VALUE(0x1008)] = GuardType v15, HeapObject + v19:HeapObject[VALUE(0x1008)] = GuardShape v18, 0x1048 + v20:NilClass = Const Value(nil) CheckInterrupts - Return v16 + Return v20 "); } @@ -8739,13 +8770,13 @@ mod opt_tests { bb0(v0:BasicObject): PatchPoint SingleRactorMode PatchPoint StableConstantNames(0x1000, O) - v11:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) + v15:BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008)) PatchPoint MethodRedefined(C@0x1010, foo@0x1018, cme:0x1020) - v14:HeapObject[VALUE(0x1008)] = GuardType v11, HeapObject - v15:HeapObject[VALUE(0x1008)] = GuardShape v14, 0x1048 - v16:NilClass = Const Value(nil) + v18:HeapObject[VALUE(0x1008)] = GuardType v15, HeapObject + v19:HeapObject[VALUE(0x1008)] = GuardShape v18, 0x1048 + v20:NilClass = Const Value(nil) CheckInterrupts - Return v16 + Return v20 "); } @@ -8764,11 +8795,11 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v12:HeapObject[class_exact:C] = GuardShape v9, 0x1038 - v13:NilClass = Const Value(nil) + v13:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v16:HeapObject[class_exact:C] = GuardShape v13, 0x1038 + v17:NilClass = Const Value(nil) CheckInterrupts - Return v13 + Return v17 "); } @@ -8787,11 +8818,11 @@ mod opt_tests { fn test@:6: bb0(v0:BasicObject, v1:BasicObject): PatchPoint MethodRedefined(C@0x1000, foo@0x1008, cme:0x1010) - v9:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] - v12:HeapObject[class_exact:C] = GuardShape v9, 0x1038 - v13:NilClass = Const Value(nil) + v13:HeapObject[class_exact:C] = GuardType v1, HeapObject[class_exact:C] + v16:HeapObject[class_exact:C] = GuardShape v13, 0x1038 + v17:NilClass = Const Value(nil) CheckInterrupts - Return v13 + Return v17 "); } } diff --git a/zjit/src/invariants.rs b/zjit/src/invariants.rs index 345d815bf2054c..0b44fd4624c95a 100644 --- a/zjit/src/invariants.rs +++ b/zjit/src/invariants.rs @@ -54,6 +54,9 @@ pub struct Invariants { /// Map from constant ID to patch points that assume the constant hasn't been redefined constant_state_patch_points: HashMap>, + /// Set of patch points that assume that the TracePoint is not enabled + no_trace_point_patch_points: HashSet, + /// Set of patch points that assume that the interpreter is running with only one ractor single_ractor_patch_points: HashSet, } @@ -272,6 +275,15 @@ pub extern "C" fn rb_zjit_before_ractor_spawn() { }); } +pub fn track_no_trace_point_assumption(patch_point_ptr: CodePtr, side_exit_ptr: CodePtr, payload_ptr: *mut IseqPayload) { + let invariants = ZJITState::get_invariants(); + invariants.no_trace_point_patch_points.insert(PatchPoint { + patch_point_ptr, + side_exit_ptr, + payload_ptr, + }); +} + #[unsafe(no_mangle)] pub extern "C" fn rb_zjit_tracing_invalidate_all() { use crate::gc::{get_or_create_iseq_payload, IseqStatus}; @@ -291,5 +303,12 @@ pub extern "C" fn rb_zjit_tracing_invalidate_all() { payload.status = IseqStatus::NotCompiled; unsafe { rb_iseq_reset_jit_func(iseq) }; }); + + let cb = ZJITState::get_code_block(); + let patch_points = mem::take(&mut ZJITState::get_invariants().no_trace_point_patch_points); + + compile_patch_points!(cb, patch_points, "TracePoint is enabled, invalidating no TracePoint assumption"); + + cb.mark_all_executable(); }); } From 7300b3d6cb9073be1d1db07a052c7bc27c3cc175 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Thu, 4 Sep 2025 19:37:56 +0100 Subject: [PATCH 4/4] ZJIT: Fix Rust compilation warning (#14443) This fixes: ``` warning: unused import: `ParseError` --> zjit/src/codegen.rs:20:61 | 20 | use crate::hir::{Const, FrameState, Function, Insn, InsnId, ParseError}; | ^^^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default ``` --- zjit/src/codegen.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs index bea7706854a1f8..16724a6c186984 100644 --- a/zjit/src/codegen.rs +++ b/zjit/src/codegen.rs @@ -17,7 +17,7 @@ use crate::stats::{counter_ptr, with_time_stat, Counter, Counter::{compile_time_ use crate::{asm::CodeBlock, cruby::*, options::debug, virtualmem::CodePtr}; use crate::backend::lir::{self, asm_comment, asm_ccall, Assembler, Opnd, Target, CFP, C_ARG_OPNDS, C_RET_OPND, EC, NATIVE_STACK_PTR, NATIVE_BASE_PTR, SCRATCH_OPND, SP}; use crate::hir::{iseq_to_hir, Block, BlockId, BranchEdge, Invariant, RangeType, SideExitReason, SideExitReason::*, SpecialObjectType, SpecialBackrefSymbol, SELF_PARAM_IDX}; -use crate::hir::{Const, FrameState, Function, Insn, InsnId, ParseError}; +use crate::hir::{Const, FrameState, Function, Insn, InsnId}; use crate::hir_type::{types, Type}; use crate::options::get_option; @@ -1531,6 +1531,7 @@ fn compile_iseq(iseq: IseqPtr) -> Result { #[cfg(debug_assertions)] if let Err(err) = function.validate() { debug!("ZJIT: compile_iseq: {err:?}"); + use crate::hir::ParseError; return Err(CompileError::ParseError(ParseError::Validation(err))); } Ok(function)