mirror of
https://github.com/love2d/megasource.git
synced 2026-08-19 04:05:09 +02:00
Update LuaJIT to the latest 2.1.0 source (1d8b747)
This commit is contained in:
+109
-81
@@ -2,7 +2,7 @@
|
||||
** FOLD: Constant Folding, Algebraic Simplifications and Reassociation.
|
||||
** ABCelim: Array Bounds Check Elimination.
|
||||
** CSE: Common-Subexpression Elimination.
|
||||
** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2020 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_opt_fold_c
|
||||
@@ -173,7 +173,6 @@ LJFOLD(ADD KNUM KNUM)
|
||||
LJFOLD(SUB KNUM KNUM)
|
||||
LJFOLD(MUL KNUM KNUM)
|
||||
LJFOLD(DIV KNUM KNUM)
|
||||
LJFOLD(ATAN2 KNUM KNUM)
|
||||
LJFOLD(LDEXP KNUM KNUM)
|
||||
LJFOLD(MIN KNUM KNUM)
|
||||
LJFOLD(MAX KNUM KNUM)
|
||||
@@ -213,11 +212,36 @@ LJFOLDF(kfold_fpmath)
|
||||
return lj_ir_knum(J, y);
|
||||
}
|
||||
|
||||
LJFOLD(CALLN KNUM any)
|
||||
LJFOLDF(kfold_fpcall1)
|
||||
{
|
||||
const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
|
||||
if (CCI_TYPE(ci) == IRT_NUM) {
|
||||
double y = ((double (*)(double))ci->func)(knumleft);
|
||||
return lj_ir_knum(J, y);
|
||||
}
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(CALLN CARG IRCALL_atan2)
|
||||
LJFOLDF(kfold_fpcall2)
|
||||
{
|
||||
if (irref_isk(fleft->op1) && irref_isk(fleft->op2)) {
|
||||
const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
|
||||
double a = ir_knum(IR(fleft->op1))->n;
|
||||
double b = ir_knum(IR(fleft->op2))->n;
|
||||
double y = ((double (*)(double, double))ci->func)(a, b);
|
||||
return lj_ir_knum(J, y);
|
||||
}
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(POW KNUM KINT)
|
||||
LJFOLD(POW KNUM KNUM)
|
||||
LJFOLDF(kfold_numpow)
|
||||
{
|
||||
lua_Number a = knumleft;
|
||||
lua_Number b = (lua_Number)fright->i;
|
||||
lua_Number b = fright->o == IR_KINT ? (lua_Number)fright->i : knumright;
|
||||
lua_Number y = lj_vm_foldarith(a, b, IR_POW - IR_ADD);
|
||||
return lj_ir_knum(J, y);
|
||||
}
|
||||
@@ -258,7 +282,7 @@ static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)
|
||||
case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break;
|
||||
case IR_MIN: k1 = k1 < k2 ? k1 : k2; break;
|
||||
case IR_MAX: k1 = k1 > k2 ? k1 : k2; break;
|
||||
default: lua_assert(0); break;
|
||||
default: lj_assertX(0, "bad IR op %d", op); break;
|
||||
}
|
||||
return k1;
|
||||
}
|
||||
@@ -330,7 +354,7 @@ LJFOLDF(kfold_intcomp)
|
||||
case IR_ULE: return CONDFOLD((uint32_t)a <= (uint32_t)b);
|
||||
case IR_ABC:
|
||||
case IR_UGT: return CONDFOLD((uint32_t)a > (uint32_t)b);
|
||||
default: lua_assert(0); return FAILFOLD;
|
||||
default: lj_assertJ(0, "bad IR op %d", fins->o); return FAILFOLD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,10 +368,12 @@ LJFOLDF(kfold_intcomp0)
|
||||
|
||||
/* -- Constant folding for 64 bit integers -------------------------------- */
|
||||
|
||||
static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op)
|
||||
static uint64_t kfold_int64arith(jit_State *J, uint64_t k1, uint64_t k2,
|
||||
IROp op)
|
||||
{
|
||||
switch (op) {
|
||||
UNUSED(J);
|
||||
#if LJ_HASFFI
|
||||
switch (op) {
|
||||
case IR_ADD: k1 += k2; break;
|
||||
case IR_SUB: k1 -= k2; break;
|
||||
case IR_MUL: k1 *= k2; break;
|
||||
@@ -359,9 +385,12 @@ static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op)
|
||||
case IR_BSAR: k1 >>= (k2 & 63); break;
|
||||
case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 63)); break;
|
||||
case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 63)); break;
|
||||
#endif
|
||||
default: UNUSED(k2); lua_assert(0); break;
|
||||
default: lj_assertJ(0, "bad IR op %d", op); break;
|
||||
}
|
||||
#else
|
||||
UNUSED(k2); UNUSED(op);
|
||||
lj_assertJ(0, "FFI IR op without FFI");
|
||||
#endif
|
||||
return k1;
|
||||
}
|
||||
|
||||
@@ -373,7 +402,7 @@ LJFOLD(BOR KINT64 KINT64)
|
||||
LJFOLD(BXOR KINT64 KINT64)
|
||||
LJFOLDF(kfold_int64arith)
|
||||
{
|
||||
return INT64FOLD(kfold_int64arith(ir_k64(fleft)->u64,
|
||||
return INT64FOLD(kfold_int64arith(J, ir_k64(fleft)->u64,
|
||||
ir_k64(fright)->u64, (IROp)fins->o));
|
||||
}
|
||||
|
||||
@@ -395,7 +424,7 @@ LJFOLDF(kfold_int64arith2)
|
||||
}
|
||||
return INT64FOLD(k1);
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -411,7 +440,7 @@ LJFOLDF(kfold_int64shift)
|
||||
int32_t sh = (fright->i & 63);
|
||||
return INT64FOLD(lj_carith_shift64(k, sh, fins->o - IR_BSHL));
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -421,7 +450,7 @@ LJFOLDF(kfold_bnot64)
|
||||
#if LJ_HASFFI
|
||||
return INT64FOLD(~ir_k64(fleft)->u64);
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -431,7 +460,7 @@ LJFOLDF(kfold_bswap64)
|
||||
#if LJ_HASFFI
|
||||
return INT64FOLD(lj_bswap64(ir_k64(fleft)->u64));
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -456,10 +485,10 @@ LJFOLDF(kfold_int64comp)
|
||||
case IR_UGE: return CONDFOLD(a >= b);
|
||||
case IR_ULE: return CONDFOLD(a <= b);
|
||||
case IR_UGT: return CONDFOLD(a > b);
|
||||
default: lua_assert(0); return FAILFOLD;
|
||||
default: lj_assertJ(0, "bad IR op %d", fins->o); return FAILFOLD;
|
||||
}
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -471,7 +500,7 @@ LJFOLDF(kfold_int64comp0)
|
||||
return DROPFOLD;
|
||||
return NEXTFOLD;
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -496,7 +525,7 @@ LJFOLD(STRREF KGC KINT)
|
||||
LJFOLDF(kfold_strref)
|
||||
{
|
||||
GCstr *str = ir_kstr(fleft);
|
||||
lua_assert((MSize)fright->i <= str->len);
|
||||
lj_assertJ((MSize)fright->i <= str->len, "bad string ref");
|
||||
return lj_ir_kkptr(J, (char *)strdata(str) + fright->i);
|
||||
}
|
||||
|
||||
@@ -592,8 +621,9 @@ LJFOLDF(bufput_kgc)
|
||||
LJFOLD(BUFSTR any any)
|
||||
LJFOLDF(bufstr_kfold_cse)
|
||||
{
|
||||
lua_assert(fleft->o == IR_BUFHDR || fleft->o == IR_BUFPUT ||
|
||||
fleft->o == IR_CALLL);
|
||||
lj_assertJ(fleft->o == IR_BUFHDR || fleft->o == IR_BUFPUT ||
|
||||
fleft->o == IR_CALLL,
|
||||
"bad buffer constructor IR op %d", fleft->o);
|
||||
if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
|
||||
if (fleft->o == IR_BUFHDR) { /* No put operations? */
|
||||
if (!(fleft->op2 & IRBUFHDR_APPEND)) /* Empty buffer? */
|
||||
@@ -613,8 +643,9 @@ LJFOLDF(bufstr_kfold_cse)
|
||||
while (ref) {
|
||||
IRIns *irs = IR(ref), *ira = fleft, *irb = IR(irs->op1);
|
||||
while (ira->o == irb->o && ira->op2 == irb->op2) {
|
||||
lua_assert(ira->o == IR_BUFHDR || ira->o == IR_BUFPUT ||
|
||||
ira->o == IR_CALLL || ira->o == IR_CARG);
|
||||
lj_assertJ(ira->o == IR_BUFHDR || ira->o == IR_BUFPUT ||
|
||||
ira->o == IR_CALLL || ira->o == IR_CARG,
|
||||
"bad buffer constructor IR op %d", ira->o);
|
||||
if (ira->o == IR_BUFHDR && !(ira->op2 & IRBUFHDR_APPEND))
|
||||
return ref; /* CSE succeeded. */
|
||||
if (ira->o == IR_CALLL && ira->op2 == IRCALL_lj_buf_puttab)
|
||||
@@ -673,7 +704,7 @@ LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar)
|
||||
LJFOLDF(bufput_kfold_fmt)
|
||||
{
|
||||
IRIns *irc = IR(fleft->op1);
|
||||
lua_assert(irref_isk(irc->op2)); /* SFormat must be const. */
|
||||
lj_assertJ(irref_isk(irc->op2), "SFormat must be const");
|
||||
if (irref_isk(fleft->op2)) {
|
||||
SFormat sf = (SFormat)IR(irc->op2)->i;
|
||||
IRIns *ira = IR(fleft->op2);
|
||||
@@ -1054,7 +1085,7 @@ LJFOLDF(simplify_nummuldiv_negneg)
|
||||
}
|
||||
|
||||
LJFOLD(POW any KINT)
|
||||
LJFOLDF(simplify_numpow_xk)
|
||||
LJFOLDF(simplify_numpow_xkint)
|
||||
{
|
||||
int32_t k = fright->i;
|
||||
TRef ref = fins->op1;
|
||||
@@ -1083,13 +1114,22 @@ LJFOLDF(simplify_numpow_xk)
|
||||
return ref;
|
||||
}
|
||||
|
||||
LJFOLD(POW any KNUM)
|
||||
LJFOLDF(simplify_numpow_xknum)
|
||||
{
|
||||
if (knumright == 0.5) /* x ^ 0.5 ==> sqrt(x) */
|
||||
return emitir(IRTN(IR_FPMATH), fins->op1, IRFPM_SQRT);
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(POW KNUM any)
|
||||
LJFOLDF(simplify_numpow_kx)
|
||||
{
|
||||
lua_Number n = knumleft;
|
||||
if (n == 2.0) { /* 2.0 ^ i ==> ldexp(1.0, tonum(i)) */
|
||||
fins->o = IR_CONV;
|
||||
if (n == 2.0 && irt_isint(fright->t)) { /* 2.0 ^ i ==> ldexp(1.0, i) */
|
||||
#if LJ_TARGET_X86ORX64
|
||||
/* Different IR_LDEXP calling convention on x86/x64 requires conversion. */
|
||||
fins->o = IR_CONV;
|
||||
fins->op1 = fins->op2;
|
||||
fins->op2 = IRCONV_NUM_INT;
|
||||
fins->op2 = (IRRef1)lj_opt_fold(J);
|
||||
@@ -1183,10 +1223,10 @@ LJFOLDF(simplify_tobit_conv)
|
||||
{
|
||||
/* Fold even across PHI to avoid expensive num->int conversions in loop. */
|
||||
if ((fleft->op2 & IRCONV_SRCMASK) == IRT_INT) {
|
||||
lua_assert(irt_isnum(fleft->t));
|
||||
lj_assertJ(irt_isnum(fleft->t), "expected TOBIT number arg");
|
||||
return fleft->op1;
|
||||
} else if ((fleft->op2 & IRCONV_SRCMASK) == IRT_U32) {
|
||||
lua_assert(irt_isnum(fleft->t));
|
||||
lj_assertJ(irt_isnum(fleft->t), "expected TOBIT number arg");
|
||||
fins->o = IR_CONV;
|
||||
fins->op1 = fleft->op1;
|
||||
fins->op2 = (IRT_INT<<5)|IRT_U32;
|
||||
@@ -1226,7 +1266,7 @@ LJFOLDF(simplify_conv_sext)
|
||||
/* Use scalar evolution analysis results to strength-reduce sign-extension. */
|
||||
if (ref == J->scev.idx) {
|
||||
IRRef lo = J->scev.dir ? J->scev.start : J->scev.stop;
|
||||
lua_assert(irt_isint(J->scev.t));
|
||||
lj_assertJ(irt_isint(J->scev.t), "only int SCEV supported");
|
||||
if (lo && IR(lo)->o == IR_KINT && IR(lo)->i + ofs >= 0) {
|
||||
ok_reduce:
|
||||
#if LJ_TARGET_X64
|
||||
@@ -1302,7 +1342,8 @@ LJFOLDF(narrow_convert)
|
||||
/* Narrowing ignores PHIs and repeating it inside the loop is not useful. */
|
||||
if (J->chain[IR_LOOP])
|
||||
return NEXTFOLD;
|
||||
lua_assert(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT);
|
||||
lj_assertJ(fins->o != IR_CONV || (fins->op2&IRCONV_CONVMASK) != IRCONV_TOBIT,
|
||||
"unexpected CONV TOBIT");
|
||||
return lj_opt_narrow_convert(J);
|
||||
}
|
||||
|
||||
@@ -1408,7 +1449,7 @@ LJFOLDF(simplify_intmul_k64)
|
||||
return simplify_intmul_k(J, (int32_t)ir_kint64(fright)->u64);
|
||||
return NEXTFOLD;
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1416,7 +1457,7 @@ LJFOLD(MOD any KINT)
|
||||
LJFOLDF(simplify_intmod_k)
|
||||
{
|
||||
int32_t k = fright->i;
|
||||
lua_assert(k != 0);
|
||||
lj_assertJ(k != 0, "integer mod 0");
|
||||
if (k > 0 && (k & (k-1)) == 0) { /* i % (2^k) ==> i & (2^k-1) */
|
||||
fins->o = IR_BAND;
|
||||
fins->op2 = lj_ir_kint(J, k-1);
|
||||
@@ -1666,7 +1707,8 @@ LJFOLDF(simplify_shiftk_andk)
|
||||
fins->ot = IRTI(IR_BAND);
|
||||
return RETRYFOLD;
|
||||
} else if (irk->o == IR_KINT64) {
|
||||
uint64_t k = kfold_int64arith(ir_k64(irk)->u64, fright->i, (IROp)fins->o);
|
||||
uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, fright->i,
|
||||
(IROp)fins->o);
|
||||
IROpT ot = fleft->ot;
|
||||
fins->op1 = fleft->op1;
|
||||
fins->op1 = (IRRef1)lj_opt_fold(J);
|
||||
@@ -1714,8 +1756,8 @@ LJFOLDF(simplify_andor_k64)
|
||||
IRIns *irk = IR(fleft->op2);
|
||||
PHIBARRIER(fleft);
|
||||
if (irk->o == IR_KINT64) {
|
||||
uint64_t k = kfold_int64arith(ir_k64(irk)->u64,
|
||||
ir_k64(fright)->u64, (IROp)fins->o);
|
||||
uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, ir_k64(fright)->u64,
|
||||
(IROp)fins->o);
|
||||
/* (i | k1) & k2 ==> i & k2, if (k1 & k2) == 0. */
|
||||
/* (i & k1) | k2 ==> i | k2, if (k1 | k2) == -1. */
|
||||
if (k == (fins->o == IR_BAND ? (uint64_t)0 : ~(uint64_t)0)) {
|
||||
@@ -1725,7 +1767,7 @@ LJFOLDF(simplify_andor_k64)
|
||||
}
|
||||
return NEXTFOLD;
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1761,8 +1803,8 @@ LJFOLDF(reassoc_intarith_k64)
|
||||
#if LJ_HASFFI
|
||||
IRIns *irk = IR(fleft->op2);
|
||||
if (irk->o == IR_KINT64) {
|
||||
uint64_t k = kfold_int64arith(ir_k64(irk)->u64,
|
||||
ir_k64(fright)->u64, (IROp)fins->o);
|
||||
uint64_t k = kfold_int64arith(J, ir_k64(irk)->u64, ir_k64(fright)->u64,
|
||||
(IROp)fins->o);
|
||||
PHIBARRIER(fleft);
|
||||
fins->op1 = fleft->op1;
|
||||
fins->op2 = (IRRef1)lj_ir_kint64(J, k);
|
||||
@@ -1770,12 +1812,10 @@ LJFOLDF(reassoc_intarith_k64)
|
||||
}
|
||||
return NEXTFOLD;
|
||||
#else
|
||||
UNUSED(J); lua_assert(0); return FAILFOLD;
|
||||
UNUSED(J); lj_assertJ(0, "FFI IR op without FFI"); return FAILFOLD;
|
||||
#endif
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN any)
|
||||
LJFOLD(MAX MAX any)
|
||||
LJFOLD(BAND BAND any)
|
||||
LJFOLD(BOR BOR any)
|
||||
LJFOLDF(reassoc_dup)
|
||||
@@ -1785,6 +1825,15 @@ LJFOLDF(reassoc_dup)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN any)
|
||||
LJFOLD(MAX MAX any)
|
||||
LJFOLDF(reassoc_dup_minmax)
|
||||
{
|
||||
if (fins->op2 == fleft->op2)
|
||||
return LEFTFOLD; /* (a o b) o b ==> a o b */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(BXOR BXOR any)
|
||||
LJFOLDF(reassoc_bxor)
|
||||
{
|
||||
@@ -1823,23 +1872,12 @@ LJFOLDF(reassoc_shift)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MIN KNUM)
|
||||
LJFOLD(MAX MAX KNUM)
|
||||
LJFOLD(MIN MIN KINT)
|
||||
LJFOLD(MAX MAX KINT)
|
||||
LJFOLDF(reassoc_minmax_k)
|
||||
{
|
||||
IRIns *irk = IR(fleft->op2);
|
||||
if (irk->o == IR_KNUM) {
|
||||
lua_Number a = ir_knum(irk)->n;
|
||||
lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD);
|
||||
if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
|
||||
return LEFTFOLD;
|
||||
PHIBARRIER(fleft);
|
||||
fins->op1 = fleft->op1;
|
||||
fins->op2 = (IRRef1)lj_ir_knum(J, y);
|
||||
return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */
|
||||
} else if (irk->o == IR_KINT) {
|
||||
if (irk->o == IR_KINT) {
|
||||
int32_t a = irk->i;
|
||||
int32_t y = kfold_intop(a, fright->i, fins->o);
|
||||
if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */
|
||||
@@ -1852,24 +1890,6 @@ LJFOLDF(reassoc_minmax_k)
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN MAX any)
|
||||
LJFOLD(MAX MIN any)
|
||||
LJFOLDF(reassoc_minmax_left)
|
||||
{
|
||||
if (fins->op2 == fleft->op1 || fins->op2 == fleft->op2)
|
||||
return RIGHTFOLD; /* (b o1 a) o2 b ==> b; (a o1 b) o2 b ==> b */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(MIN any MAX)
|
||||
LJFOLD(MAX any MIN)
|
||||
LJFOLDF(reassoc_minmax_right)
|
||||
{
|
||||
if (fins->op1 == fright->op1 || fins->op1 == fright->op2)
|
||||
return LEFTFOLD; /* a o2 (a o1 b) ==> a; a o2 (b o1 a) ==> a */
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
/* -- Array bounds check elimination -------------------------------------- */
|
||||
|
||||
/* Eliminate ABC across PHIs to handle t[i-1] forwarding case.
|
||||
@@ -1995,8 +2015,6 @@ LJFOLDF(comm_comp)
|
||||
|
||||
LJFOLD(BAND any any)
|
||||
LJFOLD(BOR any any)
|
||||
LJFOLD(MIN any any)
|
||||
LJFOLD(MAX any any)
|
||||
LJFOLDF(comm_dup)
|
||||
{
|
||||
if (fins->op1 == fins->op2) /* x o x ==> x */
|
||||
@@ -2004,6 +2022,15 @@ LJFOLDF(comm_dup)
|
||||
return fold_comm_swap(J);
|
||||
}
|
||||
|
||||
LJFOLD(MIN any any)
|
||||
LJFOLD(MAX any any)
|
||||
LJFOLDF(comm_dup_minmax)
|
||||
{
|
||||
if (fins->op1 == fins->op2) /* x o x ==> x */
|
||||
return LEFTFOLD;
|
||||
return NEXTFOLD;
|
||||
}
|
||||
|
||||
LJFOLD(BXOR any any)
|
||||
LJFOLDF(comm_bxor)
|
||||
{
|
||||
@@ -2040,7 +2067,7 @@ LJFOLDF(merge_eqne_snew_kgc)
|
||||
{
|
||||
GCstr *kstr = ir_kstr(fright);
|
||||
int32_t len = (int32_t)kstr->len;
|
||||
lua_assert(irt_isstr(fins->t));
|
||||
lj_assertJ(irt_isstr(fins->t), "bad equality IR type");
|
||||
|
||||
#if LJ_TARGET_UNALIGNED
|
||||
#define FOLD_SNEW_MAX_LEN 4 /* Handle string lengths 0, 1, 2, 3, 4. */
|
||||
@@ -2104,7 +2131,7 @@ LJFOLD(HLOAD KKPTR)
|
||||
LJFOLDF(kfold_hload_kkptr)
|
||||
{
|
||||
UNUSED(J);
|
||||
lua_assert(ir_kptr(fleft) == niltvg(J2G(J)));
|
||||
lj_assertJ(ir_kptr(fleft) == niltvg(J2G(J)), "expected niltv");
|
||||
return TREF_NIL;
|
||||
}
|
||||
|
||||
@@ -2114,8 +2141,8 @@ LJFOLDX(lj_opt_fwd_hload)
|
||||
LJFOLD(ULOAD any)
|
||||
LJFOLDX(lj_opt_fwd_uload)
|
||||
|
||||
LJFOLD(CALLL any IRCALL_lj_tab_len)
|
||||
LJFOLDX(lj_opt_fwd_tab_len)
|
||||
LJFOLD(ALEN any any)
|
||||
LJFOLDX(lj_opt_fwd_alen)
|
||||
|
||||
/* Upvalue refs are really loads, but there are no corresponding stores.
|
||||
** So CSE is ok for them, except for UREFO across a GC step (see below).
|
||||
@@ -2315,7 +2342,7 @@ LJFOLDF(fwd_sload)
|
||||
TRef tr = lj_opt_cse(J);
|
||||
return tref_ref(tr) < J->chain[IR_RETF] ? EMITFOLD : tr;
|
||||
} else {
|
||||
lua_assert(J->slot[fins->op1] != 0);
|
||||
lj_assertJ(J->slot[fins->op1] != 0, "uninitialized slot accessed");
|
||||
return J->slot[fins->op1];
|
||||
}
|
||||
}
|
||||
@@ -2430,8 +2457,9 @@ TRef LJ_FASTCALL lj_opt_fold(jit_State *J)
|
||||
IRRef ref;
|
||||
|
||||
if (LJ_UNLIKELY((J->flags & JIT_F_OPT_MASK) != JIT_F_OPT_DEFAULT)) {
|
||||
lua_assert(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) |
|
||||
JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT);
|
||||
lj_assertJ(((JIT_F_OPT_FOLD|JIT_F_OPT_FWD|JIT_F_OPT_CSE|JIT_F_OPT_DSE) |
|
||||
JIT_F_OPT_DEFAULT) == JIT_F_OPT_DEFAULT,
|
||||
"bad JIT_F_OPT_DEFAULT");
|
||||
/* Folding disabled? Chain to CSE, but not for loads/stores/allocs. */
|
||||
if (!(J->flags & JIT_F_OPT_FOLD) && irm_kind(lj_ir_mode[fins->o]) == IRM_N)
|
||||
return lj_opt_cse(J);
|
||||
@@ -2493,7 +2521,7 @@ retry:
|
||||
return lj_ir_kint(J, fins->i);
|
||||
if (ref == FAILFOLD)
|
||||
lj_trace_err(J, LJ_TRERR_GFAIL);
|
||||
lua_assert(ref == DROPFOLD);
|
||||
lj_assertJ(ref == DROPFOLD, "bad fold result");
|
||||
return REF_DROP;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user