diff options
| author | Mike Pall <mike> | 2012-06-28 15:10:52 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2012-06-28 15:10:52 +0200 |
| commit | a9bf455b96e6a6717e53051efbe4cb95e17a7e92 (patch) | |
| tree | 542040435ec936185b8a73aaea97d308d4203393 /src | |
| parent | 0d1056eeed34cf349938188b177406b6cab91257 (diff) | |
| download | luajit-a9bf455b96e6a6717e53051efbe4cb95e17a7e92.tar.gz luajit-a9bf455b96e6a6717e53051efbe4cb95e17a7e92.tar.bz2 luajit-a9bf455b96e6a6717e53051efbe4cb95e17a7e92.zip | |
Add HREFK forwarding. Eliminate HREFK guard for TDUP refs.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_iropt.h | 1 | ||||
| -rw-r--r-- | src/lj_opt_fold.c | 3 | ||||
| -rw-r--r-- | src/lj_opt_mem.c | 26 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/lj_iropt.h b/src/lj_iropt.h index caa420f4..81d522e8 100644 --- a/src/lj_iropt.h +++ b/src/lj_iropt.h | |||
| @@ -120,6 +120,7 @@ LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_uload(jit_State *J); | |||
| 120 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J); | 120 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_fload(jit_State *J); |
| 121 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J); | 121 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J); |
| 122 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J); | 122 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_tab_len(jit_State *J); |
| 123 | LJ_FUNC TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J); | ||
| 123 | LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J); | 124 | LJ_FUNC int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J); |
| 124 | LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim); | 125 | LJ_FUNC int LJ_FASTCALL lj_opt_fwd_tptr(jit_State *J, IRRef lim); |
| 125 | LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref); | 126 | LJ_FUNC int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref); |
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 41d1ff8a..5a634bbc 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
| @@ -1846,6 +1846,9 @@ LJFOLDF(cse_uref) | |||
| 1846 | return EMITFOLD; | 1846 | return EMITFOLD; |
| 1847 | } | 1847 | } |
| 1848 | 1848 | ||
| 1849 | LJFOLD(HREFK any any) | ||
| 1850 | LJFOLDX(lj_opt_fwd_hrefk) | ||
| 1851 | |||
| 1849 | LJFOLD(HREF TNEW any) | 1852 | LJFOLD(HREF TNEW any) |
| 1850 | LJFOLDF(fwd_href_tnew) | 1853 | LJFOLDF(fwd_href_tnew) |
| 1851 | { | 1854 | { |
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index a0bfba19..a7e0d35e 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | /* Some local macros to save typing. Undef'd at the end. */ | 21 | /* Some local macros to save typing. Undef'd at the end. */ |
| 22 | #define IR(ref) (&J->cur.ir[(ref)]) | 22 | #define IR(ref) (&J->cur.ir[(ref)]) |
| 23 | #define fins (&J->fold.ins) | 23 | #define fins (&J->fold.ins) |
| 24 | #define fleft (&J->fold.left) | ||
| 24 | #define fright (&J->fold.right) | 25 | #define fright (&J->fold.right) |
| 25 | 26 | ||
| 26 | /* | 27 | /* |
| @@ -255,6 +256,30 @@ TRef LJ_FASTCALL lj_opt_fwd_hload(jit_State *J) | |||
| 255 | return EMITFOLD; | 256 | return EMITFOLD; |
| 256 | } | 257 | } |
| 257 | 258 | ||
| 259 | /* HREFK forwarding. */ | ||
| 260 | TRef LJ_FASTCALL lj_opt_fwd_hrefk(jit_State *J) | ||
| 261 | { | ||
| 262 | IRRef tab = fleft->op1; | ||
| 263 | IRRef ref = J->chain[IR_NEWREF]; | ||
| 264 | while (ref > tab) { | ||
| 265 | IRIns *newref = IR(ref); | ||
| 266 | if (tab == newref->op1) { | ||
| 267 | if (fright->op1 == newref->op2) | ||
| 268 | return ref; /* Forward from NEWREF. */ | ||
| 269 | else | ||
| 270 | goto docse; | ||
| 271 | } else if (aa_table(J, tab, newref->op1) != ALIAS_NO) { | ||
| 272 | goto docse; | ||
| 273 | } | ||
| 274 | ref = newref->prev; | ||
| 275 | } | ||
| 276 | /* No conflicting NEWREF: key location unchanged for HREFK of TDUP. */ | ||
| 277 | if (IR(tab)->o == IR_TDUP) | ||
| 278 | fins->t.irt &= ~IRT_GUARD; /* Drop HREFK guard. */ | ||
| 279 | docse: | ||
| 280 | return CSEFOLD; | ||
| 281 | } | ||
| 282 | |||
| 258 | /* Check whether HREF of TNEW/TDUP can be folded to niltv. */ | 283 | /* Check whether HREF of TNEW/TDUP can be folded to niltv. */ |
| 259 | int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J) | 284 | int LJ_FASTCALL lj_opt_fwd_href_nokey(jit_State *J) |
| 260 | { | 285 | { |
| @@ -872,6 +897,7 @@ int lj_opt_fwd_wasnonnil(jit_State *J, IROpT loadop, IRRef xref) | |||
| 872 | 897 | ||
| 873 | #undef IR | 898 | #undef IR |
| 874 | #undef fins | 899 | #undef fins |
| 900 | #undef fleft | ||
| 875 | #undef fright | 901 | #undef fright |
| 876 | 902 | ||
| 877 | #endif | 903 | #endif |
