summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/zend_inference.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/Optimizer/zend_inference.c')
-rw-r--r--ext/opcache/Optimizer/zend_inference.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index 2be19fcf8a..495aedfda2 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -2409,12 +2409,10 @@ static zend_always_inline int _zend_update_type_info(
if (ssa_op->op1_def >= 0) {
tmp = t1;
if ((t1 & (MAY_BE_ARRAY|MAY_BE_OBJECT)) &&
- (opline->op1_type == IS_CV) &&
(opline->extended_value == IS_ARRAY ||
opline->extended_value == IS_OBJECT)) {
tmp |= MAY_BE_RCN;
} else if ((t1 & MAY_BE_STRING) &&
- (opline->op1_type == IS_CV) &&
opline->extended_value == IS_STRING) {
tmp |= MAY_BE_RCN;
}
@@ -2454,7 +2452,7 @@ static zend_always_inline int _zend_update_type_info(
case ZEND_COPY_TMP:
if (ssa_op->op1_def >= 0) {
tmp = t1;
- if ((t1 & (MAY_BE_RC1|MAY_BE_REF)) && (opline->op1_type == IS_CV)) {
+ if (t1 & (MAY_BE_RC1|MAY_BE_REF)) {
tmp |= MAY_BE_RCN;
}
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
@@ -2729,7 +2727,7 @@ static zend_always_inline int _zend_update_type_info(
}
UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
}
- if ((opline+1)->op1_type == IS_CV && (ssa_op+1)->op1_def >= 0) {
+ if ((ssa_op+1)->op1_def >= 0) {
opline++;
ssa_op++;
tmp = OP1_INFO_EX();
@@ -2763,14 +2761,27 @@ static zend_always_inline int _zend_update_type_info(
UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_op->result_def);
}
}
- if ((opline+1)->op1_type == IS_CV) {
+ if ((ssa_op+1)->op1_def >= 0) {
opline++;
ssa_op++;
tmp = OP1_INFO_EX();
- if (tmp & (MAY_BE_ANY | MAY_BE_REF)) {
- if (tmp & MAY_BE_RC1) {
- tmp |= MAY_BE_RCN;
- }
+ if (tmp & MAY_BE_RC1) {
+ tmp |= MAY_BE_RCN;
+ }
+ UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
+ }
+ break;
+ case ZEND_ASSIGN_STATIC_PROP:
+ if (ssa_op->result_def >= 0) {
+ tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN;
+ UPDATE_SSA_TYPE(tmp, ssa_op->result_def);
+ }
+ if ((ssa_op+1)->op1_def >= 0) {
+ opline++;
+ ssa_op++;
+ tmp = OP1_INFO_EX();
+ if (tmp & MAY_BE_RC1) {
+ tmp |= MAY_BE_RCN;
}
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
}
@@ -2798,12 +2809,10 @@ static zend_always_inline int _zend_update_type_info(
}
break;
case ZEND_ASSIGN:
- if (opline->op2_type == IS_CV && ssa_op->op2_def >= 0) {
+ if (ssa_op->op2_def >= 0) {
tmp = t2;
- if (tmp & (MAY_BE_ANY | MAY_BE_REF)) {
- if (tmp & MAY_BE_RC1) {
- tmp |= MAY_BE_RCN;
- }
+ if (tmp & MAY_BE_RC1) {
+ tmp |= MAY_BE_RCN;
}
UPDATE_SSA_TYPE(tmp, ssa_op->op2_def);
}
@@ -2918,7 +2927,7 @@ static zend_always_inline int _zend_update_type_info(
case ZEND_SEND_VAR:
if (ssa_op->op1_def >= 0) {
tmp = t1;
- if ((t1 & (MAY_BE_RC1|MAY_BE_REF)) && (opline->op1_type == IS_CV)) {
+ if (t1 & (MAY_BE_RC1|MAY_BE_REF)) {
tmp |= MAY_BE_RCN;
}
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
@@ -3102,7 +3111,7 @@ static zend_always_inline int _zend_update_type_info(
break;
case ZEND_INIT_ARRAY:
case ZEND_ADD_ARRAY_ELEMENT:
- if (opline->op1_type == IS_CV && ssa_op->op1_def >= 0) {
+ if (ssa_op->op1_def >= 0) {
if (opline->extended_value & ZEND_ARRAY_ELEMENT_REF) {
tmp = (MAY_BE_REF | t1) & ~(MAY_BE_UNDEF|MAY_BE_RC1|MAY_BE_RCN);
if (t1 & MAY_BE_UNDEF) {
@@ -3190,10 +3199,8 @@ static zend_always_inline int _zend_update_type_info(
tmp = t1;
if (opline->opcode == ZEND_FE_RESET_RW) {
tmp |= MAY_BE_REF;
- } else {
- if ((t1 & MAY_BE_RC1) && opline->op1_type != IS_TMP_VAR) {
- tmp |= MAY_BE_RCN;
- }
+ } else if (t1 & MAY_BE_RC1) {
+ tmp |= MAY_BE_RCN;
}
UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
COPY_SSA_OBJ_TYPE(ssa_op->op1_use, ssa_op->op1_def);