@@ -1885,7 +1885,6 @@ static void zend_jit_check_timeout(zend_jit_ctx *jit, const zend_op *opline, con
1885
1885
1886
1886
ir_IF_TRUE_cold(if_timeout);
1887
1887
jit_LOAD_IP_ADDR(jit, opline);
1888
- ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
1889
1888
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_interrupt_handler));
1890
1889
ir_IF_FALSE(if_timeout);
1891
1890
}
@@ -2012,7 +2011,7 @@ static int zend_jit_interrupt_handler_stub(zend_jit_ctx *jit)
2012
2011
if (GCC_GLOBAL_REGS) {
2013
2012
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2014
2013
} else {
2015
- ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
2014
+ ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
2016
2015
}
2017
2016
return 1;
2018
2017
}
@@ -2207,13 +2206,13 @@ static int zend_jit_leave_throw_stub(zend_jit_ctx *jit)
2207
2206
// JIT: opline = EG(exception_op);
2208
2207
jit_LOAD_IP(jit, jit_EG(exception_op));
2209
2208
2210
- ir_STORE(jit_EX(opline), jit_IP(jit));
2211
-
2212
2209
if (GCC_GLOBAL_REGS) {
2210
+ ir_STORE(jit_EX(opline), jit_IP(jit));
2211
+
2213
2212
// JIT: HANDLE_EXCEPTION()
2214
2213
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler));
2215
2214
} else {
2216
- ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_LEAVE
2215
+ ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_LEAVE
2217
2216
}
2218
2217
2219
2218
return 1;
@@ -2408,8 +2407,8 @@ static int zend_jit_trace_escape_stub(zend_jit_ctx *jit)
2408
2407
if (GCC_GLOBAL_REGS) {
2409
2408
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2410
2409
} else {
2411
- ir_STORE(jit_EX(opline), jit_IP(jit)); // TODO: do we need this ?
2412
- ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
2410
+ // TODO: tailcall ?
2411
+ ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
2413
2412
}
2414
2413
2415
2414
return 1;
@@ -2435,7 +2434,8 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
2435
2434
jit_STORE_IP(jit, ref);
2436
2435
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
2437
2436
} else {
2438
- ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2437
+ ref = ir_LOAD_A(jit_EX(opline));
2438
+ ir_RETURN(ir_NEG_A(ref)); // ZEND_VM_ENTER
2439
2439
}
2440
2440
2441
2441
ir_IF_FALSE(if_zero);
@@ -2458,9 +2458,13 @@ static int zend_jit_trace_exit_stub(zend_jit_ctx *jit)
2458
2458
#if defined(IR_TARGET_X86)
2459
2459
addr = ir_CAST_FC_FUNC(addr);
2460
2460
#endif
2461
- ir_CALL_2(IR_ADDR, addr, jit_FP(jit), jit_IP(jit));
2462
- ir_GUARD(ir_GT(ref, ir_CONST_I32(0)), jit_STUB_ADDR(jit, jit_stub_trace_halt));
2463
- ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
2461
+ ref = ir_CALL_2(IR_ADDR, addr, jit_FP(jit), jit_IP(jit));
2462
+ // Force reload execute_ex in VM
2463
+ ir_ref is_positive = ir_IF(ir_GE(ref, ir_CONST_I32(0)));
2464
+ ir_IF_TRUE(is_positive);
2465
+ ir_RETURN(ir_NEG_A(ref)); // ZEND_VM_ENTER
2466
+ ir_IF_FALSE(is_positive);
2467
+ ir_RETURN(ref);
2464
2468
}
2465
2469
2466
2470
return 1;
@@ -4209,8 +4213,13 @@ static int zend_jit_tail_handler(zend_jit_ctx *jit, const zend_op *opline)
4209
4213
|| opline->opcode == ZEND_MATCH_ERROR
4210
4214
|| opline->opcode == ZEND_THROW
4211
4215
|| opline->opcode == ZEND_VERIFY_NEVER_TYPE)) {
4212
- ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4213
- ir_RETURN(ir_CONST_ADDR(-1)); // ZEND_VM_ENTER
4216
+ ir_ref ip = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4217
+ // Force reload execute_ex in VM (TODO: check if we actually need this)
4218
+ ir_ref is_positive = ir_IF(ir_GE(ip, ir_CONST_I32(0)));
4219
+ ir_IF_TRUE(is_positive);
4220
+ ir_RETURN(ir_NEG_A(ip)); // ZEND_VM_ENTER
4221
+ ir_IF_FALSE(is_positive);
4222
+ ir_RETURN(ip);
4214
4223
} else {
4215
4224
ir_TAILCALL_2(IR_ADDR, ir_CONST_FC_FUNC(handler), jit_FP(jit), jit_IP(jit));
4216
4225
}
@@ -7968,7 +7977,6 @@ static int zend_jit_escape_if_undef(zend_jit_ctx *jit, int var, uint32_t flags,
7968
7977
}
7969
7978
7970
7979
jit_LOAD_IP_ADDR(jit, opline - 1);
7971
- ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline));
7972
7980
ir_IJMP(jit_STUB_ADDR(jit, jit_stub_trace_escape));
7973
7981
7974
7982
ir_IF_TRUE(if_def);
@@ -10228,7 +10236,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10228
10236
}
10229
10237
if (zend_accel_in_shm(func->op_array.opcodes)) {
10230
10238
jit_LOAD_IP_ADDR(jit, func->op_array.opcodes + num_args);
10231
- ir_STORE(jit_EX(opline), ir_CONST_ADDR(func->op_array.opcodes + num_args));
10232
10239
} else {
10233
10240
if (!func_ref) {
10234
10241
func_ref = ir_LOAD_A(jit_CALL(rx, func));
@@ -10238,7 +10245,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10238
10245
ip = ir_ADD_OFFSET(ip, num_args * sizeof(zend_op));
10239
10246
}
10240
10247
jit_LOAD_IP(jit, ip);
10241
- ir_STORE(jit_EX(opline), ip);
10242
10248
}
10243
10249
10244
10250
if (!trace && op_array == &func->op_array && call_num_args >= op_array->required_num_args) {
@@ -10261,7 +10267,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10261
10267
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
10262
10268
}
10263
10269
jit_LOAD_IP(jit, ip);
10264
- ir_STORE(jit_EX(opline), ip);
10265
10270
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper);
10266
10271
} else {
10267
10272
helper = ir_CONST_FC_FUNC(zend_jit_copy_extra_args_helper_no_skip_recv);
@@ -10286,7 +10291,6 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10286
10291
ip = ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes)));
10287
10292
}
10288
10293
jit_LOAD_IP(jit, ip);
10289
- ir_STORE(jit_EX(opline), ip);
10290
10294
10291
10295
// JIT: num_args = EX_NUM_ARGS();
10292
10296
ir_ref num_args, first_extra_arg;
@@ -10444,7 +10448,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10444
10448
if (GCC_GLOBAL_REGS) {
10445
10449
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
10446
10450
} else {
10447
- ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_ENTER
10451
+ ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_ENTER
10448
10452
}
10449
10453
} while (0);
10450
10454
@@ -10678,12 +10682,10 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
10678
10682
10679
10683
if ((!trace || !func) && opline->opcode != ZEND_DO_ICALL) {
10680
10684
jit_LOAD_IP_ADDR(jit, opline + 1);
10681
- ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
10682
10685
} else if (trace
10683
10686
&& trace->op == ZEND_JIT_TRACE_END
10684
10687
&& trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
10685
10688
jit_LOAD_IP_ADDR(jit, opline + 1);
10686
- ir_STORE(jit_EX(opline), ir_CONST_ADDR(opline + 1));
10687
10689
}
10688
10690
}
10689
10691
@@ -11214,7 +11216,7 @@ static int zend_jit_leave_func(zend_jit_ctx *jit,
11214
11216
if (GCC_GLOBAL_REGS) {
11215
11217
ir_TAILCALL(IR_VOID, ir_LOAD_A(jit_IP(jit)));
11216
11218
} else {
11217
- ir_RETURN(ir_CONST_ADDR(-1 )); // ZEND_VM_LEAVE
11219
+ ir_RETURN(ir_NEG_A(jit_IP(jit) )); // ZEND_VM_LEAVE
11218
11220
}
11219
11221
11220
11222
jit->b = -1;
@@ -17344,7 +17346,7 @@ static int zend_jit_trace_return(zend_jit_ctx *jit, bool original_handler, const
17344
17346
return 1;
17345
17347
}
17346
17348
}
17347
- ir_RETURN(ir_CONST_ADDR(-1)) ; // ZEND_VM_LEAVE
17349
+ ir_RETURN(ir_NEG_A(jit_IP(jit))) ; // ZEND_VM_RETURN
17348
17350
}
17349
17351
return 1;
17350
17352
}
0 commit comments