Don't split basic block after RECV, if function checks type hints
authorDmitry Stogov <dmitry@zend.com>
Tue, 9 Apr 2019 18:59:47 +0000 (21:59 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 9 Apr 2019 18:59:47 +0000 (21:59 +0300)
ext/opcache/Optimizer/zend_dump.c
ext/opcache/jit/zend_jit.c

index 6f5d8ace1877ba4be51b4cd41d45ba5606d4211b..ce002c644fe7d5e6f3ee1d322bbedbd705e155d2 100644 (file)
@@ -732,6 +732,9 @@ static void zend_dump_block_info(const zend_cfg *cfg, int n, uint32_t dump_flags
        if (b->flags & ZEND_BB_START) {
                fprintf(stderr, " start");
        }
+       if (b->flags & ZEND_BB_RECV_ENTRY) {
+               fprintf(stderr, " recv");
+       }
        if (b->flags & ZEND_BB_FOLLOW) {
                fprintf(stderr, " follow");
        }
index 743bc7b43215ff4742e79be83462c58b3c71a07d..847b6130e9abf57ef327d21a4c10ed2fa122e764 100644 (file)
@@ -591,7 +591,16 @@ static int zend_may_overflow(const zend_op *opline, zend_op_array *op_array, zen
 
 static int zend_jit_build_cfg(zend_op_array *op_array, zend_cfg *cfg)
 {
-       if (zend_build_cfg(&CG(arena), op_array, ZEND_CFG_STACKLESS | ZEND_CFG_RECV_ENTRY | ZEND_RT_CONSTANTS | ZEND_CFG_NO_ENTRY_PREDECESSORS | ZEND_SSA_RC_INFERENCE_FLAG | ZEND_SSA_USE_CV_RESULTS, cfg) != SUCCESS) {
+       uint32_t flags;
+
+       flags = ZEND_CFG_STACKLESS | ZEND_RT_CONSTANTS | ZEND_CFG_NO_ENTRY_PREDECESSORS | ZEND_SSA_RC_INFERENCE_FLAG | ZEND_SSA_USE_CV_RESULTS;
+
+       if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
+               /* First RECV/RECV_INIT instructions may be skipped */
+               flags |= ZEND_CFG_RECV_ENTRY;
+       }
+
+       if (zend_build_cfg(&CG(arena), op_array, flags, cfg) != SUCCESS) {
                return FAILURE;
        }