@@ -1340,11 +1340,12 @@ static void* dasm_labels[zend_lb_MAX];
13401340
13411341|.macro SET_EX_OPLINE, op, tmp_reg
13421342|| if (op == last_valid_opline) {
1343+ || zend_jit_use_last_valid_opline();
13431344| SAVE_IP
13441345|| } else {
13451346| ADDR_OP2_2 mov, aword EX->opline, op, tmp_reg
13461347|| if (!GCC_GLOBAL_REGS) {
1347- || last_valid_opline = NULL ;
1348+ || zend_jit_reset_last_valid_opline() ;
13481349|| }
13491350|| }
13501351|.endmacro
@@ -1578,6 +1579,7 @@ static void* dasm_labels[zend_lb_MAX];
15781579
15791580|.macro UNDEFINED_OFFSET, opline
15801581|| if (opline == last_valid_opline) {
1582+ || zend_jit_use_last_valid_opline();
15811583| call ->undefined_offset_ex
15821584|| } else {
15831585| SET_EX_OPLINE opline, r0
@@ -1587,6 +1589,7 @@ static void* dasm_labels[zend_lb_MAX];
15871589
15881590|.macro UNDEFINED_INDEX, opline
15891591|| if (opline == last_valid_opline) {
1592+ || zend_jit_use_last_valid_opline();
15901593| call ->undefined_index_ex
15911594|| } else {
15921595| SET_EX_OPLINE opline, r0
@@ -1596,38 +1599,64 @@ static void* dasm_labels[zend_lb_MAX];
15961599
15971600|.macro CANNOT_ADD_ELEMENT, opline
15981601|| if (opline == last_valid_opline) {
1602+ || zend_jit_use_last_valid_opline();
15991603| call ->cannot_add_element_ex
16001604|| } else {
16011605| SET_EX_OPLINE opline, r0
16021606| call ->cannot_add_element
16031607|| }
16041608|.endmacro
16051609
1606- static zend_bool reuse_ip;
1607- static zend_bool delayed_call_chain;
1608- static uint32_t delayed_call_level;
1609- static const zend_op *last_valid_opline;
1610- static int jit_return_label;
1611- static uint32_t current_trace_num;
1610+ static zend_bool reuse_ip = 0;
1611+ static zend_bool delayed_call_chain = 0;
1612+ static uint32_t delayed_call_level = 0;
1613+ static const zend_op *last_valid_opline = NULL;
1614+ static zend_bool use_last_vald_opline = 0;
1615+ static zend_bool track_last_valid_opline = 0;
1616+ static int jit_return_label = -1;
1617+ static uint32_t current_trace_num = 0;
1618+
1619+ static void zend_jit_track_last_valid_opline(void)
1620+ {
1621+ use_last_vald_opline = 0;
1622+ track_last_valid_opline = 1;
1623+ }
1624+
1625+ static void zend_jit_use_last_valid_opline(void)
1626+ {
1627+ if (track_last_valid_opline) {
1628+ use_last_vald_opline = 1;
1629+ track_last_valid_opline = 0;
1630+ }
1631+ }
1632+
1633+ static zend_bool zend_jit_trace_uses_initial_ip(void)
1634+ {
1635+ return use_last_vald_opline;
1636+ }
16121637
16131638static void zend_jit_set_last_valid_opline(const zend_op *target_opline)
16141639{
16151640 if (!reuse_ip) {
1641+ track_last_valid_opline = 0;
16161642 last_valid_opline = target_opline;
16171643 }
16181644}
16191645
16201646static void zend_jit_reset_last_valid_opline(void)
16211647{
1648+ track_last_valid_opline = 0;
16221649 last_valid_opline = NULL;
16231650}
16241651
1625- static void zend_jit_start_reuse_ip(void) {
1626- last_valid_opline = NULL;
1652+ static void zend_jit_start_reuse_ip(void)
1653+ {
1654+ zend_jit_reset_last_valid_opline();
16271655 reuse_ip = 1;
16281656}
16291657
1630- static void zend_jit_stop_reuse_ip(void) {
1658+ static void zend_jit_stop_reuse_ip(void)
1659+ {
16311660 reuse_ip = 0;
16321661}
16331662
@@ -2804,6 +2833,8 @@ static int zend_jit_align_func(dasm_State **Dst)
28042833 reuse_ip = 0;
28052834 delayed_call_chain = 0;
28062835 last_valid_opline = NULL;
2836+ use_last_vald_opline = 0;
2837+ track_last_valid_opline = 0;
28072838 jit_return_label = -1;
28082839 |.align 16
28092840 return 1;
@@ -2849,16 +2880,15 @@ static int zend_jit_save_call_chain(dasm_State **Dst, uint32_t call_level)
28492880
28502881static int zend_jit_set_ip(dasm_State **Dst, const zend_op *opline)
28512882{
2852- if (!last_valid_opline) {
2883+ if (last_valid_opline == opline) {
2884+ zend_jit_use_last_valid_opline();
2885+ } else if (GCC_GLOBAL_REGS && last_valid_opline) {
2886+ zend_jit_use_last_valid_opline();
2887+ | ADD_IP (opline - last_valid_opline) * sizeof(zend_op);
2888+ } else {
28532889 | LOAD_IP_ADDR opline
2854- } else if (last_valid_opline != opline) {
2855- if (GCC_GLOBAL_REGS) {
2856- | ADD_IP (opline - last_valid_opline) * sizeof(zend_op);
2857- } else {
2858- | LOAD_IP_ADDR opline
2859- }
28602890 }
2861- last_valid_opline = opline;
2891+ zend_jit_set_last_valid_opline( opline) ;
28622892
28632893 return 1;
28642894}
@@ -2890,6 +2920,7 @@ static int zend_jit_check_timeout(dasm_State **Dst, const zend_op *opline, const
28902920 if (exit_addr) {
28912921 | jne &exit_addr
28922922 } else if (last_valid_opline == opline) {
2923+ || zend_jit_use_last_valid_opline();
28932924 | jne ->interrupt_handler
28942925 } else {
28952926 | jne >1
@@ -3154,7 +3185,7 @@ static int zend_jit_link_side_trace(const void *code, size_t size, uint32_t jmp_
31543185 return zend_jit_patch(code, size, jmp_table_size, zend_jit_trace_get_exit_addr(exit_num), addr);
31553186}
31563187
3157- static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t, zend_bool check_interrupt )
3188+ static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t, const void *timeout_exit_addr )
31583189{
31593190 const void *link_addr;
31603191 size_t prologue_size;
@@ -3188,11 +3219,11 @@ static int zend_jit_trace_link_to_root(dasm_State **Dst, zend_jit_trace_info *t,
31883219 }
31893220 link_addr = (const void*)((const char*)t->code_start + prologue_size);
31903221
3191- if (check_interrupt ) {
3222+ if (timeout_exit_addr ) {
31923223 /* Check timeout for links to LOOP */
31933224 | MEM_OP2_1_ZTS cmp, byte, executor_globals, vm_interrupt, 0, r0
31943225 | je &link_addr
3195- | jmp ->interrupt_handler
3226+ | jmp &timeout_exit_addr
31963227 } else {
31973228 | jmp &link_addr
31983229 }
0 commit comments