Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit