]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Add HREFK forwarding. Eliminate HREFK guard for TDUP refs.
authorMike Pall <mike>
Thu, 28 Jun 2012 13:10:52 +0000 (15:10 +0200)
committerMike Pall <mike>
Thu, 28 Jun 2012 13:10:52 +0000 (15:10 +0200)
src/lj_iropt.h
src/lj_opt_fold.c
src/lj_opt_mem.c

index caa420f475cfc29c43bddd23bc20e81ed87fe3f8..81d522e8c0683116fca74ff528b5f1ecb8bc720f 100644 (file)
@@ -120,6 +120,7 @@ LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J);
 LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J);
 LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J);
 LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J);
+LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J);
 LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J);
 LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim);
 LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref);
index 41d1ff8a6171349c04d05b3e05ca455af0207da0..5a634bbc7f90c63b7d1b443f0fe4e4cb81496ff1 100644 (file)
@@ -1846,6 +1846,9 @@ LJFOLDF(cse_uref)
   return EMITFOLD;
 }
 
+LJFOLD(HREFK any any)
+LJFOLDX(lj_opt_fwd_hrefk)
+
 LJFOLD(HREF TNEW any)
 LJFOLDF(fwd_href_tnew)
 {
index a0bfba195a138ffd21e44cb0afb38d48fdcdbf3c..a7e0d35e08d3ade818484bd145a3e7c027c27c51 100644 (file)
@@ -21,6 +21,7 @@
 /* Some local macros to save typing. Undef'd at the end. */
 #define IR(ref)                (&J->cur.ir[(ref)])
 #define fins           (&J->fold.ins)
+#define fleft          (&J->fold.left)
 #define fright         (&J->fold.right)
 
 /*
@@ -255,6 +256,30 @@ TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J)
   return EMITFOLD;
 }
 
+/* HREFK forwarding. */
+TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J)
+{
+  IRRef tab = fleft->op1;
+  IRRef ref = J->chain[IR_NEWREF];
+  while (ref > tab) {
+    IRIns *newref = IR(ref);
+    if (tab == newref->op1) {
+      if (fright->op1 == newref->op2)
+       return ref;  /* Forward from NEWREF. */
+      else
+       goto docse;
+    } else if (aa_table(J, tab, newref->op1) != ALIAS_NO) {
+      goto docse;
+    }
+    ref = newref->prev;
+  }
+  /* No conflicting NEWREF: key location unchanged for HREFK of TDUP. */
+  if (IR(tab)->o == IR_TDUP)
+    fins->t.irt &= ~IRT_GUARD;  /* Drop HREFK guard. */
+docse:
+  return CSEFOLD;
+}
+
 /* Check whether HREF of TNEW/TDUP can be folded to niltv. */
 int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J)
 {
@@ -872,6 +897,7 @@ int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref)
 
 #undef IR
 #undef fins
+#undef fleft
 #undef fright
 
 #endif