diff options
author | Mike Pall <mike> | 2023-06-02 11:38:45 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-06-02 11:38:45 +0200 |
commit | 9f452bbef5031afc506d8615f5e720c45acd6fdf (patch) | |
tree | d399f51b7726a611ac1092b74d7aa97b42fbaab7 | |
parent | 8c20c3b1a379f3f8ea34d9a13d3414bce8827e71 (diff) | |
download | luajit-9f452bbef5031afc506d8615f5e720c45acd6fdf.tar.gz luajit-9f452bbef5031afc506d8615f5e720c45acd6fdf.tar.bz2 luajit-9f452bbef5031afc506d8615f5e720c45acd6fdf.zip |
Fix handling of instable types in TNEW/TDUP load forwarding.
Analyzed by Sergey Kaplun. #994
-rw-r--r-- | src/lj_opt_mem.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 5b1ad898..9d83ea4a 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c | |||
@@ -197,7 +197,8 @@ static TRef fwd_ahload(jit_State *J, IRRef xref) | |||
197 | if (key->o == IR_KSLOT) key = IR(key->op1); | 197 | if (key->o == IR_KSLOT) key = IR(key->op1); |
198 | lj_ir_kvalue(J->L, &keyv, key); | 198 | lj_ir_kvalue(J->L, &keyv, key); |
199 | tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv); | 199 | tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv); |
200 | lua_assert(itype2irt(tv) == irt_type(fins->t)); | 200 | if (itype2irt(tv) != irt_type(fins->t)) |
201 | return 0; /* Type instability in loop-carried dependency. */ | ||
201 | if (irt_isnum(fins->t)) | 202 | if (irt_isnum(fins->t)) |
202 | return lj_ir_knum_u64(J, tv->u64); | 203 | return lj_ir_knum_u64(J, tv->u64); |
203 | else if (LJ_DUALNUM && irt_isint(fins->t)) | 204 | else if (LJ_DUALNUM && irt_isint(fins->t)) |