Skip to content

Commit 23da83c

Browse files
committed
Avoid inlining of rarely used handlers
1 parent 8543f56 commit 23da83c

File tree

3 files changed

+19
-15
lines changed

3 files changed

+19
-15
lines changed

Zend/zend_vm_def.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4222,7 +4222,7 @@ ZEND_VM_HOT_HANDLER(65, ZEND_SEND_VAL, CONST|TMPVAR, NUM)
42224222
ZEND_VM_NEXT_OPCODE();
42234223
}
42244224

4225-
ZEND_VM_HOT_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
4225+
ZEND_VM_HOT_SEND_HANDLER(116, ZEND_SEND_VAL_EX, CONST|TMP, NUM, SPEC(QUICK_ARG))
42264226
{
42274227
USE_OPLINE
42284228
zval *value, *arg;
@@ -4378,7 +4378,7 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM)
43784378
ZEND_VM_NEXT_OPCODE();
43794379
}
43804380

4381-
ZEND_VM_HOT_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, NUM, SPEC(QUICK_ARG))
4381+
ZEND_VM_HOT_SEND_HANDLER(66, ZEND_SEND_VAR_EX, VAR|CV, NUM, SPEC(QUICK_ARG))
43824382
{
43834383
USE_OPLINE
43844384
zval *varptr, *arg;
@@ -4427,7 +4427,7 @@ ZEND_VM_C_LABEL(send_var_by_ref):
44274427
ZEND_VM_NEXT_OPCODE();
44284428
}
44294429

