Skip to content

Commit 7107e03

Browse files
committed
Handle NULL run_time_cache correctly
1 parent f666de4 commit 7107e03

File tree

1 file changed

+22
-20
lines changed

1 file changed

+22
-20
lines changed

ext/opcache/jit/zend_jit_ir.c

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4476,33 +4476,29 @@ static int zend_jit_update_regs(zend_jit_ctx *jit, uint32_t var, zend_jit_addr s
44764476

44774477
struct jit_observer_fcall_is_unobserved_data {
44784478
ir_ref if_unobserved;
4479-
ir_ref if_rt_cache;
4480-
ir_ref if_trampoline_or_generator;
4479+
ir_ref ir_end_inputs;
44814480
};
44824481

44834482
static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobserved_start(zend_jit_ctx *jit, const zend_function *func, ir_ref *observer_handler, ir_ref rx, ir_ref func_ref) {
44844483
ir_ref run_time_cache;
4485-
struct jit_observer_fcall_is_unobserved_data data = {
4486-
.if_rt_cache = IS_UNUSED,
4487-
.if_trampoline_or_generator = IS_UNUSED,
4488-
};
4484+
struct jit_observer_fcall_is_unobserved_data data = { .ir_end_inputs = IR_UNUSED };
44894485
if (func) {
44904486
ZEND_ASSERT((func->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE | ZEND_ACC_GENERATOR)) == 0);
44914487
} else {
44924488
ZEND_ASSERT(rx != IR_UNUSED);
4493-
data.if_trampoline_or_generator = ir_IF(ir_AND_U32(
4489+
ir_ref if_trampoline_or_generator = ir_IF(ir_AND_U32(
44944490
ir_LOAD_U32(ir_ADD_OFFSET(func_ref, offsetof(zend_function, common.fn_flags))),
44954491
ir_CONST_U32(ZEND_ACC_CALL_VIA_TRAMPOLINE | ZEND_ACC_GENERATOR)));
4496-
ir_IF_FALSE(data.if_trampoline_or_generator);
4492+
ir_IF_TRUE(if_trampoline_or_generator);
4493+
ir_END_list(data.ir_end_inputs);
4494+
ir_IF_FALSE(if_trampoline_or_generator);
44974495
}
44984496
if (func && (func->common.fn_flags & ZEND_ACC_CLOSURE) == 0) {
44994497
if (ZEND_MAP_PTR_IS_OFFSET(func->common.run_time_cache)) {
45004498
run_time_cache = ir_LOAD_A(ir_ADD_OFFSET(ir_LOAD_A(jit_CG(map_ptr_base)), (uintptr_t)ZEND_MAP_PTR(func->common.run_time_cache)));
45014499
} else {
45024500
ZEND_ASSERT(rx != IR_UNUSED);
45034501
run_time_cache = ir_LOAD_A(ir_ADD_OFFSET(func_ref ? func_ref : ir_CONST_ADDR(func), offsetof(zend_op_array, run_time_cache__ptr)));
4504-
data.if_rt_cache = ir_IF(ir_NE(run_time_cache, IR_NULL));
4505-
ir_IF_TRUE(data.if_rt_cache);
45064502
}
45074503
} else {
45084504
ZEND_ASSERT(rx != IR_UNUSED);
@@ -4513,25 +4509,31 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
45134509

45144510
ir_ref run_time_cache2 = ir_LOAD_A(ir_ADD_A(run_time_cache, ir_LOAD_A(jit_CG(map_ptr_base))));
45154511

4516-
ir_MERGE_WITH_EMPTY_FALSE(if_odd);
4512+
ir_ref if_odd_end = ir_END();
4513+
ir_IF_FALSE(if_odd);
4514+
4515+
if (!func) { // not a closure
4516+
ir_ref if_rt_cache = ir_IF(ir_EQ(run_time_cache, IR_NULL));
4517+
ir_IF_TRUE(if_rt_cache);
4518+
ir_END_list(data.ir_end_inputs);
4519+
ir_IF_FALSE(if_rt_cache);
4520+
}
4521+
4522+
ir_MERGE_WITH(if_odd_end);
45174523
run_time_cache = ir_PHI_2(IR_ADDR, run_time_cache2, run_time_cache);
45184524
}
45194525
*observer_handler = ir_ADD_OFFSET(run_time_cache, zend_observer_fcall_op_array_extension * sizeof(void *));
4520-
ir_ref is_unobserved = ir_EQ(ir_LOAD_A(*observer_handler), ir_CONST_ADDR(ZEND_OBSERVER_NONE_OBSERVED));
45214526

4522-
data.if_unobserved = ir_IF(is_unobserved);
4527+
data.if_unobserved = ir_IF(ir_EQ(ir_LOAD_A(*observer_handler), ir_CONST_ADDR(ZEND_OBSERVER_NONE_OBSERVED)));
45234528
ir_IF_FALSE(data.if_unobserved);
45244529
return data;
45254530
}
45264531

45274532
static void jit_observer_fcall_is_unobserved_end(zend_jit_ctx *jit, struct jit_observer_fcall_is_unobserved_data *data) {
4528-
if (data->if_rt_cache != IR_UNUSED) {
4529-
ir_MERGE_WITH_EMPTY_FALSE(data->if_rt_cache);
4530-
}
4531-
if (data->if_trampoline_or_generator != IR_UNUSED) {
4532-
ir_MERGE_WITH_EMPTY_TRUE(data->if_trampoline_or_generator);
4533-
}
4534-
ir_MERGE_WITH_EMPTY_TRUE(data->if_unobserved);
4533+
ir_END_list(data->ir_end_inputs);
4534+
ir_IF_TRUE(data->if_unobserved);
4535+
ir_END_list(data->ir_end_inputs);
4536+
ir_MERGE_list(data->ir_end_inputs);
45354537
}
45364538

45374539
static void jit_observer_fcall_begin(zend_jit_ctx *jit, ir_ref rx, ir_ref observer_handler) {

0 commit comments

Comments
 (0)