]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Improve ULOAD forwarding for open upvalues.
authorMike Pall <mike>
Tue, 18 Jun 2013 18:08:55 +0000 (20:08 +0200)
committerMike Pall <mike>
Tue, 18 Jun 2013 18:08:55 +0000 (20:08 +0200)
src/lj_opt_mem.c

index 98974ce33c6986d322a9bcda9cb0fa75544bdc06..0fd173062c5b4a6bfaf77bd265b6b4962160e383 100644 (file)
@@ -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. */