diff options
author | Mike Pall <mike> | 2013-06-18 20:08:55 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-06-18 20:08:55 +0200 |
commit | 9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5 (patch) | |
tree | 23740d668a995d9280389e00fd0914dafbbb929c /src/lj_opt_mem.c | |
parent | 21af151af28d4b3524684b106bd19b02484f67f1 (diff) | |
download | luajit2-9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5.tar.gz |
Improve ULOAD forwarding for open upvalues.
Diffstat (limited to 'src/lj_opt_mem.c')
-rw-r--r-- | src/lj_opt_mem.c | 15 |
1 files changed, 12 insertions, 3 deletions
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. */ |