aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2016-05-22 23:45:40 +0200
committerMike Pall <mike>2016-05-22 23:45:40 +0200
commita4067978b6d1c2a25d91d82b1b0d384d98abdbe5 (patch)
tree426d8278c1925e734c87dbda823f0cd7262b4ba8
parent3152ed98ea3d99579940eb5e72da687ce66792de (diff)
downloadluajit-a4067978b6d1c2a25d91d82b1b0d384d98abdbe5.tar.gz
luajit-a4067978b6d1c2a25d91d82b1b0d384d98abdbe5.tar.bz2
luajit-a4067978b6d1c2a25d91d82b1b0d384d98abdbe5.zip
Always walk IR constants in ascending order.
Prerequisite for embedding 64 bit constants directly in the IR. Contributed by Peter Cawley.
-rw-r--r--src/lj_opt_sink.c8
-rw-r--r--src/lj_record.c2
2 files changed, 7 insertions, 3 deletions
diff --git a/src/lj_opt_sink.c b/src/lj_opt_sink.c
index 975ee831..49e13784 100644
--- a/src/lj_opt_sink.c
+++ b/src/lj_opt_sink.c
@@ -166,8 +166,8 @@ static void sink_remark_phi(jit_State *J)
166/* Sweep instructions and tag sunken allocations and stores. */ 166/* Sweep instructions and tag sunken allocations and stores. */
167static void sink_sweep_ins(jit_State *J) 167static void sink_sweep_ins(jit_State *J)
168{ 168{
169 IRIns *ir, *irfirst = IR(J->cur.nk); 169 IRIns *ir, *irbase = IR(REF_BASE);
170 for (ir = IR(J->cur.nins-1) ; ir >= irfirst; ir--) { 170 for (ir = IR(J->cur.nins-1) ; ir >= irbase; ir--) {
171 switch (ir->o) { 171 switch (ir->o) {
172 case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: { 172 case IR_ASTORE: case IR_HSTORE: case IR_FSTORE: case IR_XSTORE: {
173 IRIns *ira = sink_checkalloc(J, ir); 173 IRIns *ira = sink_checkalloc(J, ir);
@@ -217,6 +217,10 @@ static void sink_sweep_ins(jit_State *J)
217 break; 217 break;
218 } 218 }
219 } 219 }
220 for (ir = IR(J->cur.nk); ir < irbase; ir++) {
221 irt_clearmark(ir->t);
222 ir->prev = REGSP_INIT;
223 }
220} 224}
221 225
222/* Allocation sinking and store sinking. 226/* Allocation sinking and store sinking.
diff --git a/src/lj_record.c b/src/lj_record.c
index f7c53567..b5fb6649 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -51,7 +51,7 @@ static void rec_check_ir(jit_State *J)
51{ 51{
52 IRRef i, nins = J->cur.nins, nk = J->cur.nk; 52 IRRef i, nins = J->cur.nins, nk = J->cur.nk;
53 lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536); 53 lua_assert(nk <= REF_BIAS && nins >= REF_BIAS && nins < 65536);
54 for (i = nins-1; i >= nk; i--) { 54 for (i = nk; i < nins; i++) {
55 IRIns *ir = IR(i); 55 IRIns *ir = IR(i);
56 uint32_t mode = lj_ir_mode[ir->o]; 56 uint32_t mode = lj_ir_mode[ir->o];
57 IRRef op1 = ir->op1; 57 IRRef op1 = ir->op1;