summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-12-16 21:11:40 +0100
committerNikita Popov <nikita.ppv@gmail.com>2018-01-09 18:41:46 +0100
commitf208187773edd9423e64b5b4dd16b146260c780d (patch)
tree7cbbb98d8fdbe64e1a032cd45e4636dfac453420
parent6da44fefb2065e28c6329f45b40c5611f86f4bf3 (diff)
downloadphp-git-f208187773edd9423e64b5b4dd16b146260c780d.tar.gz
Backport narrowing fix to 7.1
This is a cherry-pick of 8a4532319dfae83ff16b2d2bbfeed062924c3c27.
-rw-r--r--ext/opcache/Optimizer/zend_inference.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index db232dff72..aeb30c8ec5 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -2157,6 +2157,24 @@ static int zend_update_type_info(const zend_op_array *op_array,
t1 = OP1_INFO();
t2 = OP2_INFO();
+ /* If one of the operands cannot have any type, this means the operand derives from
+ * unreachable code. Propagate the empty result early, so that that the following
+ * code may assume that operands have at least one type. */
+ if (!(t1 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS|MAY_BE_ERROR))
+ || !(t2 & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_CLASS|MAY_BE_ERROR))) {
+ tmp = 0;
+ if (ssa_ops[i].result_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def);
+ }
+ if (ssa_ops[i].op1_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def);
+ }
+ if (ssa_ops[i].op2_def >= 0) {
+ UPDATE_SSA_TYPE(tmp, ssa_ops[i].op2_def);
+ }
+ return 1;
+ }
+
switch (opline->opcode) {
case ZEND_ADD:
case ZEND_SUB: