]> granicus.if.org Git - php/commitdiff
Avoid STORE of register inherited from parent trace
authorDmitry Stogov <dmitry@zend.com>
Fri, 24 Apr 2020 13:32:31 +0000 (16:32 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 24 Apr 2020 13:32:31 +0000 (16:32 +0300)
ext/opcache/jit/zend_jit_trace.c

index bbebebed12db929bce3b8c339a3a8ffedc0d3af1..f7408b6707ff14a25b95842332a5ecfd1db29071 100644 (file)
@@ -2513,8 +2513,10 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
                // TODO: Merge two loops implementing paralel move ???
                for (i = 0; i < parent_vars_count; i++) {
                        if (STACK_REG(parent_stack, i) != ZREG_NONE) {
-                               // TODO: optimize out useless stores ????
-                               if (!zend_jit_store_var(&dasm_state, ssa->var_info[i].type, i, STACK_REG(parent_stack, i))) {
+                               if (ra && ra[i] && ra[i]->reg == STACK_REG(parent_stack, i)) {
+                                   /* register already loaded by parent trace */
+                                       SET_STACK_REG(stack, i, ra[i]->reg);
+                               } else if (!zend_jit_store_var(&dasm_state, ssa->var_info[i].type, i, STACK_REG(parent_stack, i))) {
                                        goto jit_failure;
                                }
                        }