4430-
ZEND_VM_HOT_HANDLER(100, ZEND_CHECK_FUNC_ARG, UNUSED, NUM, SPEC(QUICK_ARG))
4430+
ZEND_VM_HOT_SEND_HANDLER(100, ZEND_CHECK_FUNC_ARG, UNUSED, NUM, SPEC(QUICK_ARG))
44314431
{
44324432
USE_OPLINE
44334433
uint32_t arg_num = opline->op2.num;
@@ -8926,7 +8926,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR, (op1_info & (MAY_BE_UNDEF|MAY_BE_RE
89268926
ZEND_VM_NEXT_OPCODE();
89278927
}
89288928

8929-
ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM, SPEC(QUICK_ARG))
8929+
ZEND_VM_HOT_SEND_TYPE_SPEC_HANDLER(ZEND_SEND_VAR_EX, (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0, ZEND_SEND_VAR_EX_SIMPLE, CV|VAR, NUM, SPEC(QUICK_ARG))
89308930
{
89318931
USE_OPLINE
89328932
zval *varptr, *arg;

Zend/zend_vm_execute.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2975,7 +2975,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONS
29752975
ZEND_VM_NEXT_OPCODE();
29762976
}
29772977

2978-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2978+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29792979
{
29802980
USE_OPLINE
29812981
zval *value, *arg;
@@ -18599,7 +18599,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OP
1859918599
HANDLE_EXCEPTION();
1860018600
}
1860118601

18602-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18602+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1860318603
{
1860418604
USE_OPLINE
1860518605
zval *value, *arg;
@@ -21796,7 +21796,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND
2179621796
ZEND_VM_NEXT_OPCODE();
2179721797
}
2179821798

21799-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21799+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2180021800
{
2180121801
USE_OPLINE
2180221802
zval *varptr, *arg;
@@ -22903,7 +22903,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SP
2290322903
ZEND_VM_NEXT_OPCODE();
2290422904
}
2290522905

22906-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22906+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2290722907
{
2290822908
USE_OPLINE
2290922909
zval *varptr, *arg;
@@ -31832,7 +31832,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_
3183231832
}
3183331833

3183431834

31835-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31835+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CHECK_FUNC_ARG_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3183631836
{
3183731837
USE_OPLINE
3183831838
uint32_t arg_num = opline->op2.num;
@@ -38908,7 +38908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_
3890838908
ZEND_VM_NEXT_OPCODE();
3890938909
}
3891038910

38911-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
38911+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3891238912
{
3891338913
USE_OPLINE
3891438914
zval *varptr, *arg;
@@ -39888,7 +39888,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_SIMPLE_SP
3988839888
ZEND_VM_NEXT_OPCODE();
3988939889
}
3989039890

39891-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
39891+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3989239892
{
3989339893
USE_OPLINE
3989439894
zval *varptr, *arg;

Zend/zend_vm_gen.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,11 +1013,13 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) {
10131013
return false;
10141014
}
10151015

1016-
function is_hot_handler($hot, $op1, $op2) {
1016+
function is_hot_handler($hot, $op1, $op2, $extra_spec) {
10171017
if ($hot === 'HOT_') {
10181018
return true;
10191019
} else if ($hot === 'HOT_OBJ_') {
10201020
return (($op1 === 'UNUSED') || ($op1 === 'CV')) && ($op2 === 'CONST');
1021+
} else if ($hot === 'HOT_SEND_') {
1022+
return !empty($extra_spec["QUICK_ARG"]);
10211023
} else {
10221024
return false;
10231025
}
@@ -1044,7 +1046,7 @@ function gen_handler($f, $spec, $kind, $name, $op1, $op2, $use, $code, $lineno,
10441046
out($f,"\t\t\t\tHYBRID_BREAK();\n");
10451047
return;
10461048
case ZEND_VM_KIND_CALL:
1047-
if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2)) {
1049+
if ($opcode["hot"] && ZEND_VM_KIND == ZEND_VM_KIND_HYBRID && is_hot_handler($opcode["hot"], $op1, $op2, $extra_spec)) {
10481050
out($f,"static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
10491051
} else {
10501052
out($f,"static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL {$spec_name}_HANDLER(ZEND_OPCODE_HANDLER_ARGS)\n");
@@ -2146,10 +2148,11 @@ function gen_vm($def, $skel) {
21462148
++$lineno;
21472149
if (strpos($line,"ZEND_VM_HANDLER(") === 0 ||
21482150
strpos($line,"ZEND_VM_HOT_HANDLER(") === 0 ||
2151+
strpos($line,"ZEND_VM_HOT_SEND_HANDLER(") === 0 ||
21492152
strpos($line,"ZEND_VM_HOT_OBJ_HANDLER(") === 0) {
21502153
// Parsing opcode handler's definition
21512154
if (preg_match(
2152-
"/^ZEND_VM_(HOT_|HOT_OBJ_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
2155+
"/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_)?HANDLER\(\s*([0-9]+)\s*,\s*([A-Z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
21532156
$line,
21542157
$m) == 0) {
21552158
die("ERROR ($def:$lineno): Invalid ZEND_VM_HANDLER definition.\n");
@@ -2193,10 +2196,11 @@ function gen_vm($def, $skel) {
21932196
$list[$lineno] = array("handler"=>$handler);
21942197
} else if (strpos($line,"ZEND_VM_TYPE_SPEC_HANDLER(") === 0 ||
21952198
strpos($line,"ZEND_VM_HOT_TYPE_SPEC_HANDLER(") === 0 ||
2199+
strpos($line,"ZEND_VM_HOT_SEND_TYPE_SPEC_HANDLER(") === 0 ||
21962200
strpos($line,"ZEND_VM_HOT_OBJ_TYPE_SPEC_HANDLER(") === 0) {
21972201
// Parsing opcode handler's definition
21982202
if (preg_match(
2199-
"/^ZEND_VM_(HOT_|HOT_OBJ_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
2203+
"/^ZEND_VM_(HOT_|HOT_OBJ_|HOT_SEND_)?TYPE_SPEC_HANDLER\(\s*([A-Z_]+)\s*,\s*((?:[^(,]|\([^()]*|(?R)*\))*),\s*([A-Za-z_]+)\s*,\s*([A-Z_|]+)\s*,\s*([A-Z_|]+)\s*(,\s*([A-Z_|]+)\s*)?(,\s*SPEC\(([A-Z_|=,]+)\)\s*)?\)/",
22002204
$line,
22012205
$m) == 0) {
22022206
die("ERROR ($def:$lineno): Invalid ZEND_VM_TYPE_HANDLER_HANDLER definition.\n");

0 commit comments

Comments
 (0)