diff options
-rw-r--r-- | src/lj_opt_mem.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 400fb48e..21c861bb 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c | |||
@@ -749,21 +749,19 @@ retry: | |||
749 | case ALIAS_MUST: | 749 | case ALIAS_MUST: |
750 | /* Emit conversion if the loaded type doesn't match the forwarded type. */ | 750 | /* Emit conversion if the loaded type doesn't match the forwarded type. */ |
751 | if (!irt_sametype(fins->t, IR(store->op2)->t)) { | 751 | if (!irt_sametype(fins->t, IR(store->op2)->t)) { |
752 | IRType st = irt_type(fins->t); | 752 | IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t); |
753 | if (st == IRT_I8 || st == IRT_I16) { /* Trunc + sign-extend. */ | 753 | if (dt == IRT_I8 || dt == IRT_I16) { /* Trunc + sign-extend. */ |
754 | st |= IRCONV_SEXT; | 754 | st = dt | IRCONV_SEXT; |
755 | } else if (st == IRT_U8 || st == IRT_U16) { /* Trunc + zero-extend. */ | 755 | dt = IRT_INT; |
756 | } else if (st == IRT_INT) { | 756 | } else if (dt == IRT_U8 || dt == IRT_U16) { /* Trunc + zero-extend. */ |
757 | st = irt_type(IR(store->op2)->t); /* Needs dummy CONV.int.*. */ | 757 | st = dt; |
758 | } else { /* I64/U64 are boxed, U32 is hidden behind a CONV.num.u32. */ | 758 | dt = IRT_INT; |
759 | goto store_fwd; | ||
760 | } | 759 | } |
761 | fins->ot = IRTI(IR_CONV); | 760 | fins->ot = IRT(IR_CONV, dt); |
762 | fins->op1 = store->op2; | 761 | fins->op1 = store->op2; |
763 | fins->op2 = (IRT_INT<<5)|st; | 762 | fins->op2 = (dt<<5)|st; |
764 | return RETRYFOLD; | 763 | return RETRYFOLD; |
765 | } | 764 | } |
766 | store_fwd: | ||
767 | return store->op2; /* Store forwarding. */ | 765 | return store->op2; /* Store forwarding. */ |
768 | } | 766 | } |
769 | ref = store->prev; | 767 | ref = store->prev; |