summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-03-22 14:50:28 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-03-22 14:54:29 +0100
commit6a5d60085d381255da94789f69892a9c979948a2 (patch)
tree1e76818d61a81517e0b132723aa14ed8b692d793
parent8ed8cf86a98d1317c633189857ce4d64f105e6f7 (diff)
downloadphp-git-6a5d60085d381255da94789f69892a9c979948a2.tar.gz
Support VERIFY_RETURN_TYPE elision with unused operand
This handles the degenerate case where SCCP replaced the value in the RETURN opcode with a constant, but the VERIFY_RETURN is still there. We can still apply the same optimization, just don't need to adjust the use list in this case. The result is still sub-optimal in that a dead QM_ASSIGN is left behind.
-rw-r--r--Zend/Optimizer/dfa_pass.c10
-rw-r--r--ext/opcache/tests/opt/verify_return_type.phpt23
2 files changed, 28 insertions, 5 deletions
diff --git a/Zend/Optimizer/dfa_pass.c b/Zend/Optimizer/dfa_pass.c
index 3ce28f63e3..90410e5972 100644
--- a/Zend/Optimizer/dfa_pass.c
+++ b/Zend/Optimizer/dfa_pass.c
@@ -1236,7 +1236,6 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
&& ssa->ops[op_1].op1_def == v
&& ssa->ops[op_1].op1_use >= 0
&& ssa->ops[op_1].op1_use_chain == -1
- && ssa->vars[v].use_chain >= 0
&& can_elide_return_type_check(op_array, ssa, &ssa->ops[op_1])) {
// op_1: VERIFY_RETURN_TYPE #orig_var.? [T] -> #v.? [T] => NOP
@@ -1245,10 +1244,11 @@ void zend_dfa_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *ctx
if (zend_ssa_unlink_use_chain(ssa, op_1, orig_var)) {
int ret = ssa->vars[v].use_chain;
-
- ssa->ops[ret].op1_use = orig_var;
- ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
- ssa->vars[orig_var].use_chain = ret;
+ if (ret >= 0) {
+ ssa->ops[ret].op1_use = orig_var;
+ ssa->ops[ret].op1_use_chain = ssa->vars[orig_var].use_chain;
+ ssa->vars[orig_var].use_chain = ret;
+ }
ssa->vars[v].definition = -1;
ssa->vars[v].use_chain = -1;
diff --git a/ext/opcache/tests/opt/verify_return_type.phpt b/ext/opcache/tests/opt/verify_return_type.phpt
index 3838cd8b0c..7f52c829a4 100644
--- a/ext/opcache/tests/opt/verify_return_type.phpt
+++ b/ext/opcache/tests/opt/verify_return_type.phpt
@@ -37,6 +37,16 @@ class Test2 {
}
}
+class Test3 {
+ private function getBool() {
+ return true;
+ }
+
+ private function getBool2(): bool {
+ return $this->getBool();
+ }
+}
+
?>
--EXPECTF--
$_main:
@@ -91,3 +101,16 @@ Test2::getInt3:
0003 V1 = DO_FCALL
0004 VERIFY_RETURN_TYPE V1
0005 RETURN V1
+
+Test3::getBool:
+ ; (lines=1, args=0, vars=0, tmps=0)
+ ; (after optimizer)
+ ; %s
+0000 RETURN bool(true)
+
+Test3::getBool2:
+ ; (lines=2, args=0, vars=0, tmps=1)
+ ; (after optimizer)
+ ; %s
+0000 V0 = QM_ASSIGN bool(true)
+0001 RETURN bool(true)