From: Mike Pall Date: Tue, 18 Jun 2013 18:08:55 +0000 (+0200) Subject: Improve ULOAD forwarding for open upvalues. X-Git-Tag: v2.0.3~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5;p=thirdparty%2FLuaJIT.git Improve ULOAD forwarding for open upvalues. --- diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 98974ce3..0fd17306 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c @@ -396,13 +396,13 @@ static AliasRet aa_uref(IRIns *refa, IRIns *refb) TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J) { IRRef uref = fins->op1; - IRRef lim = uref; /* Search limit. */ + IRRef lim = REF_BASE; /* Search limit. */ IRIns *xr = IR(uref); IRRef ref; /* Search for conflicting stores. */ ref = J->chain[IR_USTORE]; - while (ref > uref) { + while (ref > lim) { IRIns *store = IR(ref); switch (aa_uref(xr, IR(store->op1))) { case ALIAS_NO: break; /* Continue searching. */ @@ -414,7 +414,16 @@ TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J) cselim: /* Try to find a matching load. Below the conflicting store, if any. */ - return lj_opt_cselim(J, lim); + + ref = J->chain[IR_ULOAD]; + while (ref > lim) { + IRIns *ir = IR(ref); + if (ir->op1 == uref || + (IR(ir->op1)->op12 == IR(uref)->op12 && IR(ir->op1)->o == IR(uref)->o)) + return ref; /* Match for identical or equal UREFx (non-CSEable UREFO). */ + ref = ir->prev; + } + return lj_ir_emit(J); } /* USTORE elimination. */