summaryrefslogtreecommitdiff
path: root/src/lj_opt_mem.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-06-18 20:08:55 +0200
committerMike Pall <mike>2013-06-18 20:08:55 +0200
commit9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5 (patch)
tree23740d668a995d9280389e00fd0914dafbbb929c /src/lj_opt_mem.c
parent21af151af28d4b3524684b106bd19b02484f67f1 (diff)
downloadluajit2-9211a66e0e2bcbcaffc4a8c76bfc2a39bce6f0e5.tar.gz
Improve ULOAD forwarding for open upvalues.
Diffstat (limited to 'src/lj_opt_mem.c')
-rw-r--r--src/lj_opt_mem.c15
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. */