aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2023-12-23 19:15:57 +0100
committerMike Pall <mike>2023-12-23 19:15:57 +0100
commite02a207909f5fb8dc1e58a999b6af0e346cd17e2 (patch)
treeed0cbaa7f2a0ae32f1ca50c61751f2142f759b8f /src
parent29b0b282f59ac533313199f4f7be79490b7eee51 (diff)
parentc42c62e71a45a677b8b1cbf749bd33cf4d5918ff (diff)
downloadluajit-e02a207909f5fb8dc1e58a999b6af0e346cd17e2.tar.gz
luajit-e02a207909f5fb8dc1e58a999b6af0e346cd17e2.tar.bz2
luajit-e02a207909f5fb8dc1e58a999b6af0e346cd17e2.zip
Merge branch 'master' into v2.1
Diffstat (limited to 'src')
-rw-r--r--src/lj_opt_mem.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c
index 631ac9e4..55b40c3b 100644
--- a/src/lj_opt_mem.c
+++ b/src/lj_opt_mem.c
@@ -217,25 +217,23 @@ static TRef fwd_ahload(jit_State *J, IRRef xref)
217 } 217 }
218 ref = store->prev; 218 ref = store->prev;
219 } 219 }
220 if (ir->o == IR_TNEW && !irt_isnil(fins->t)) 220 /* Simplified here: let loop_unroll() figure out any type instability. */
221 return 0; /* Type instability in loop-carried dependency. */ 221 if (ir->o == IR_TNEW) {
222 if (irt_ispri(fins->t)) { 222 return TREF_NIL;
223 return TREF_PRI(irt_type(fins->t)); 223 } else {
224 } else if (irt_isnum(fins->t) || (LJ_DUALNUM && irt_isint(fins->t)) ||
225 irt_isstr(fins->t)) {
226 TValue keyv; 224 TValue keyv;
227 cTValue *tv; 225 cTValue *tv;
228 IRIns *key = IR(xr->op2); 226 IRIns *key = IR(xr->op2);
229 if (key->o == IR_KSLOT) key = IR(key->op1); 227 if (key->o == IR_KSLOT) key = IR(key->op1);
230 lj_ir_kvalue(J->L, &keyv, key); 228 lj_ir_kvalue(J->L, &keyv, key);
231 tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv); 229 tv = lj_tab_get(J->L, ir_ktab(IR(ir->op1)), &keyv);
232 if (itype2irt(tv) != irt_type(fins->t)) 230 if (tvispri(tv))
233 return 0; /* Type instability in loop-carried dependency. */ 231 return TREF_PRI(itype2irt(tv));
234 if (irt_isnum(fins->t)) 232 else if (tvisnum(tv))
235 return lj_ir_knum_u64(J, tv->u64); 233 return lj_ir_knum_u64(J, tv->u64);
236 else if (LJ_DUALNUM && irt_isint(fins->t)) 234 else if (tvisint(tv))
237 return lj_ir_kint(J, intV(tv)); 235 return lj_ir_kint(J, intV(tv));
238 else 236 else if (tvisgcv(tv))
239 return lj_ir_kstr(J, strV(tv)); 237 return lj_ir_kstr(J, strV(tv));
240 } 238 }
241 /* Othwerwise: don't intern as a constant. */ 239 /* Othwerwise: don't intern as a constant. */