Author: Richard Plangger <planri...@gmail.com> Branch: fix-longevity Changeset: r82441:efbb3a7664a1 Date: 2016-02-23 15:28 +0100 http://bitbucket.org/pypy/pypy/changeset/efbb3a7664a1/
Log: (remi, plan_rich) resolved one issue in the allocation. this avoids reloading from the frame if one variable is already in a register diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py --- a/rpython/jit/backend/llsupport/regalloc.py +++ b/rpython/jit/backend/llsupport/regalloc.py @@ -559,8 +559,9 @@ # store result in the same place loc = self.reg_bindings[v] del self.reg_bindings[v] - if self.frame_manager.get(v) is None: + if self.frame_manager.get(v) is None or self.free_regs: self._move_variable_away(v, loc) + self.reg_bindings[result_v] = loc else: self._reallocate_from_to(v, result_v) diff --git a/rpython/jit/backend/llsupport/test/test_regalloc.py b/rpython/jit/backend/llsupport/test/test_regalloc.py --- a/rpython/jit/backend/llsupport/test/test_regalloc.py +++ b/rpython/jit/backend/llsupport/test/test_regalloc.py @@ -249,6 +249,24 @@ loc = rm.loc(b1) assert isinstance(loc, FakeReg) loc = rm.loc(b0) + assert isinstance(loc, FakeReg) + assert len(asm.moves) == 2 + + def test_force_result_in_register_reload_parameter_from_frame_later(self): + b0, b1 = newboxes(0, 0) + longevity = {b0: (0, 1), b1: (0, 1)} + fm = TFrameManager() + asm = MockAsm() + rm = RegisterManager(longevity, frame_manager=fm, assembler=asm) + rm.free_regs = rm.free_regs[:1] + rm.all_regs = rm.free_regs[:] + rm.next_instruction() + fm.loc(b0) + rm.force_result_in_reg(b1, b0) + rm._check_invariants() + loc = rm.loc(b1) + assert isinstance(loc, FakeReg) + loc = rm.loc(b0) assert isinstance(loc, FakeFramePos) assert len(asm.moves) == 1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit