@@ -6808,6 +6808,74 @@ pub(crate) mod hir_build_tests {
68086808 Return v39
68096809 " ) ;
68106810 }
6811+
6812+ #[ test]
6813+ fn test_global_load_elimination ( ) {
6814+ set_call_threshold ( 3 ) ;
6815+ eval ( r#"
6816+ class TestObj
6817+ def initialize(value)
6818+ @value = value
6819+ end
6820+
6821+ def read(val)
6822+ even = val.even?
6823+ a = @value
6824+ even ? a : @value + 1
6825+ end
6826+ end
6827+
6828+ obj = TestObj.new(5)
6829+ obj.read(1)
6830+ obj.read(2)
6831+ "# ) ;
6832+
6833+ assert_snapshot ! (
6834+ hir_string_proc( "TestObj.instance_method(:read)" ) ,
6835+ @"
6836+ fn read@<compiled>:8:
6837+ bb1():
6838+ EntryPoint interpreter
6839+ v1:BasicObject = LoadSelf
6840+ v2:CPtr = LoadSP
6841+ v3:BasicObject = LoadField v2, :val@0x1000
6842+ v4:NilClass = Const Value(nil)
6843+ v5:NilClass = Const Value(nil)
6844+ Jump bb3(v1, v3, v4, v5)
6845+ bb2():
6846+ EntryPoint JIT(0)
6847+ v8:BasicObject = LoadArg :self@0
6848+ v9:BasicObject = LoadArg :val@1
6849+ v10:NilClass = Const Value(nil)
6850+ v11:NilClass = Const Value(nil)
6851+ Jump bb3(v8, v9, v10, v11)
6852+ bb3(v13:BasicObject, v14:BasicObject, v15:NilClass, v16:NilClass):
6853+ v21:BasicObject = Send v14, :even? # SendFallbackReason: Uncategorized(opt_send_without_block)
6854+ PatchPoint NoEPEscape(read)
6855+ v27:HeapBasicObject = GuardType v13, HeapBasicObject
6856+ v28:CShape = LoadField v27, :shape_id@0x1001
6857+ v29:CShape[0x1002] = GuardBitEquals v28, CShape(0x1002) recompile
6858+ v30:BasicObject = LoadField v27, :@value@0x1003
6859+ PatchPoint NoEPEscape(read)
6860+ v37:CBool = Test v21
6861+ v38:Falsy = RefineType v21, Falsy
6862+ CondBranch v37, bb5(), bb4(v13, v14, v38, v30)
6863+ bb5():
6864+ v40:Truthy = RefineType v21, Truthy
6865+ CheckInterrupts
6866+ Return v30
6867+ bb4(v46:BasicObject, v47:BasicObject, v48:Falsy, v49:BasicObject):
6868+ v52:HeapBasicObject = GuardType v46, HeapBasicObject
6869+ v53:CShape = LoadField v52, :shape_id@0x1001
6870+ v54:CShape[0x1002] = GuardBitEquals v53, CShape(0x1002) recompile
6871+ v55:BasicObject = LoadField v52, :@value@0x1003
6872+ v57:Fixnum[1] = Const Value(1)
6873+ v60:BasicObject = Send v55, :+, v57 # SendFallbackReason: Uncategorized(opt_plus)
6874+ CheckInterrupts
6875+ Return v60
6876+ "
6877+ ) ;
6878+ }
68116879}
68126880
68136881 /// Test successor and predecessor set computations.
0 commit comments