diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 35 |
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. */ | ||
1481 | LJFOLD(FLOAD CNEW IRFL_CDATA_TYPEID) | ||
1482 | LJFOLD(FLOAD CNEWI IRFL_CDATA_TYPEID) | ||
1483 | LJFOLDF(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. */ | ||
1491 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT1) | ||
1492 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_4) | ||
1493 | LJFOLD(FLOAD CNEWI IRFL_CDATA_INIT2_8) | ||
1494 | LJFOLDF(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 | |||
1480 | LJFOLD(FLOAD any IRFL_STR_LEN) | 1506 | LJFOLD(FLOAD any IRFL_STR_LEN) |
1507 | LJFOLD(FLOAD any IRFL_CDATA_TYPEID) | ||
1508 | LJFOLD(FLOAD any IRFL_CDATA_INIT1) | ||
1509 | LJFOLD(FLOAD any IRFL_CDATA_INIT2_4) | ||
1510 | LJFOLD(FLOAD any IRFL_CDATA_INIT2_8) | ||
1481 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ | 1511 | LJFOLD(VLOAD any any) /* Vararg loads have no corresponding stores. */ |
1482 | LJFOLDX(lj_opt_cse) | 1512 | LJFOLDX(lj_opt_cse) |
1483 | 1513 | ||
@@ -1564,6 +1594,7 @@ LJFOLD(CALLL any any) /* Safeguard fallback. */ | |||
1564 | LJFOLD(RETF any any) /* Modifies BASE. */ | 1594 | LJFOLD(RETF any any) /* Modifies BASE. */ |
1565 | LJFOLD(TNEW any any) | 1595 | LJFOLD(TNEW any any) |
1566 | LJFOLD(TDUP any) | 1596 | LJFOLD(TDUP any) |
1597 | LJFOLD(CNEW any any) | ||
1567 | LJFOLDX(lj_ir_emit) | 1598 | LJFOLDX(lj_ir_emit) |
1568 | 1599 | ||
1569 | /* ------------------------------------------------------------------------ */ | 1600 | /* ------------------------------------------------------------------------ */ |