aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2021-09-20 14:40:23 +0200
committerMike Pall <mike>2021-09-20 14:40:23 +0200
commit28440544ba7fc494ecc822c37750991a101e41cd (patch)
treefa4922a1aad29b55800b06ae301bbb1969613d07
parent003f68565d2f06b2ad2029db002e393d020c034c (diff)
downloadluajit-28440544ba7fc494ecc822c37750991a101e41cd.tar.gz
luajit-28440544ba7fc494ecc822c37750991a101e41cd.tar.bz2
luajit-28440544ba7fc494ecc822c37750991a101e41cd.zip
Don't bail out to interpreter to JLOOP originating from ITERN.
Otherwise forward progress is not guaranteed. Reported by Yichun Zhang.
-rw-r--r--src/lj_record.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index e51c98ba..7f7a0b63 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -2765,9 +2765,11 @@ void lj_record_setup(jit_State *J)
2765 } 2765 }
2766 lj_snap_replay(J, T); 2766 lj_snap_replay(J, T);
2767 sidecheck: 2767 sidecheck:
2768 if (traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] || 2768 if ((traceref(J, J->cur.root)->nchild >= J->param[JIT_P_maxside] ||
2769 T->snap[J->exitno].count >= J->param[JIT_P_hotexit] + 2769 T->snap[J->exitno].count >= J->param[JIT_P_hotexit] +
2770 J->param[JIT_P_tryside]) { 2770 J->param[JIT_P_tryside]) &&
2771 !(bc_op(*J->pc) == BC_JLOOP &&
2772 bc_op(traceref(J, bc_d(*J->pc))->startins) == BC_ITERN)) {
2771 lj_record_stop(J, LJ_TRLINK_INTERP, 0); 2773 lj_record_stop(J, LJ_TRLINK_INTERP, 0);
2772 } 2774 }
2773 } else { /* Root trace. */ 2775 } else { /* Root trace. */