diff options
author | Mike Pall <mike> | 2021-09-20 14:40:23 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2021-09-20 14:40:23 +0200 |
commit | 28440544ba7fc494ecc822c37750991a101e41cd (patch) | |
tree | fa4922a1aad29b55800b06ae301bbb1969613d07 | |
parent | 003f68565d2f06b2ad2029db002e393d020c034c (diff) | |
download | luajit-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.c | 8 |
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. */ |