diff options
| -rw-r--r-- | zjit/src/hir.rs | 25 | ||||
| -rw-r--r-- | zjit/src/hir/opt_tests.rs | 36 | ||||
| -rw-r--r-- | zjit/src/hir/tests.rs | 4 |
3 files changed, 36 insertions, 29 deletions
diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index 4a81ce641c..c3948f89e3 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2251,7 +2251,13 @@ impl Function { Insn::IsBitNotEqual { .. } => types::CBool, Insn::BoxBool { .. } => types::BoolExact, Insn::BoxFixnum { .. } => types::Fixnum, - Insn::UnboxFixnum { .. } => types::CInt64, + Insn::UnboxFixnum { val } => { + if let Some(fixnum) = self.type_of(*val).fixnum_value() { + Type::from_cint(types::CInt64, fixnum) + } else { + types::CInt64 + } + }, Insn::FixnumAref { .. } => types::Fixnum, Insn::StringCopy { .. } => types::StringExact, Insn::StringIntern { .. } => types::Symbol, @@ -4073,15 +4079,16 @@ impl Function { _ => None, }) } - Insn::ArrayAref { array, index } if self.type_of(array).ruby_object_known() - && self.type_of(index).ruby_object_known() => { + Insn::ArrayAref { array, index } + if self.type_of(array).ruby_object_known() + && self.type_of(index).is_subtype(types::CInt64) => { let array_obj = self.type_of(array).ruby_object().unwrap(); - if array_obj.is_frozen() { - let index = self.type_of(index).cint64_value().unwrap(); - let val = unsafe { rb_yarv_ary_entry_internal(array_obj, index) }; - self.new_insn(Insn::Const { val: Const::Value(val) }) - } else { - insn_id + match (array_obj.is_frozen(), self.type_of(index).cint64_value()) { + (true, Some(index)) => { + let val = unsafe { rb_yarv_ary_entry_internal(array_obj, index) }; + self.new_insn(Insn::Const { val: Const::Value(val) }) + } + _ => insn_id, } } Insn::Test { val } if self.type_of(val).is_known_falsy() => { diff --git a/zjit/src/hir/opt_tests.rs b/zjit/src/hir/opt_tests.rs index 4086a57833..3f8899d61c 100644 --- a/zjit/src/hir/opt_tests.rs +++ b/zjit/src/hir/opt_tests.rs @@ -1606,7 +1606,7 @@ mod hir_opt_tests { PatchPoint NoSingletonClass(Array@0x1000) PatchPoint MethodRedefined(Array@0x1000, []@0x1008, cme:0x1010) v25:ArrayExact = GuardType v9, ArrayExact - v26:CInt64 = UnboxFixnum v14 + v26:CInt64[0] = UnboxFixnum v14 v27:BasicObject = ArrayAref v25, v26 IncrCounter inline_cfunc_optimized_send_count CheckInterrupts @@ -4735,7 +4735,7 @@ mod hir_opt_tests { v13:Fixnum[0] = Const Value(0) PatchPoint NoSingletonClass(Array@0x1010) PatchPoint MethodRedefined(Array@0x1010, []@0x1018, cme:0x1020) - v27:CInt64 = UnboxFixnum v13 + v27:CInt64[0] = UnboxFixnum v13 v28:BasicObject = ArrayAref v23, v27 IncrCounter inline_cfunc_optimized_send_count CheckInterrupts @@ -4765,11 +4765,11 @@ mod hir_opt_tests { v13:Fixnum[1] = Const Value(1) PatchPoint NoSingletonClass(Array@0x1008) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) - v24:CInt64 = UnboxFixnum v13 - v25:BasicObject = ArrayAref v11, v24 + v24:CInt64[1] = UnboxFixnum v13 + v27:Fixnum[5] = Const Value(5) IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v25 + Return v27 "); } @@ -4793,11 +4793,11 @@ mod hir_opt_tests { v13:Fixnum[-3] = Const Value(-3) PatchPoint NoSingletonClass(Array@0x1008) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) - v24:CInt64 = UnboxFixnum v13 - v25:BasicObject = ArrayAref v11, v24 + v24:CInt64[-3] = UnboxFixnum v13 + v27:Fixnum[4] = Const Value(4) IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v25 + Return v27 "); } @@ -4821,11 +4821,11 @@ mod hir_opt_tests { v13:Fixnum[-10] = Const Value(-10) PatchPoint NoSingletonClass(Array@0x1008) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) - v24:CInt64 = UnboxFixnum v13 - v25:BasicObject = ArrayAref v11, v24 + v24:CInt64[-10] = UnboxFixnum v13 + v27:NilClass = Const Value(nil) IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v25 + Return v27 "); } @@ -4849,11 +4849,11 @@ mod hir_opt_tests { v13:Fixnum[10] = Const Value(10) PatchPoint NoSingletonClass(Array@0x1008) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) - v24:CInt64 = UnboxFixnum v13 - v25:BasicObject = ArrayAref v11, v24 + v24:CInt64[10] = UnboxFixnum v13 + v27:NilClass = Const Value(nil) IncrCounter inline_cfunc_optimized_send_count CheckInterrupts - Return v25 + Return v27 "); } @@ -6741,7 +6741,7 @@ mod hir_opt_tests { v19:Fixnum[0] = Const Value(0) PatchPoint NoSingletonClass(Array@0x1008) PatchPoint MethodRedefined(Array@0x1008, []@0x1010, cme:0x1018) - v30:CInt64 = UnboxFixnum v19 + v30:CInt64[0] = UnboxFixnum v19 v31:BasicObject = ArrayAref v14, v30 IncrCounter inline_cfunc_optimized_send_count CheckInterrupts @@ -7087,11 +7087,11 @@ mod hir_opt_tests { v31:ArrayExact = GuardType v9, ArrayExact v32:ArrayExact = GuardNotFrozen v31 v33:ArrayExact = GuardNotShared v32 - v34:CInt64 = UnboxFixnum v16 + v34:CInt64[1] = UnboxFixnum v16 v35:CInt64 = ArrayLength v33 - v36:CInt64 = GuardLess v34, v35 + v36:CInt64[1] = GuardLess v34, v35 v37:CInt64[0] = Const CInt64(0) - v38:CInt64 = GuardGreaterEq v36, v37 + v38:CInt64[1] = GuardGreaterEq v36, v37 ArrayAset v33, v38, v18 WriteBarrier v33, v18 IncrCounter inline_cfunc_optimized_send_count diff --git a/zjit/src/hir/tests.rs b/zjit/src/hir/tests.rs index 6a26b69051..b4bd9cbc31 100644 --- a/zjit/src/hir/tests.rs +++ b/zjit/src/hir/tests.rs @@ -3566,10 +3566,10 @@ pub mod hir_build_tests { v22:CInt64 = ArrayLength v21 v23:CInt64[2] = GuardBitEquals v22, CInt64(2) v24:Fixnum[1] = Const Value(1) - v25:CInt64 = UnboxFixnum v24 + v25:CInt64[1] = UnboxFixnum v24 v26:BasicObject = ArrayAref v21, v25 v27:Fixnum[0] = Const Value(0) - v28:CInt64 = UnboxFixnum v27 + v28:CInt64[0] = UnboxFixnum v27 v29:BasicObject = ArrayAref v21, v28 PatchPoint NoEPEscape(test) CheckInterrupts |
