Enable replacing const to INSTANCEOF
authorXinchen Hui <laruence@gmail.com>
Wed, 3 Jan 2018 10:28:03 +0000 (18:28 +0800)
committerXinchen Hui <laruence@gmail.com>
Wed, 3 Jan 2018 10:28:03 +0000 (18:28 +0800)
ext/opcache/Optimizer/sccp.c
ext/opcache/Optimizer/zend_optimizer.c

index 0e65ac8b8fa358531ea028b6bc7536af05eef318..25b51b687a4f32d612bf2f7e66ba18cba8194e2b 100644 (file)
@@ -242,7 +242,6 @@ static zend_bool can_replace_op1(
                case ZEND_MAKE_REF:
                case ZEND_UNSET_CV:
                case ZEND_ISSET_ISEMPTY_CV:
-               case ZEND_INSTANCEOF:
                        return 0;
                case ZEND_INIT_ARRAY:
                case ZEND_ADD_ARRAY_ELEMENT:
@@ -299,6 +298,22 @@ static zend_bool try_replace_op1(
                                        opline->op1.constant = zend_optimizer_add_literal(ctx->scdf.op_array, &zv);
                                        opline->op1_type = IS_CONST;
                                        return 1;
+                               case ZEND_INSTANCEOF:
+                                       zval_ptr_dtor_nogc(&zv);
+                                       ZVAL_FALSE(&zv);
+                                       opline->opcode = ZEND_QM_ASSIGN;
+                                       opline->op1_type = IS_CONST;
+                                       opline->op1.constant = zend_optimizer_add_literal(ctx->scdf.op_array, &zv);
+                                       opline->op2_type = IS_UNUSED;
+                                       if (ssa_op->op2_use >= 0) {
+                                               ZEND_ASSERT(ssa_op->op2_def == -1);
+                                               zend_ssa_unlink_use_chain(ctx->scdf.ssa, ssa_op - ctx->scdf.ssa->ops, ssa_op->op2_use);
+                                               ssa_op->op2_use = -1;
+                                               ssa_op->op2_use_chain = -1;
+                                       }
+                                       return 1;
+                               default:
+                                       break;
                        }
                        zval_ptr_dtor_nogc(&zv);
                }
index 37357f3c31bcbb16e086e67332703602aa7a1905..97be113f47af36a73cae14348431568657f1053b 100644 (file)
@@ -272,6 +272,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
                case ZEND_FETCH_LIST_W:
                case ZEND_ASSIGN_DIM:
                case ZEND_RETURN_BY_REF:
+               case ZEND_INSTANCEOF:
                        return 0;
                case ZEND_INIT_STATIC_METHOD_CALL:
                case ZEND_CATCH: