Support for reference
authorDmitry Stogov <dmitry@zend.com>
Mon, 14 Sep 2020 20:30:49 +0000 (23:30 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 14 Sep 2020 20:30:49 +0000 (23:30 +0300)
ext/opcache/jit/zend_jit.c
ext/opcache/jit/zend_jit_trace.c
ext/opcache/jit/zend_jit_x86.dasc

index 04bb52f352eeaa8f32653afe6289c7b82ed2abcb..cfc391f0e823f321dded9c85bc73ed1f1930ed38 100644 (file)
@@ -3114,7 +3114,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
                                                if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
                                                        break;
                                                }
-                                               if (!zend_jit_strlen(&dasm_state, opline, op1_info)) {
+                                               if (!zend_jit_strlen(&dasm_state, opline, op1_info, OP1_REG_ADDR())) {
                                                        goto jit_failure;
                                                }
                                                goto done;
index ad1ea8d978e3c6ede94534b00bd0f1de9d31fdef..253ae68a7f360445d3a5216e73d53d9208958baf 100644 (file)
@@ -4860,11 +4860,23 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                goto done;
                                        case ZEND_STRLEN:
                                                op1_info = OP1_INFO();
-                                               CHECK_OP1_TRACE_TYPE();
-                                               if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
-                                                       break;
+                                               op1_addr = OP1_REG_ADDR();
+                                               if (orig_op1_type == (IS_TRACE_REFERENCE|IS_STRING)) {
+                                                       if (!zend_jit_fetch_reference(&dasm_state, opline, orig_op1_type, &op1_info, &op1_addr,
+                                                                       !ssa->var_info[ssa_op->op1_use].guarded_reference, 1)) {
+                                                               goto jit_failure;
+                                                       }
+                                                       if (opline->op1_type == IS_CV
+                                                        && zend_jit_var_may_alias(op_array, op_array_ssa, EX_VAR_TO_NUM(opline->op1.var)) == NO_ALIAS) {
+                                                               ssa->var_info[ssa_op->op1_use].guarded_reference = 1;
+                                                       }
+                                               } else {
+                                                       CHECK_OP1_TRACE_TYPE();
+                                                       if ((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) != MAY_BE_STRING) {
+                                                               break;
+                                                       }
                                                }
-                                               if (!zend_jit_strlen(&dasm_state, opline, op1_info)) {
+                                               if (!zend_jit_strlen(&dasm_state, opline, op1_info, op1_addr)) {
                                                        goto jit_failure;
                                                }
                                                goto done;
index cb23f44d0c2f787ded8093de24b0ba161d7f606e..ae3763622eada1f13062cfff87633c6775079bd8 100644 (file)
@@ -13396,7 +13396,7 @@ static int zend_jit_echo(dasm_State **Dst, const zend_op *opline, uint32_t op1_i
        return 1;
 }
 
-static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1_info)
+static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1_info, zend_jit_addr op1_addr)
 {
        zend_jit_addr res_addr = RES_ADDR();
 
@@ -13411,17 +13411,13 @@ static int zend_jit_strlen(dasm_State **Dst, const zend_op *opline, uint32_t op1
                |       SET_ZVAL_LVAL res_addr, len
                |       SET_ZVAL_TYPE_INFO res_addr, IS_LONG
        } else {
-               zend_jit_addr op1_addr = OP1_ADDR();
-
                ZEND_ASSERT((op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_STRING);
 
                |       GET_ZVAL_PTR r0, op1_addr
                |       mov r0, aword [r0 + offsetof(zend_string, len)]
                |       SET_ZVAL_LVAL res_addr, r0
                |       SET_ZVAL_TYPE_INFO res_addr, IS_LONG
-               if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) {
-                       |       ZVAL_PTR_DTOR op1_addr, op1_info, 0, 0, opline
-               }
+               |       FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
        }
        return 1;
 }