@@ -4476,33 +4476,29 @@ static int zend_jit_update_regs(zend_jit_ctx *jit, uint32_t var, zend_jit_addr s
4476
4476
4477
4477
struct jit_observer_fcall_is_unobserved_data {
4478
4478
ir_ref if_unobserved;
4479
- ir_ref if_rt_cache;
4480
- ir_ref if_trampoline_or_generator;
4479
+ ir_ref ir_end_inputs;
4481
4480
};
4482
4481
4483
4482
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) {
4484
4483
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 };
4489
4485
if (func) {
4490
4486
ZEND_ASSERT((func->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE | ZEND_ACC_GENERATOR)) == 0);
4491
4487
} else {
4492
4488
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(
4494
4490
ir_LOAD_U32(ir_ADD_OFFSET(func_ref, offsetof(zend_function, common.fn_flags))),
4495
4491
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);
4497
4495
}
4498
4496
if (func && (func->common.fn_flags & ZEND_ACC_CLOSURE) == 0) {
4499
4497
if (ZEND_MAP_PTR_IS_OFFSET(func->common.run_time_cache)) {
4500
4498
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)));
4501
4499
} else {
4502
4500
ZEND_ASSERT(rx != IR_UNUSED);
4503
4501
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);
4506
4502
}
4507
4503
} else {
4508
4504
ZEND_ASSERT(rx != IR_UNUSED);
@@ -4513,25 +4509,31 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
4513
4509
4514
4510
ir_ref run_time_cache2 = ir_LOAD_A(ir_ADD_A(run_time_cache, ir_LOAD_A(jit_CG(map_ptr_base))));
4515
4511
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);
4517
4523
run_time_cache = ir_PHI_2(IR_ADDR, run_time_cache2, run_time_cache);
4518
4524
}
4519
4525
*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));
4521
4526
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)) );
4523
4528
ir_IF_FALSE(data.if_unobserved);
4524
4529
return data;
4525
4530
}
4526
4531
4527
4532
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);
4535
4537
}
4536
4538
4537
4539
static void jit_observer_fcall_begin(zend_jit_ctx *jit, ir_ref rx, ir_ref observer_handler) {
0 commit comments