diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index c8cdc3e5..d5f5290c 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c @@ -740,21 +740,19 @@ retry: case ALIAS_MUST: /* Emit conversion if the loaded type doesn't match the forwarded type. */ if (!irt_sametype(fins->t, IR(store->op2)->t)) { - IRType st = irt_type(fins->t); - if (st == IRT_I8 || st == IRT_I16) { /* Trunc + sign-extend. */ - st |= IRCONV_SEXT; - } else if (st == IRT_U8 || st == IRT_U16) { /* Trunc + zero-extend. */ - } else if (st == IRT_INT) { - st = irt_type(IR(store->op2)->t); /* Needs dummy CONV.int.*. */ - } else { /* I64/U64 are boxed, U32 is hidden behind a CONV.num.u32. */ - goto store_fwd; + IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t); + if (dt == IRT_I8 || dt == IRT_I16) { /* Trunc + sign-extend. */ + st = dt | IRCONV_SEXT; + dt = IRT_INT; + } else if (dt == IRT_U8 || dt == IRT_U16) { /* Trunc + zero-extend. */ + st = dt; + dt = IRT_INT; } - fins->ot = IRTI(IR_CONV); + fins->ot = IRT(IR_CONV, dt); fins->op1 = store->op2; - fins->op2 = (IRT_INT<<5)|st; + fins->op2 = (dt<<5)|st; return RETRYFOLD; } - store_fwd: return store->op2; /* Store forwarding. */ } ref = store->prev;