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.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 74b15f32..d2c20546 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -153,7 +153,7 @@ typedef IRRef (LJ_FASTCALL *FoldFunc)(jit_State *J);
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_SNEW] || 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_CNEW] || J->chain[IR_CNEWI] || J->chain[IR_TOSTR])) 156 J->chain[IR_CNEW] || J->chain[IR_CNEWP] || J->chain[IR_TOSTR]))
157 157
158/* -- Constant folding for FP numbers ------------------------------------- */ 158/* -- Constant folding for FP numbers ------------------------------------- */
159 159
@@ -1587,35 +1587,26 @@ LJFOLDF(fload_str_len_snew)
1587 1587
1588/* The C type ID of cdata objects is immutable. */ 1588/* The C type ID of cdata objects is immutable. */
1589LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) 1589LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID)
1590LJFOLD(FLOAD CNEWI IRFL_CDATA_TYPEID) 1590LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID)
1591LJFOLDF(fload_cdata_typeid_cnewi) 1591LJFOLDF(fload_cdata_typeid_cnewi)
1592{ 1592{
1593 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) 1593 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1594 return fleft->op2; /* No PHI barrier needed. CNEW/CNEWI op2 is const. */ 1594 return fleft->op1; /* No PHI barrier needed. CNEW/CNEWP op1 is const. */
1595 return NEXTFOLD; 1595 return NEXTFOLD;
1596} 1596}
1597 1597
1598/* Fixed initializers in cdata objects are immutable. */ 1598/* Pointer cdata objects are immutable. */
1599LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT1) 1599LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR)
1600LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_4) 1600LJFOLDF(fload_cdata_ptr_cnewi)
1601LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_8)
1602LJFOLDF(fload_cdata_init_cnew)
1603{ 1601{
1604 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) { 1602 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD))
1605 IRIns *ir = fleft; 1603 return fleft->op2; /* Fold even across PHI to avoid allocations. */
1606 /* Fold even across PHI to avoid expensive allocations. */
1607 lua_assert(ir->op1 != REF_NIL);
1608 if (IR(ir->op1)->o == IR_CARG) ir = IR(ir->op1);
1609 return fins->op2 == IRFL_CDATA_INIT1 ? ir->op1 : ir->op2;
1610 }
1611 return NEXTFOLD; 1604 return NEXTFOLD;
1612} 1605}
1613 1606
1614LJFOLD(FLOAD any IRFL_STR_LEN) 1607LJFOLD(FLOAD any IRFL_STR_LEN)
1615LJFOLD(FLOAD any IRFL_CDATA_TYPEID) 1608LJFOLD(FLOAD any IRFL_CDATA_TYPEID)
1616LJFOLD(FLOAD any IRFL_CDATA_INIT1) 1609LJFOLD(FLOAD any IRFL_CDATA_PTR)
1617LJFOLD(FLOAD any IRFL_CDATA_INIT2_4)
1618LJFOLD(FLOAD any IRFL_CDATA_INIT2_8)
1619LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ 1610LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */
1620LJFOLDX(lj_opt_cse) 1611LJFOLDX(lj_opt_cse)
1621 1612