diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_asm.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index a05ec75c..329e5c95 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -1471,16 +1471,18 @@ static void asm_phi_fixup(ASMState *as) | |||
| 1471 | Reg r = rset_picktop(work); | 1471 | Reg r = rset_picktop(work); |
| 1472 | IRRef lref = as->phireg[r]; | 1472 | IRRef lref = as->phireg[r]; |
| 1473 | IRIns *ir = IR(lref); | 1473 | IRIns *ir = IR(lref); |
| 1474 | /* Left PHI gained a spill slot before the loop? */ | 1474 | if (irt_ismarked(ir->t)) { |
| 1475 | if (irt_ismarked(ir->t) && ra_hasspill(ir->s)) { | 1475 | irt_clearmark(ir->t); |
| 1476 | IRRef ren; | 1476 | /* Left PHI gained a spill slot before the loop? */ |
| 1477 | lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); | 1477 | if (ra_hasspill(ir->s)) { |
| 1478 | ren = tref_ref(lj_ir_emit(as->J)); | 1478 | IRRef ren; |
| 1479 | as->ir = as->T->ir; /* The IR may have been reallocated. */ | 1479 | lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno); |
| 1480 | IR(ren)->r = (uint8_t)r; | 1480 | ren = tref_ref(lj_ir_emit(as->J)); |
| 1481 | IR(ren)->s = SPS_NONE; | 1481 | as->ir = as->T->ir; /* The IR may have been reallocated. */ |
| 1482 | IR(ren)->r = (uint8_t)r; | ||
| 1483 | IR(ren)->s = SPS_NONE; | ||
| 1484 | } | ||
| 1482 | } | 1485 | } |
| 1483 | irt_clearmark(ir->t); /* Always clear marker. */ | ||
| 1484 | rset_clear(work, r); | 1486 | rset_clear(work, r); |
| 1485 | } | 1487 | } |
| 1486 | } | 1488 | } |
