[pypy-commit] pypy fix-longevity: (plan_rich, remi) possibly silghtly improve corner case
Raemi
pypy.commits at gmail.com
Thu Feb 25 11:44:33 EST 2016
Author: Remi Meier <remi.meier at gmail.com>
Branch: fix-longevity
Changeset: r82518:ff9c442e6dc8
Date: 2016-02-25 17:43 +0100
http://bitbucket.org/pypy/pypy/changeset/ff9c442e6dc8/
Log: (plan_rich,remi) possibly silghtly improve corner case
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
@@ -667,11 +667,22 @@
# we need to find a new place for variable v and
# store result in the same place
- loc = self.reg_bindings[v]
- # only spill variable is allowed to reassign a new register to a live range
- result_loc = self.force_allocate_reg(result_v, forbidden_vars=forbidden_vars)
- self.assembler.regalloc_mov(loc, result_loc)
- loc = result_loc
+ if (not self.has_free_registers()
+ and self._pick_variable_to_spill(None, forbidden_vars) is v):
+ # if we would be chosen for spilling, we give up our register
+ # for result_v (and move us away onto the frame) instead of
+ # forcing a spill of some other variable.
+ loc = self.reg_bindings[v]
+ del self.reg_bindings[v]
+ if self.frame_manager.get(v) is None:
+ self._move_variable_away(v, loc)
+ self.reg_bindings[result_v] = loc
+ else:
+ loc = self.reg_bindings[v]
+ # only spill variable is allowed to reassign a new register to a live range
+ result_loc = self.force_allocate_reg(result_v, forbidden_vars=forbidden_vars)
+ self.assembler.regalloc_mov(loc, result_loc)
+ loc = result_loc
#del self.reg_bindings[v]
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -62,14 +62,22 @@
save_around_call_regs = abi_param_regs + [eax, edx, r10]
def get_abi_param_register(self, i):
- assert i >= 0 and i < len(self.abi_param_regs)
- return self.abi_param_regs[i]
+ if not IS_X86_32 and 0 <= i < len(self.abi_param_regs):
+ return self.abi_param_regs[i]
+ return None
+
class X86XMMRegisterManager(RegisterManager):
box_types = [FLOAT, INT] # yes INT!
all_regs = [xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7]
# we never need lower byte I hope
save_around_call_regs = all_regs
+ abi_param_regs = all_regs
+
+ def get_abi_param_register(self, i):
+ if not IS_X86_32 and 0 <= i < len(self.abi_param_regs):
+ return self.abi_param_regs[i]
+ return None
def convert_to_imm(self, c):
adr = self.assembler.datablockwrapper.malloc_aligned(8, 8)
More information about the pypy-commit
mailing list