From: Dmitry Stogov Date: Fri, 24 Apr 2020 13:32:31 +0000 (+0300) Subject: Avoid STORE of register inherited from parent trace X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ab2e82ab56c51f203256bd61207c910ce1b6e7e;p=php Avoid STORE of register inherited from parent trace --- diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c index bbebebed12..f7408b6707 100644 --- a/ext/opcache/jit/zend_jit_trace.c +++ b/ext/opcache/jit/zend_jit_trace.c @@ -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; } }