@@ -431,7 +431,7 @@ pub enum Insn {
431
431
/// Return C `true` if `val` is `Qnil`, else `false`.
432
432
IsNil { val : InsnId } ,
433
433
Defined { op_type : usize , obj : VALUE , pushval : VALUE , v : InsnId } ,
434
- GetConstantPath { ic : * const iseq_inline_constant_cache } ,
434
+ GetConstantPath { ic : * const iseq_inline_constant_cache , state : InsnId } ,
435
435
436
436
/// Get a global variable named `id`
437
437
GetGlobal { id : ID , state : InsnId } ,
@@ -651,7 +651,7 @@ impl<'a> std::fmt::Display for InsnPrinter<'a> {
651
651
Insn :: GuardType { val, guard_type, .. } => { write ! ( f, "GuardType {val}, {}" , guard_type. print( self . ptr_map) ) } ,
652
652
Insn :: GuardBitEquals { val, expected, .. } => { write ! ( f, "GuardBitEquals {val}, {}" , expected. print( self . ptr_map) ) } ,
653
653
Insn :: PatchPoint ( invariant) => { write ! ( f, "PatchPoint {}" , invariant. print( self . ptr_map) ) } ,
654
- Insn :: GetConstantPath { ic } => { write ! ( f, "GetConstantPath {:p}" , self . ptr_map. map_ptr( ic) ) } ,
654
+ Insn :: GetConstantPath { ic, .. } => { write ! ( f, "GetConstantPath {:p}" , self . ptr_map. map_ptr( ic) ) } ,
655
655
Insn :: CCall { cfun, args, name, return_type : _, elidable : _ } => {
656
656
write ! ( f, "CCall {}@{:p}" , name. contents_lossy( ) , self . ptr_map. map_ptr( cfun) ) ?;
657
657
for arg in args {
@@ -1355,7 +1355,7 @@ impl Function {
1355
1355
let send_direct = self . push_insn ( block, Insn :: SendWithoutBlockDirect { self_val, call_info, cd, cme, iseq, args, state } ) ;
1356
1356
self . make_equal_to ( insn_id, send_direct) ;
1357
1357
}
1358
- Insn :: GetConstantPath { ic } => {
1358
+ Insn :: GetConstantPath { ic, .. } => {
1359
1359
let idlist: * const ID = unsafe { ( * ic) . segments } ;
1360
1360
let ice = unsafe { ( * ic) . entry } ;
1361
1361
if ice. is_null ( ) {
@@ -1642,10 +1642,14 @@ impl Function {
1642
1642
if necessary[ insn_id. 0 ] { continue ; }
1643
1643
necessary[ insn_id. 0 ] = true ;
1644
1644
match self . find ( insn_id) {
1645
- Insn :: Const { .. } | Insn :: Param { .. }
1646
- | Insn :: PatchPoint ( ..) | Insn :: GetConstantPath { .. }
1645
+ Insn :: Const { .. }
1646
+ | Insn :: Param { .. }
1647
+ | Insn :: PatchPoint ( ..)
1647
1648
| Insn :: PutSpecialObject { .. } =>
1648
1649
{ }
1650
+ Insn :: GetConstantPath { ic : _, state } => {
1651
+ worklist. push_back ( state) ;
1652
+ }
1649
1653
Insn :: ArrayMax { elements, state }
1650
1654
| Insn :: NewArray { elements, state } => {
1651
1655
worklist. extend ( elements) ;
@@ -2309,7 +2313,8 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
2309
2313
}
2310
2314
YARVINSN_opt_getconstant_path => {
2311
2315
let ic = get_arg ( pc, 0 ) . as_ptr ( ) ;
2312
- state. stack_push ( fun. push_insn ( block, Insn :: GetConstantPath { ic } ) ) ;
2316
+ let snapshot = fun. push_insn ( block, Insn :: Snapshot { state : exit_state } ) ;
2317
+ state. stack_push ( fun. push_insn ( block, Insn :: GetConstantPath { ic, state : snapshot } ) ) ;
2313
2318
}
2314
2319
YARVINSN_branchunless => {
2315
2320
let offset = get_arg ( pc, 0 ) . as_i64 ( ) ;
@@ -3745,14 +3750,14 @@ mod tests {
3745
3750
assert_method_hir_with_opcode ( "test" , YARVINSN_opt_new , expect ! [ [ r#"
3746
3751
fn test:
3747
3752
bb0(v0:BasicObject):
3748
- v2 :BasicObject = GetConstantPath 0x1000
3749
- v3 :NilClassExact = Const Value(nil)
3750
- Jump bb1(v0, v3, v2 )
3751
- bb1(v5 :BasicObject, v6 :NilClassExact, v7 :BasicObject):
3752
- v10 :BasicObject = SendWithoutBlock v7 , :new
3753
- Jump bb2(v5, v10, v6 )
3754
- bb2(v12 :BasicObject, v13 :BasicObject, v14 :NilClassExact):
3755
- Return v13
3753
+ v3 :BasicObject = GetConstantPath 0x1000
3754
+ v4 :NilClassExact = Const Value(nil)
3755
+ Jump bb1(v0, v4, v3 )
3756
+ bb1(v6 :BasicObject, v7 :NilClassExact, v8 :BasicObject):
3757
+ v11 :BasicObject = SendWithoutBlock v8 , :new
3758
+ Jump bb2(v6, v11, v7 )
3759
+ bb2(v13 :BasicObject, v14 :BasicObject, v15 :NilClassExact):
3760
+ Return v14
3756
3761
"# ] ] ) ;
3757
3762
}
3758
3763
@@ -5155,9 +5160,9 @@ mod opt_tests {
5155
5160
assert_optimized_method_hir ( "test" , expect ! [ [ r#"
5156
5161
fn test:
5157
5162
bb0(v0:BasicObject):
5158
- v2 :BasicObject = GetConstantPath 0x1000
5159
- v3 :Fixnum[5] = Const Value(5)
5160
- Return v3
5163
+ v3 :BasicObject = GetConstantPath 0x1000
5164
+ v4 :Fixnum[5] = Const Value(5)
5165
+ Return v4
5161
5166
"# ] ] ) ;
5162
5167
}
5163
5168
@@ -5226,8 +5231,8 @@ mod opt_tests {
5226
5231
PatchPoint SingleRactorMode
5227
5232
PatchPoint StableConstantNames(0x1000, M)
5228
5233
PatchPoint MethodRedefined(Module@0x1008, name@0x1010)
5229
- v6 :Fixnum[1] = Const Value(1)
5230
- Return v6
5234
+ v7 :Fixnum[1] = Const Value(1)
5235
+ Return v7
5231
5236
"# ] ] ) ;
5232
5237
}
5233
5238
@@ -5344,8 +5349,8 @@ mod opt_tests {
5344
5349
assert_optimized_method_hir ( "test" , expect ! [ [ r#"
5345
5350
fn test:
5346
5351
bb0(v0:BasicObject):
5347
- v2 :BasicObject = GetConstantPath 0x1000
5348
- Return v2
5352
+ v3 :BasicObject = GetConstantPath 0x1000
5353
+ Return v3
5349
5354
"# ] ] ) ;
5350
5355
}
5351
5356
@@ -5359,8 +5364,8 @@ mod opt_tests {
5359
5364
assert_optimized_method_hir ( "test" , expect ! [ [ r#"
5360
5365
fn test:
5361
5366
bb0(v0:BasicObject):
5362
- v2 :BasicObject = GetConstantPath 0x1000
5363
- Return v2
5367
+ v3 :BasicObject = GetConstantPath 0x1000
5368
+ Return v3
5364
5369
"# ] ] ) ;
5365
5370
}
5366
5371
@@ -5375,8 +5380,8 @@ mod opt_tests {
5375
5380
bb0(v0:BasicObject):
5376
5381
PatchPoint SingleRactorMode
5377
5382
PatchPoint StableConstantNames(0x1000, Kernel)
5378
- v6 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5379
- Return v6
5383
+ v7 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5384
+ Return v7
5380
5385
"# ] ] ) ;
5381
5386
}
5382
5387
@@ -5397,8 +5402,8 @@ mod opt_tests {
5397
5402
bb0(v0:BasicObject):
5398
5403
PatchPoint SingleRactorMode
5399
5404
PatchPoint StableConstantNames(0x1000, Foo::Bar::C)
5400
- v6 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5401
- Return v6
5405
+ v7 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5406
+ Return v7
5402
5407
"# ] ] ) ;
5403
5408
}
5404
5409
@@ -5414,14 +5419,14 @@ mod opt_tests {
5414
5419
bb0(v0:BasicObject):
5415
5420
PatchPoint SingleRactorMode
5416
5421
PatchPoint StableConstantNames(0x1000, C)
5417
- v19 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5418
- v3 :NilClassExact = Const Value(nil)
5419
- Jump bb1(v0, v3, v19 )
5420
- bb1(v5 :BasicObject, v6 :NilClassExact, v7 :BasicObject[VALUE(0x1008)]):
5421
- v10 :BasicObject = SendWithoutBlock v7 , :new
5422
- Jump bb2(v5, v10, v6 )
5423
- bb2(v12 :BasicObject, v13 :BasicObject, v14 :NilClassExact):
5424
- Return v13
5422
+ v20 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5423
+ v4 :NilClassExact = Const Value(nil)
5424
+ Jump bb1(v0, v4, v20 )
5425
+ bb1(v6 :BasicObject, v7 :NilClassExact, v8 :BasicObject[VALUE(0x1008)]):
5426
+ v11 :BasicObject = SendWithoutBlock v8 , :new
5427
+ Jump bb2(v6, v11, v7 )
5428
+ bb2(v13 :BasicObject, v14 :BasicObject, v15 :NilClassExact):
5429
+ Return v14
5425
5430
"# ] ] ) ;
5426
5431
}
5427
5432
@@ -5441,15 +5446,15 @@ mod opt_tests {
5441
5446
bb0(v0:BasicObject):
5442
5447
PatchPoint SingleRactorMode
5443
5448
PatchPoint StableConstantNames(0x1000, C)
5444
- v21 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5445
- v3 :NilClassExact = Const Value(nil)
5446
- v4 :Fixnum[1] = Const Value(1)
5447
- Jump bb1(v0, v3, v21, v4 )
5448
- bb1(v6 :BasicObject, v7 :NilClassExact, v8 :BasicObject[VALUE(0x1008)], v9 :Fixnum[1]):
5449
- v12 :BasicObject = SendWithoutBlock v8 , :new, v9
5450
- Jump bb2(v6, v12, v7 )
5451
- bb2(v14 :BasicObject, v15 :BasicObject, v16 :NilClassExact):
5452
- Return v15
5449
+ v22 :BasicObject[VALUE(0x1008)] = Const Value(VALUE(0x1008))
5450
+ v4 :NilClassExact = Const Value(nil)
5451
+ v5 :Fixnum[1] = Const Value(1)
5452
+ Jump bb1(v0, v4, v22, v5 )
5453
+ bb1(v7 :BasicObject, v8 :NilClassExact, v9 :BasicObject[VALUE(0x1008)], v10 :Fixnum[1]):
5454
+ v13 :BasicObject = SendWithoutBlock v9 , :new, v10
5455
+ Jump bb2(v7, v13, v8 )
5456
+ bb2(v15 :BasicObject, v16 :BasicObject, v17 :NilClassExact):
5457
+ Return v16
5453
5458
"# ] ] ) ;
5454
5459
}
5455
5460
0 commit comments