Skip to content

Commit 2745053

Browse files
committed
Tracing JIT for FETCH_DIM_FUNC_ARG and FETCH_OBJ_FUNC_ARG when they are used in READ mode (to pass by value).
1 parent c59edf0 commit 2745053

File tree

2 files changed

+35
-29
lines changed

2 files changed

+35
-29
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3557,6 +3557,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
35573557
goto jit_failure;
35583558
}
35593559
goto done;
3560+
case ZEND_FETCH_DIM_FUNC_ARG:
3561+
if (!JIT_G(current_frame)
3562+
|| !JIT_G(current_frame)->call
3563+
|| !JIT_G(current_frame)->call->func
3564+
|| !TRACE_FRAME_IS_LAST_SEND_BY_VAL(JIT_G(current_frame)->call)) {
3565+
break;
3566+
}
3567+
/* break missing intentionally */
35603568
case ZEND_FETCH_DIM_R:
35613569
case ZEND_FETCH_DIM_IS:
35623570
op1_info = OP1_INFO();
@@ -3615,6 +3623,14 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
36153623
goto jit_failure;
36163624
}
36173625
goto done;
3626+
case ZEND_FETCH_OBJ_FUNC_ARG:
3627+
if (!JIT_G(current_frame)
3628+
|| !JIT_G(current_frame)->call
3629+
|| !JIT_G(current_frame)->call->func
3630+
|| !TRACE_FRAME_IS_LAST_SEND_BY_VAL(JIT_G(current_frame)->call)) {
3631+
break;
3632+
}
3633+
/* break missing intentionally */
36183634
case ZEND_FETCH_OBJ_R:
36193635
case ZEND_FETCH_OBJ_IS:
36203636
if (opline->op2_type != IS_CONST

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10020,7 +10020,7 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
1002010020
}
1002110021
}
1002210022
| GET_ZVAL_LVAL ZREG_FCARG1a, op1_addr
10023-
if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode == ZEND_FETCH_DIM_R) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, 8, 9)) {
10023+
if (!zend_jit_fetch_dimension_address_inner(Dst, opline, (opline->opcode != ZEND_FETCH_DIM_IS) ? BP_VAR_R : BP_VAR_IS, op1_info, op2_info, 8, 9)) {
1002410024
return 0;
1002510025
}
1002610026
}
@@ -10050,12 +10050,10 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
1005010050
| sub r4, 12
1005110051
| PUSH_ZVAL_ADDR res_addr, r0
1005210052
|.endif
10053-
if (opline->opcode == ZEND_FETCH_DIM_R) {
10053+
if (opline->opcode != ZEND_FETCH_DIM_IS) {
1005410054
| EXT_CALL zend_jit_fetch_dim_str_r_helper, r0
10055-
} else if (opline->opcode == ZEND_FETCH_DIM_IS) {
10056-
| EXT_CALL zend_jit_fetch_dim_str_is_helper, r0
1005710055
} else {
10058-
ZEND_ASSERT(0);
10056+
| EXT_CALL zend_jit_fetch_dim_str_is_helper, r0
1005910057
}
1006010058
|.if not(X64)
1006110059
| add r4, 12
@@ -10091,12 +10089,10 @@ static int zend_jit_fetch_dim_read(dasm_State **Dst, const zend_op *opline, cons
1009110089
| sub r4, 12
1009210090
| PUSH_ZVAL_ADDR res_addr, r0
1009310091
|.endif
10094-
if (opline->opcode == ZEND_FETCH_DIM_R) {
10092+
if (opline->opcode != ZEND_FETCH_DIM_IS) {
1009510093
| EXT_CALL zend_jit_fetch_dim_obj_r_helper, r0
10096-
} else if (opline->opcode == ZEND_FETCH_DIM_IS) {
10097-
| EXT_CALL zend_jit_fetch_dim_obj_is_helper, r0
1009810094
} else {
10099-
ZEND_ASSERT(0);
10095+
| EXT_CALL zend_jit_fetch_dim_obj_is_helper, r0
1010010096
}
1010110097
|.if not(X64)
1010210098
| add r4, 12
@@ -10781,9 +10777,7 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
1078110777
}
1078210778
| GET_ZVAL_PTR r0, prop_addr
1078310779
| IF_NOT_REFCOUNTED dh, >2
10784-
if (opline->opcode == ZEND_FETCH_OBJ_R || opline->opcode == ZEND_FETCH_OBJ_IS) {
10785-
| IF_TYPE dl, IS_REFERENCE, >6
10786-
}
10780+
| IF_TYPE dl, IS_REFERENCE, >6
1078710781
|1:
1078810782
| GC_ADDREF r0
1078910783
|2:
@@ -10808,33 +10802,29 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
1080810802
| PUSH_ZVAL_ADDR res_addr, r0
1080910803
|.endif
1081010804
| SAVE_VALID_OPLINE opline, r0
10811-
if (opline->opcode == ZEND_FETCH_OBJ_R) {
10805+
if (opline->opcode != ZEND_FETCH_OBJ_IS) {
1081210806
| EXT_CALL zend_jit_fetch_obj_r_slow, r0
10813-
} else if (opline->opcode == ZEND_FETCH_OBJ_IS) {
10814-
| EXT_CALL zend_jit_fetch_obj_is_slow, r0
1081510807
} else {
10816-
ZEND_ASSERT(0);
10808+
| EXT_CALL zend_jit_fetch_obj_is_slow, r0
1081710809
}
1081810810
|.if not(X64)
1081910811
| add r4, 8
1082010812
|.endif
1082110813
| jmp >9
1082210814

10823-
if (opline->opcode == ZEND_FETCH_OBJ_R || opline->opcode == ZEND_FETCH_OBJ_IS) {
10824-
|6:
10825-
if (offset == ZEND_WRONG_PROPERTY_OFFSET) {
10826-
| mov FCARG2a, FCARG1a
10827-
} else {
10828-
| lea FCARG2a, [FCARG1a + offset]
10829-
}
10830-
| LOAD_ZVAL_ADDR FCARG1a, res_addr
10831-
| EXT_CALL zend_jit_zval_copy_deref_helper, r0
10832-
| jmp >9
10815+
|6:
10816+
if (offset == ZEND_WRONG_PROPERTY_OFFSET) {
10817+
| mov FCARG2a, FCARG1a
10818+
} else {
10819+
| lea FCARG2a, [FCARG1a + offset]
1083310820
}
10821+
| LOAD_ZVAL_ADDR FCARG1a, res_addr
10822+
| EXT_CALL zend_jit_zval_copy_deref_helper, r0
10823+
| jmp >9
1083410824

1083510825
if ((op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)- MAY_BE_OBJECT)) && JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE) {
1083610826
|7:
10837-
if (opline->opcode == ZEND_FETCH_OBJ_R) {
10827+
if (opline->opcode != ZEND_FETCH_OBJ_IS) {
1083810828
| SAVE_VALID_OPLINE opline, r1
1083910829
if (op1_info & MAY_BE_UNDEF) {
1084010830
if (op1_info & MAY_BE_ANY) {
@@ -10870,9 +10860,9 @@ static int zend_jit_fetch_obj_read(dasm_State **Dst, const zend_op *opline, cons
1087010860
| PUSH_ADDR member, r0
1087110861
|.endif
1087210862
| SAVE_VALID_OPLINE opline, r0
10873-
if (opline->opcode == ZEND_FETCH_OBJ_R) {
10863+
if (opline->opcode != ZEND_FETCH_OBJ_IS) {
1087410864
| EXT_CALL zend_jit_fetch_obj_r_dynamic, r0
10875-
} else if (opline->opcode == ZEND_FETCH_OBJ_IS) {
10865+
} else {
1087610866
| EXT_CALL zend_jit_fetch_obj_is_dynamic, r0
1087710867
}
1087810868
|.if not(X64)

0 commit comments

Comments
 (0)