Skip to content

Commit af275e6

Browse files
committed
ext/opcache/jit/zend_jit_trace: cache ZEND_OP_TRACE_INFO() in variable
Eliminates a few redundant memory reads.
1 parent 7057d9c commit af275e6

File tree

2 files changed

+43
-31
lines changed

2 files changed

+43
-31
lines changed

ext/opcache/jit/zend_jit_trace.c

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3471,15 +3471,16 @@ static void zend_jit_trace_clenup_stack(zend_jit_trace_stack *stack, const zend_
34713471
static void zend_jit_trace_setup_ret_counter(const zend_op *opline, size_t offset)
34723472
{
34733473
zend_op *next_opline = (zend_op*)(opline + 1);
3474+
zend_op_trace_info *const next_trace_info = ZEND_OP_TRACE_INFO(next_opline, offset);
34743475

3475-
if (JIT_G(hot_return) && !ZEND_OP_TRACE_INFO(next_opline, offset)->trace_flags) {
3476+
if (JIT_G(hot_return) && !next_trace_info->trace_flags) {
34763477
ZEND_ASSERT(zend_jit_ret_trace_counter_handler != NULL);
3477-
if (!ZEND_OP_TRACE_INFO(next_opline, offset)->counter) {
3478-
ZEND_OP_TRACE_INFO(next_opline, offset)->counter =
3478+
if (!next_trace_info->counter) {
3479+
next_trace_info->counter =
34793480
&zend_jit_hot_counters[ZEND_JIT_COUNTER_NUM];
34803481
ZEND_JIT_COUNTER_NUM = (ZEND_JIT_COUNTER_NUM + 1) % ZEND_HOT_COUNTERS_COUNT;
34813482
}
3482-
ZEND_OP_TRACE_INFO(next_opline, offset)->trace_flags = ZEND_JIT_TRACE_START_RETURN;
3483+
next_trace_info->trace_flags = ZEND_JIT_TRACE_START_RETURN;
34833484
next_opline->handler = (const void*)zend_jit_ret_trace_counter_handler;
34843485
}
34853486
}
@@ -7033,8 +7034,10 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
70337034

70347035
zend_shared_alloc_lock();
70357036

7037+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, offset);
7038+
70367039
/* Checks under lock */
7037-
if ((ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & ZEND_JIT_TRACE_JITED)) {
7040+
if ((trace_info->trace_flags & ZEND_JIT_TRACE_JITED)) {
70387041
ret = ZEND_JIT_TRACE_STOP_ALREADY_DONE;
70397042
} else if (ZEND_JIT_TRACE_NUM >= JIT_G(max_root_traces)) {
70407043
ret = ZEND_JIT_TRACE_STOP_TOO_MANY_TRACES;
@@ -7106,7 +7109,7 @@ static zend_jit_trace_stop zend_jit_compile_root_trace(zend_jit_trace_rec *trace
71067109
((zend_op*)opline)->handler = handler;
71077110

71087111
ZEND_JIT_TRACE_NUM++;
7109-
ZEND_OP_TRACE_INFO(opline, offset)->trace_flags |= ZEND_JIT_TRACE_JITED;
7112+
trace_info->trace_flags |= ZEND_JIT_TRACE_JITED;
71107113

71117114
ret = ZEND_JIT_TRACE_STOP_COMPILED;
71127115
} else if (t->exit_count >= ZEND_JIT_TRACE_MAX_EXITS ||
@@ -7223,14 +7226,16 @@ static void zend_jit_blacklist_root_trace(const zend_op *opline, size_t offset)
72237226
{
72247227
zend_shared_alloc_lock();
72257228

7226-
if (!(ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & ZEND_JIT_TRACE_BLACKLISTED)) {
7229+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, offset);
7230+
7231+
if (!(trace_info->trace_flags & ZEND_JIT_TRACE_BLACKLISTED)) {
72277232
SHM_UNPROTECT();
72287233
zend_jit_unprotect();
72297234

72307235
((zend_op*)opline)->handler =
7231-
ZEND_OP_TRACE_INFO(opline, offset)->orig_handler;
7236+
trace_info->orig_handler;
72327237

7233-
ZEND_OP_TRACE_INFO(opline, offset)->trace_flags |= ZEND_JIT_TRACE_BLACKLISTED;
7238+
trace_info->trace_flags |= ZEND_JIT_TRACE_BLACKLISTED;
72347239

72357240
zend_jit_protect();
72367241
SHM_PROTECT();
@@ -7254,8 +7259,9 @@ static bool zend_jit_trace_is_bad_root(const zend_op *opline, zend_jit_trace_sto
72547259
return true;
72557260
} else {
72567261
#if 0
7257-
if (ZEND_OP_TRACE_INFO(opline, offset)->counter) {
7258-
*ZEND_OP_TRACE_INFO(opline, offset)->counter =
7262+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, offset);
7263+
if (trace_info->counter) {
7264+
*trace_info->counter =
72597265
random() % ZEND_JIT_TRACE_COUNTER_MAX;
72607266
}
72617267
#endif
@@ -7575,20 +7581,22 @@ int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const
75757581

75767582
EX(opline) = opline;
75777583

7584+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, offset);
7585+
75787586
/* Lock-free check if the root trace was already JIT-ed or blacklist-ed in another process */
7579-
if (ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & (ZEND_JIT_TRACE_JITED|ZEND_JIT_TRACE_BLACKLISTED)) {
7587+
if (trace_info->trace_flags & (ZEND_JIT_TRACE_JITED|ZEND_JIT_TRACE_BLACKLISTED)) {
75807588
return 0;
75817589
}
75827590

75837591
if (JIT_G(tracing)) {
7584-
++(*ZEND_OP_TRACE_INFO(opline, offset)->counter);
7592+
++(*trace_info->counter);
75857593
return 0;
75867594
}
75877595

75887596
if (JIT_G(debug) & ZEND_JIT_DEBUG_TRACE_START) {
75897597
fprintf(stderr, "---- TRACE %d start (%s) %s%s%s() %s:%d\n",
75907598
trace_num,
7591-
zend_jit_trace_star_desc(ZEND_OP_TRACE_INFO(opline, offset)->trace_flags),
7599+
zend_jit_trace_star_desc(trace_info->trace_flags),
75927600
EX(func)->op_array.scope ? ZSTR_VAL(EX(func)->op_array.scope->name) : "",
75937601
EX(func)->op_array.scope ? "::" : "",
75947602
EX(func)->op_array.function_name ?
@@ -7605,7 +7613,7 @@ int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const
76057613

76067614
JIT_G(tracing) = true;
76077615
stop = zend_jit_trace_execute(execute_data, opline, trace_buffer,
7608-
ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & ZEND_JIT_TRACE_START_MASK, 0);
7616+
trace_info->trace_flags & ZEND_JIT_TRACE_START_MASK, 0);
76097617
JIT_G(tracing) = false;
76107618

76117619
if (stop & ZEND_JIT_TRACE_HALT) {
@@ -8195,14 +8203,15 @@ static int ZEND_FASTCALL zend_jit_trace_exit(uint32_t exit_num, zend_jit_registe
81958203
zend_jit_unprotect();
81968204

81978205
jit_extension = (zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(t->op_array);
8198-
if (ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_START_LOOP) {
8206+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset);
8207+
if (trace_info->trace_flags & ZEND_JIT_TRACE_START_LOOP) {
81998208
((zend_op*)(t->opline))->handler = (const void*)zend_jit_loop_trace_counter_handler;
8200-
} else if (ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_START_ENTER) {
8209+
} else if (trace_info->trace_flags & ZEND_JIT_TRACE_START_ENTER) {
82018210
((zend_op*)(t->opline))->handler = (const void*)zend_jit_func_trace_counter_handler;
8202-
} else if (ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_START_RETURN) {
8211+
} else if (trace_info->trace_flags & ZEND_JIT_TRACE_START_RETURN) {
82038212
((zend_op*)(t->opline))->handler = (const void*)zend_jit_ret_trace_counter_handler;
82048213
}
8205-
ZEND_OP_TRACE_INFO(t->opline, jit_extension->offset)->trace_flags &=
8214+
trace_info->trace_flags &=
82068215
ZEND_JIT_TRACE_START_LOOP|ZEND_JIT_TRACE_START_ENTER|ZEND_JIT_TRACE_START_RETURN;
82078216

82088217
zend_jit_protect();
@@ -8299,14 +8308,15 @@ static int zend_jit_setup_hot_trace_counters(zend_op_array *op_array)
82998308
if (cfg.blocks[i].flags & ZEND_BB_LOOP_HEADER) {
83008309
/* loop header */
83018310
opline = op_array->opcodes + cfg.blocks[i].start;
8302-
if (!(ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->trace_flags & ZEND_JIT_TRACE_UNSUPPORTED)) {
8311+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, jit_extension->offset);
8312+
if (!(trace_info->trace_flags & ZEND_JIT_TRACE_UNSUPPORTED)) {
83038313
opline->handler = (const void*)zend_jit_loop_trace_counter_handler;
8304-
if (!ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->counter) {
8305-
ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->counter =
8314+
if (!trace_info->counter) {
8315+
trace_info->counter =
83068316
&zend_jit_hot_counters[ZEND_JIT_COUNTER_NUM];
83078317
ZEND_JIT_COUNTER_NUM = (ZEND_JIT_COUNTER_NUM + 1) % ZEND_HOT_COUNTERS_COUNT;
83088318
}
8309-
ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->trace_flags |=
8319+
trace_info->trace_flags |=
83108320
ZEND_JIT_TRACE_START_LOOP;
83118321
}
83128322
}
@@ -8323,13 +8333,14 @@ static int zend_jit_setup_hot_trace_counters(zend_op_array *op_array)
83238333
}
83248334
}
83258335

8326-
if (!ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->trace_flags) {
8336+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, jit_extension->offset);
8337+
if (!trace_info->trace_flags) {
83278338
/* function entry */
83288339
opline->handler = (const void*)zend_jit_func_trace_counter_handler;
8329-
ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->counter =
8340+
trace_info->counter =
83308341
&zend_jit_hot_counters[ZEND_JIT_COUNTER_NUM];
83318342
ZEND_JIT_COUNTER_NUM = (ZEND_JIT_COUNTER_NUM + 1) % ZEND_HOT_COUNTERS_COUNT;
8332-
ZEND_OP_TRACE_INFO(opline, jit_extension->offset)->trace_flags |=
8343+
trace_info->trace_flags |=
83338344
ZEND_JIT_TRACE_START_ENTER;
83348345
}
83358346
}

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -308,15 +308,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_trace_c
308308
{
309309
zend_jit_op_array_trace_extension *jit_extension =
310310
(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&EX(func)->op_array);
311-
size_t offset = jit_extension->offset;
312311
#ifndef HAVE_GCC_GLOBAL_REGS
313312
const zend_op *opline = EX(opline);
314313
#endif
315314

316-
*(ZEND_OP_TRACE_INFO(opline, offset)->counter) -= cost;
315+
zend_op_trace_info *const trace_info = ZEND_OP_TRACE_INFO(opline, jit_extension->offset);
317316

318-
if (UNEXPECTED(*(ZEND_OP_TRACE_INFO(opline, offset)->counter) <= 0)) {
319-
*(ZEND_OP_TRACE_INFO(opline, offset)->counter) = ZEND_JIT_COUNTER_INIT;
317+
*(trace_info->counter) -= cost;
318+
319+
if (UNEXPECTED(*(trace_info->counter) <= 0)) {
320+
*(trace_info->counter) = ZEND_JIT_COUNTER_INIT;
320321
if (UNEXPECTED(zend_jit_trace_hot_root(execute_data, opline) < 0)) {
321322
#ifdef HAVE_GCC_GLOBAL_REGS
322323
opline = NULL;
@@ -333,7 +334,7 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_trace_c
333334
return 1;
334335
#endif
335336
} else {
336-
zend_vm_opcode_handler_t handler = (zend_vm_opcode_handler_t)ZEND_OP_TRACE_INFO(opline, offset)->orig_handler;
337+
zend_vm_opcode_handler_t handler = (zend_vm_opcode_handler_t)trace_info->orig_handler;
337338
ZEND_OPCODE_TAIL_CALL(handler);
338339
}
339340
}

0 commit comments

Comments
 (0)