@@ -8383,6 +8383,89 @@ mod hir_opt_tests {
83838383 " ) ;
83848384 }
83858385
8386+ #[ test]
8387+ fn test_optimize_array_splice_aset_profiled ( ) {
8388+ eval ( "
8389+ def test(arr, index, len, val)
8390+ arr[index, len] = val
8391+ end
8392+ test([1,2,3], 0, 2, [4,5,6])
8393+ " ) ;
8394+ assert_snapshot ! ( hir_string( "test" ) , @"
8395+ fn test@<compiled>:3:
8396+ bb1():
8397+ EntryPoint interpreter
8398+ v1:BasicObject = LoadSelf
8399+ v2:BasicObject = GetLocal :arr, l0, SP@7
8400+ v3:BasicObject = GetLocal :index, l0, SP@6
8401+ v4:BasicObject = GetLocal :len, l0, SP@5
8402+ v5:BasicObject = GetLocal :val, l0, SP@4
8403+ Jump bb3(v1, v2, v3, v4, v5)
8404+ bb2():
8405+ EntryPoint JIT(0)
8406+ v8:BasicObject = LoadArg :self@0
8407+ v9:BasicObject = LoadArg :arr@1
8408+ v10:BasicObject = LoadArg :index@2
8409+ v11:BasicObject = LoadArg :len@3
8410+ v12:BasicObject = LoadArg :val@4
8411+ Jump bb3(v8, v9, v10, v11, v12)
8412+ bb3(v14:BasicObject, v15:BasicObject, v16:BasicObject, v17:BasicObject, v18:BasicObject):
8413+ PatchPoint NoSingletonClass(Array@0x1000)
8414+ PatchPoint MethodRedefined(Array@0x1000, []=@0x1008, cme:0x1010)
8415+ v39:ArrayExact = GuardType v15, ArrayExact
8416+ v40:Fixnum = GuardType v16, Fixnum
8417+ v41:Fixnum = GuardType v17, Fixnum
8418+ v42:CUInt64 = LoadField v39, :_rbasic_flags@0x1038
8419+ v43:CUInt64 = GuardNoBitsSet v42, RUBY_FL_FREEZE=CUInt64(2048)
8420+ v44:CUInt64 = LoadField v39, :_rbasic_flags@0x1038
8421+ v45:CUInt64 = GuardNoBitsSet v44, RUBY_ELTS_SHARED=CUInt64(4096)
8422+ v46:CInt64 = UnboxFixnum v40
8423+ v47:CInt64 = UnboxFixnum v41
8424+ v48:BasicObject = CCall v39, :[]=@0x1040, v46, v47, v18
8425+ IncrCounter inline_cfunc_optimized_send_count
8426+ CheckInterrupts
8427+ Return v18
8428+ " ) ;
8429+ }
8430+
8431+ #[ test]
8432+ fn test_optimize_array_splice_aset_array_subclass ( ) {
8433+ eval ( "
8434+ class MySpliceArray2 < Array; end
8435+ def test(arr, index, len, val)
8436+ arr[index, len] = val
8437+ end
8438+ a = MySpliceArray2.new([1,2,3])
8439+ test(a, 0, 2, [4,5])
8440+ " ) ;
8441+ assert_snapshot ! ( hir_string( "test" ) , @"
8442+ fn test@<compiled>:4:
8443+ bb1():
8444+ EntryPoint interpreter
8445+ v1:BasicObject = LoadSelf
8446+ v2:BasicObject = GetLocal :arr, l0, SP@7
8447+ v3:BasicObject = GetLocal :index, l0, SP@6
8448+ v4:BasicObject = GetLocal :len, l0, SP@5
8449+ v5:BasicObject = GetLocal :val, l0, SP@4
8450+ Jump bb3(v1, v2, v3, v4, v5)
8451+ bb2():
8452+ EntryPoint JIT(0)
8453+ v8:BasicObject = LoadArg :self@0
8454+ v9:BasicObject = LoadArg :arr@1
8455+ v10:BasicObject = LoadArg :index@2
8456+ v11:BasicObject = LoadArg :len@3
8457+ v12:BasicObject = LoadArg :val@4
8458+ Jump bb3(v8, v9, v10, v11, v12)
8459+ bb3(v14:BasicObject, v15:BasicObject, v16:BasicObject, v17:BasicObject, v18:BasicObject):
8460+ PatchPoint NoSingletonClass(MySpliceArray2@0x1000)
8461+ PatchPoint MethodRedefined(MySpliceArray2@0x1000, []=@0x1008, cme:0x1010)
8462+ v39:ArraySubclass[class_exact:MySpliceArray2] = GuardType v15, ArraySubclass[class_exact:MySpliceArray2]
8463+ v40:BasicObject = CCallVariadic v39, :Array#[]=@0x1038, v16, v17, v18
8464+ CheckInterrupts
8465+ Return v18
8466+ " ) ;
8467+ }
8468+
83868469 #[ test]
83878470 fn test_optimize_array_ltlt ( ) {
83888471 eval ( "
0 commit comments