aboutsummaryrefslogtreecommitdiff
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.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index e8e81a3e..e61a6533 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -152,8 +152,8 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);
152*/ 152*/
153#define gcstep_barrier(J, ref) \ 153#define gcstep_barrier(J, ref) \
154 ((ref) < J->chain[IR_LOOP] && \ 154 ((ref) < J->chain[IR_LOOP] && \
155 (J->chain[IR_TNEW] || J->chain[IR_TDUP] || \ 155 (J->chain[IR_SNEW] || J->chain[IR_TNEW] || J->chain[IR_TDUP] || \
156 J->chain[IR_SNEW] || J->chain[IR_TOSTR])) 156 J->chain[IR_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR]))
157 157
158/* -- Constant folding ---------------------------------------------------- */ 158/* -- Constant folding ---------------------------------------------------- */
159 159
@@ -1477,7 +1477,37 @@ LJFOLDF(fload_str_len_snew)
1477 return NEXTFOLD; 1477 return NEXTFOLD;
1478} 1478}
1479 1479
1480/* The C type ID of cdata objects is immutable. */
1481LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID)
1482LJFOLD(FLOAD CNEWI IRFL_CDATA_TYPEID)
1483LJFOLDF(fload_cdata_typeid_cnewi)
1484{
1485 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1486 return fleft->op2; /* No PHI barrier needed. CNEW/CNEWI op2 is const. */
1487 return NEXTFOLD;
1488}
1489
1490/* Fixed initializers in cdata objects are immutable. */
1491LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT1)
1492LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_4)
1493LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_8)
1494LJFOLDF(fload_cdata_init_cnew)
1495{
1496 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
1497 IRIns *ir = fleft;
1498 PHIBARRIER(fleft);
1499 lua_assert(ir->op1 != REF_NIL);
1500 if (IR(ir->op1)->o == IR_CARG) ir = IR(ir->op1);
1501 return fins->op2 == IRFL_CDATA_INIT1 ? ir->op1 : ir->op2;
1502 }
1503 return NEXTFOLD;
1504}
1505
1480LJFOLD(FLOAD any IRFL_STR_LEN) 1506LJFOLD(FLOAD any IRFL_STR_LEN)
1507LJFOLD(FLOAD any IRFL_CDATA_TYPEID)
1508LJFOLD(FLOAD any IRFL_CDATA_INIT1)
1509LJFOLD(FLOAD any IRFL_CDATA_INIT2_4)
1510LJFOLD(FLOAD any IRFL_CDATA_INIT2_8)
1481LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ 1511LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */
1482LJFOLDX(lj_opt_cse) 1512LJFOLDX(lj_opt_cse)
1483 1513
@@ -1564,6 +1594,7 @@ LJFOLD(CALLL any any) /* Safeguard fallback. */
1564LJFOLD(RETF any any) /* Modifies BASE. */ 1594LJFOLD(RETF any any) /* Modifies BASE. */
1565LJFOLD(TNEW any any) 1595LJFOLD(TNEW any any)
1566LJFOLD(TDUP any) 1596LJFOLD(TDUP any)
1597LJFOLD(CNEW any any)
1567LJFOLDX(lj_ir_emit) 1598LJFOLDX(lj_ir_emit)
1568 1599
1569/* ------------------------------------------------------------------------ */ 1600/* ------------------------------------------------------------------------ */