aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2023-06-02 11:38:45 +0200
committerMike Pall <mike>2023-06-02 11:38:45 +0200
commit9f452bbef5031afc506d8615f5e720c45acd6fdf (patch)
treed399f51b7726a611ac1092b74d7aa97b42fbaab7
parent8c20c3b1a379f3f8ea34d9a13d3414bce8827e71 (diff)
downloadluajit-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.c3
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))