Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r81777:4a9e35058f3e
Date: 2016-01-15 09:13 +0100
http://bitbucket.org/pypy/pypy/changeset/4a9e35058f3e/
Log: jumping over pair (end of regalloc) if one of them is forbidden
diff --git a/rpython/jit/backend/zarch/regalloc.py
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -189,7 +189,7 @@
even, odd = None, None
REGS = r.registers
i = len(self.free_regs)-1
- candidates = []
+ candidates = {}
while i >= 0:
even = self.free_regs[i]
if even.is_even():
@@ -198,7 +198,7 @@
if odd not in self.free_regs:
# sadly odd is not free, but for spilling
# we found a candidate
- candidates.append(odd)
+ candidates[odd] = True
i -= 1
continue
assert var not in self.reg_bindings
@@ -218,7 +218,7 @@
if even in r.MANAGED_REGS and even not in self.free_regs:
# yes even might be a candidate
# this means that odd is free, but not even
- candidates.append(even)
+ candidates[even] = True
i -= 1
if len(candidates) != 0:
@@ -275,8 +275,10 @@
reg2 = r.MANAGED_REGS[i+1]
assert reg.is_even() and reg2.is_odd()
ovar = reverse_mapping[reg]
- ovar2 = reverse_mapping[reg2]
- if ovar in forbidden_vars or ovar2 in forbidden_vars:
+ if ovar in forbidden_vars:
+ continue
+ ovar2 = reverse_mapping.get(reg2, None)
+ if ovar2 is not None and ovar2 in forbidden_vars:
# blocked, try other register pair
continue
even = reg
@@ -284,7 +286,8 @@
self._sync_var(ovar)
self._sync_var(ovar2)
del self.reg_bindings[ovar]
- del self.reg_bindings[ovar2]
+ if ovar2 is not None:
+ del self.reg_bindings[ovar2]
# both are not added to free_regs! no need to do so
self.reg_bindings[var] = even
self.reg_bindings[var2] = odd
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit