Skip to content

Commit 85b42cb

Browse files
committed
fix hang by removing cross-BB var reference
1 parent fd97313 commit 85b42cb

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

zjit/src/hir.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6938,32 +6938,32 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
69386938
let branch_insn_idx = exit_state.insn_idx as u32;
69396939
let locals_count = state.locals.len();
69406940
let stack_count = state.stack.len();
6941-
let (get_field_block, field_block_self, mut get_field_state, _) = new_branch_block(&mut fun, branch_insn_idx, &exit_state, locals_count, stack_count);
6941+
let (load_block, load_block_self, mut get_field_state, _) = new_branch_block(&mut fun, branch_insn_idx, &exit_state, locals_count, stack_count);
69426942
let expected_shape = fun.push_insn(block, Insn::Const { val: Const::CShape(profiled_type.shape()) });
69436943
let test_id = fun.push_insn(block, Insn::IsBitEqual { left: shape, right: expected_shape });
69446944
fun.push_insn(block, Insn::IfTrue {
69456945
val: test_id,
69466946
target: BranchEdge {
6947-
target: get_field_block,
6947+
target: load_block,
69486948
args: state.as_args(self_param)
69496949
}
69506950
});
69516951

69526952
let ivar = if profiled_type.flags().is_embedded() {
69536953
// See ROBJECT_FIELDS() from include/ruby/internal/core/robject.h
69546954
let offset = ROBJECT_OFFSET_AS_ARY as i32 + (SIZEOF_VALUE * ivar_index.to_usize()) as i32;
6955-
fun.push_insn(get_field_block, Insn::LoadField { recv: self_val, id, offset, return_type: types::BasicObject })
6955+
fun.push_insn(load_block, Insn::LoadField { recv: load_block_self, id, offset, return_type: types::BasicObject })
69566956
} else {
6957-
let as_heap = fun.push_insn(get_field_block, Insn::LoadField { recv: self_val, id: ID!(_as_heap), offset: ROBJECT_OFFSET_AS_HEAP_FIELDS as i32, return_type: types::CPtr });
6957+
let as_heap = fun.push_insn(load_block, Insn::LoadField { recv: load_block_self, id: ID!(_as_heap), offset: ROBJECT_OFFSET_AS_HEAP_FIELDS as i32, return_type: types::CPtr });
69586958

69596959
let offset = SIZEOF_VALUE_I32 * ivar_index as i32;
6960-
fun.push_insn(get_field_block, Insn::LoadField { recv: as_heap, id, offset, return_type: types::BasicObject })
6960+
fun.push_insn(load_block, Insn::LoadField { recv: as_heap, id, offset, return_type: types::BasicObject })
69616961
};
69626962

69636963
get_field_state.stack_push(ivar);
6964-
fun.push_insn(get_field_block, Insn::Jump(BranchEdge {
6964+
fun.push_insn(load_block, Insn::Jump(BranchEdge {
69656965
target: join_block,
6966-
args: get_field_state.as_args(field_block_self),
6966+
args: get_field_state.as_args(load_block_self),
69676967
}));
69686968
}
69696969

zjit/src/hir/opt_tests.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3996,7 +3996,38 @@ mod hir_opt_tests {
39963996
b.test
39973997
a.test
39983998
");
3999-
assert_snapshot!(hir_string_proc("Tester.instance_method(:test)"), @r"");
3999+
assert_snapshot!(hir_string_proc("Tester.instance_method(:test)"), @r"
4000+
fn test@<compiled>:3:
4001+
bb0():
4002+
EntryPoint interpreter
4003+
v1:BasicObject = LoadSelf
4004+
Jump bb2(v1)
4005+
bb1(v4:BasicObject):
4006+
EntryPoint JIT(0)
4007+
Jump bb2(v4)
4008+
bb2(v6:BasicObject):
4009+
PatchPoint SingleRactorMode
4010+
v11:HeapBasicObject = GuardType v6, HeapBasicObject
4011+
v12:CShape = LoadField v11, :_shape_id@0x1000
4012+
v15:CShape[0x1001] = Const CShape(0x1001)
4013+
v16:CBool = IsBitEqual v12, v15
4014+
IfTrue v16, bb4(v6)
4015+
v22:CShape[0x1002] = Const CShape(0x1002)
4016+
v23:CBool = IsBitEqual v12, v22
4017+
IfTrue v23, bb5(v6)
4018+
IncrCounter getivar_fallback_not_monomorphic
4019+
v27:BasicObject = GetIvar v6, :@foo
4020+
Jump bb3(v6, v27)
4021+
bb4(v13:BasicObject):
4022+
v18:BasicObject = LoadField v13, :@foo@0x1003
4023+
Jump bb3(v13, v18)
4024+
bb5(v20:BasicObject):
4025+
v25:BasicObject = LoadField v20, :@foo@0x1004
4026+
Jump bb3(v20, v25)
4027+
bb3(v29:BasicObject, v30:BasicObject):
4028+
CheckInterrupts
4029+
Return v30
4030+
");
40004031
}
40014032

40024033
#[test]

0 commit comments

Comments
 (0)