]> granicus.if.org Git - php/commitdiff
Eliminate useless exception checks
authorDmitry Stogov <dmitry@zend.com>
Thu, 2 Jul 2020 09:42:09 +0000 (12:42 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 2 Jul 2020 09:42:09 +0000 (12:42 +0300)
ext/opcache/Optimizer/zend_inference.c
ext/opcache/Optimizer/zend_inference.h
ext/opcache/jit/zend_jit_trace.c

index 72b229af3ded6b620b4a62163a844a0fac1234ac..e131a3ee58df278c8e5a26214d62ec3b85f739ba 100644 (file)
@@ -4255,11 +4255,8 @@ void zend_inference_check_recursive_dependencies(zend_op_array *op_array)
        free_alloca(worklist, use_heap);
 }
 
-int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa)
+int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2)
 {
-       uint32_t t1 = OP1_INFO();
-       uint32_t t2 = OP2_INFO();
-
        if (opline->op1_type == IS_CV) {
                if (t1 & MAY_BE_UNDEF) {
                        switch (opline->opcode) {
@@ -4594,3 +4591,8 @@ int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_
                        return 1;
        }
 }
+
+int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa)
+{
+       return zend_may_throw_ex(opline, ssa_op, op_array, ssa, OP1_INFO(), OP2_INFO());
+}
index 525159a72b4e0ae2a6464b5c673f8bd2cb275ef4..78a9cdcbb504caad9a93bf02b742c1e0c13ab6e3 100644 (file)
@@ -270,6 +270,7 @@ void zend_func_return_info(const zend_op_array   *op_array,
                            int                    widening,
                            zend_ssa_var_info     *ret);
 
+int zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa, uint32_t t1, uint32_t t2);
 int zend_may_throw(const zend_op *opline, const zend_ssa_op *ssa_op, const zend_op_array *op_array, zend_ssa *ssa);
 
 int zend_update_type_info(const zend_op_array *op_array,
index 1400b782251023225c42cba4928bf03394a26aa4..04f3a1b79353a6f6eac6315ae0b0265b05a18fa3 100644 (file)
@@ -3243,7 +3243,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                if (!zend_jit_assign_dim_op(&dasm_state, opline, op_array,
                                                                op1_info, op1_def_info, op1_addr, op2_info,
                                                                op1_data_info, OP1_DATA_RANGE(),
-                                                               zend_may_throw(opline, ssa_op, op_array, ssa))) {
+                                                               zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) {
                                                        goto jit_failure;
                                                }
                                                goto done;
@@ -3267,7 +3267,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                CHECK_OP1_DATA_TRACE_TYPE();
                                                if (!zend_jit_assign_dim(&dasm_state, opline, op_array,
                                                                op1_info, op1_addr, op2_info, op1_data_info,
-                                                               zend_may_throw(opline, ssa_op, op_array, ssa))) {
+                                                               zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) {
                                                        goto jit_failure;
                                                }
                                                goto done;
@@ -3318,7 +3318,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                                op1_def_info, op1_def_addr,
                                                                op2_info, op2_addr, op2_def_addr,
                                                                res_info, res_addr,
-                                                               zend_may_throw(opline, ssa_op, op_array, ssa))) {
+                                                               zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info))) {
                                                        goto jit_failure;
                                                }
                                                goto done;
@@ -3768,7 +3768,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                }
                                                if (!zend_jit_isset_isempty_dim(&dasm_state, opline, op_array,
                                                                op1_info, op1_addr, op2_info,
-                                                               zend_may_throw(opline, ssa_op, op_array, ssa),
+                                                               zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, op2_info),
                                                                smart_branch_opcode, -1, -1,
                                                                exit_addr)) {
                                                        goto jit_failure;
@@ -3839,7 +3839,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                                                if (!zend_jit_fetch_obj(&dasm_state, opline, op_array,
                                                                op1_info, op1_addr, op1_indirect, ce, ce_is_instanceof,
                                                                delayed_fetch_this,
-                                                               zend_may_throw(opline, ssa_op, op_array, ssa))) {
+                                                               zend_may_throw_ex(opline, ssa_op, op_array, ssa, op1_info, MAY_BE_STRING))) {
                                                        goto jit_failure;
                                                }
                                                goto done;