Skip to content

Commit 225a02f

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Optimize VERIFY_RETURN_TYPE for TMP operands as well
2 parents 711e2a1 + 6aece7b commit 225a02f

File tree

1 file changed

+28
-28
lines changed

1 file changed

+28
-28
lines changed

ext/opcache/Optimizer/dfa_pass.c

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,34 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
11121112
&& !(OP2_INFO() & MAY_BE_OBJECT)) {
11131113
opline->opcode = ZEND_FAST_CONCAT;
11141114
}
1115+
} else if (opline->opcode == ZEND_VERIFY_RETURN_TYPE
1116+
&& opline->op1_type != IS_CONST
1117+
&& ssa->ops[op_1].op1_def == v
1118+
&& ssa->ops[op_1].op1_use >= 0
1119+
&& ssa->ops[op_1].op1_use_chain == -1
1120+
&& ssa->vars[v].use_chain >= 0
1121+
&& can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
1122+
1123+
// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
1124+
1125+
int orig_var = ssa->ops[op_1].op1_use;
1126+
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
1127+
1128+
int ret = ssa->vars[v].use_chain;
1129+
1130+
ssa->ops[ret].op1_use = orig_var;
1131+
ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
1132+
ssa->vars[orig_var].use_chain = ret;
1133+
1134+
ssa->vars[v].definition = -1;
1135+
ssa->vars[v].use_chain = -1;
1136+
1137+
ssa->ops[op_1].op1_def = -1;
1138+
ssa->ops[op_1].op1_use = -1;
1139+
1140+
MAKE_NOP(opline);
1141+
remove_nops = 1;
1142+
}
11151143
}
11161144
}
11171145

@@ -1290,34 +1318,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
12901318
opline->extended_value = 0;
12911319
SET_UNUSED(opline->op2);
12921320

1293-
} else if (opline->opcode == ZEND_VERIFY_RETURN_TYPE
1294-
&& ssa->ops[op_1].op1_def == v
1295-
&& ssa->ops[op_1].op1_use >= 0
1296-
&& ssa->ops[op_1].op1_use_chain == -1
1297-
&& ssa->vars[v].use_chain >= 0
1298-
&& can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
1299-
1300-
// op_1: VERIFY_RETURN_TYPE #orig_var.CV [T] -> #v.CV [T] => NOP
1301-
1302-
int orig_var = ssa->ops[op_1].op1_use;
1303-
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
1304-
1305-
int ret = ssa->vars[v].use_chain;
1306-
1307-
ssa->ops[ret].op1_use = orig_var;
1308-
ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
1309-
ssa->vars[orig_var].use_chain = ret;
1310-
1311-
ssa->vars[v].definition = -1;
1312-
ssa->vars[v].use_chain = -1;
1313-
1314-
ssa->ops[op_1].op1_def = -1;
1315-
ssa->ops[op_1].op1_use = -1;
1316-
1317-
MAKE_NOP(opline);
1318-
remove_nops = 1;
1319-
}
1320-
13211321
} else if (ssa->ops[op_1].op1_def == v
13221322
&& !RETURN_VALUE_USED(opline)
13231323
&& ssa->ops[op_1].op1_use >= 0

0 commit comments

Comments
 (0)