diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 27 |
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. */ |
1589 | LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) | 1589 | LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) |
1590 | LJFOLD(FLOAD CNEWI IRFL_CDATA_TYPEID) | 1590 | LJFOLD(FLOAD CNEWP IRFL_CDATA_TYPEID) |
1591 | LJFOLDF(fload_cdata_typeid_cnewi) | 1591 | LJFOLDF(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. */ |
1599 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT1) | 1599 | LJFOLD(FLOAD CNEWP IRFL_CDATA_PTR) |
1600 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_4) | 1600 | LJFOLDF(fload_cdata_ptr_cnewi) |
1601 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_8) | ||
1602 | LJFOLDF(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 | ||
1614 | LJFOLD(FLOAD any IRFL_STR_LEN) | 1607 | LJFOLD(FLOAD any IRFL_STR_LEN) |
1615 | LJFOLD(FLOAD any IRFL_CDATA_TYPEID) | 1608 | LJFOLD(FLOAD any IRFL_CDATA_TYPEID) |
1616 | LJFOLD(FLOAD any IRFL_CDATA_INIT1) | 1609 | LJFOLD(FLOAD any IRFL_CDATA_PTR) |
1617 | LJFOLD(FLOAD any IRFL_CDATA_INIT2_4) | ||
1618 | LJFOLD(FLOAD any IRFL_CDATA_INIT2_8) | ||
1619 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ | 1610 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ |
1620 | LJFOLDX(lj_opt_cse) | 1611 | LJFOLDX(lj_opt_cse) |
1621 | 1612 | ||