summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index c3b0a082..28758013 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -154,7 +154,7 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);
154#define gcstep_barrier(J, ref) \ 154#define gcstep_barrier(J, ref) \
155 ((ref) < J->chain[IR_LOOP] && \ 155 ((ref) < J->chain[IR_LOOP] && \
156 (J->chain[IR_SNEW] || J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ 156 (J->chain[IR_SNEW] || J->chain[IR_TNEW] || J->chain[IR_TDUP] || \
157 J->chain[IR_CNEW] || J->chain[IR_CNEWP] || J->chain[IR_TOSTR])) 157 J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR]))
158 158
159/* -- Constant folding for FP numbers ------------------------------------- */ 159/* -- Constant folding for FP numbers ------------------------------------- */
160 160
@@ -307,7 +307,7 @@ static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op)
307 case IR_BOR: k1 |= k2; break; 307 case IR_BOR: k1 |= k2; break;
308 case IR_BXOR: k1 ^= k2; break; 308 case IR_BXOR: k1 ^= k2; break;
309#endif 309#endif
310 default: lua_assert(0); break; 310 default: UNUSED(k2); lua_assert(0); break;
311 } 311 }
312 return k1; 312 return k1;
313} 313}
@@ -1765,18 +1765,28 @@ LJFOLDF(fload_cdata_typeid_kgc)
1765 return NEXTFOLD; 1765 return NEXTFOLD;
1766} 1766}
1767 1767
1768/* The content of int64 cdata objects is immutable. */
1769LJFOLD(FLOAD KGC IRFL_CDATA_INT64)
1770LJFOLDF(fload_cdata_int64_kgc)
1771{
1772 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1773 return INT64FOLD(*(uint64_t *)cdataptr(ir_kcdata(fleft)));
1774 return NEXTFOLD;
1775}
1776
1768LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) 1777LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID)
1769LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID) 1778LJFOLD(FLOAD CNEWI IRFL_CDATA_TYPEID)
1770LJFOLDF(fload_cdata_typeid_cnew) 1779LJFOLDF(fload_cdata_typeid_cnew)
1771{ 1780{
1772 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1781 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1773 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWP op1 is const. */ 1782 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWI op1 is const. */
1774 return NEXTFOLD; 1783 return NEXTFOLD;
1775} 1784}
1776 1785
1777/* Pointer cdata objects are immutable. */ 1786/* Pointer and int64 cdata objects are immutable. */
1778LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR) 1787LJFOLD(FLOAD CNEWI IRFL_CDATA_PTR)
1779LJFOLDF(fload_cdata_ptr_cnew) 1788LJFOLD(FLOAD CNEWI IRFL_CDATA_INT64)
1789LJFOLDF(fload_cdata_ptr_int64_cnew)
1780{ 1790{
1781 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1791 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1782 return fleft->op2; /* Fold even across PHI to avoid allocations. */ 1792 return fleft->op2; /* Fold even across PHI to avoid allocations. */
@@ -1786,6 +1796,7 @@ LJFOLDF(fload_cdata_ptr_cnew)
1786LJFOLD(FLOAD any IRFL_STR_LEN) 1796LJFOLD(FLOAD any IRFL_STR_LEN)
1787LJFOLD(FLOAD any IRFL_CDATA_TYPEID) 1797LJFOLD(FLOAD any IRFL_CDATA_TYPEID)
1788LJFOLD(FLOAD any IRFL_CDATA_PTR) 1798LJFOLD(FLOAD any IRFL_CDATA_PTR)
1799LJFOLD(FLOAD any IRFL_CDATA_INT64)
1789LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ 1800LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */
1790LJFOLDX(lj_opt_cse) 1801LJFOLDX(lj_opt_cse)
1791 1802