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;