[pypy-commit] pypy fix-longevity: (plan_rich, remi) small fixes and allow updating the free regs lists

Raemi pypy.commits at gmail.com
Thu Feb 25 07:43:10 EST 2016


Author: Remi Meier <remi.meier at gmail.com>
Branch: fix-longevity
Changeset: r82498:d6ea9d88da47
Date: 2016-02-25 13:42 +0100
http://bitbucket.org/pypy/pypy/changeset/d6ea9d88da47/

Log:	(plan_rich,remi) small fixes and allow updating the free regs lists

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
@@ -310,12 +310,18 @@
         return self.free_callee_regs or self.free_caller_regs
 
     def allocate_new(self, var):
-        if self.live_ranges.survives_call(var, self.position):
+        if self.live_ranges.exists(var) and self.live_ranges.survives_call(var, self.position):
             # we want a callee save register
             return self.get_free_register(var, callee=True)
         else:
             return self.get_free_register(var, callee=False, target_reg=None)
 
+    def update_free_registers(self, regs_in_use):
+        # XXX: slow?
+        self._reset_free_regs()
+        for r in regs_in_use:
+            self.remove_free_register(r)
+
     def remove_free_register(self, reg):
         if self.is_callee_lookup[reg.value]:
             self.free_callee_regs = [fr for fr in self.free_callee_regs if fr is not reg]
@@ -335,9 +341,13 @@
         return reg in self.free_callee_regs or \
                reg in self.free_caller_regs
 
+    def _reset_free_regs(self):
+        self.free_callee_regs = [reg for reg in self.all_regs
+                                 if reg not in self.save_around_call_regs]
+        self.free_caller_regs = self.save_around_call_regs[:]
+
     def __init__(self, live_ranges, frame_manager=None, assembler=None):
-        self.free_callee_regs = [reg for reg in self.all_regs if reg not in self.save_around_call_regs]
-        self.free_caller_regs = self.save_around_call_regs[:]
+        self._reset_free_regs()
         self.is_callee_lookup = [True] * len(self.all_regs)
         for reg in self.save_around_call_regs:
             self.is_callee_lookup[reg.value] = False
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
@@ -23,9 +23,9 @@
 
 class FakeReg(object):
     def __init__(self, i):
-        self.index = i
+        self.value = i
     def __repr__(self):
-        return 'r%d' % self.index
+        return 'r%d' % self.value
 
 r0, r1, r2, r3 = [FakeReg(i) for i in range(4)]
 regs = [r0, r1, r2, r3]
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
@@ -266,11 +266,13 @@
         else:
             return self.xrm.make_sure_var_in_reg(var, forbidden_vars)
 
-    def _update_bindings(self, locs, inputargs):
+    def _update_bindings(self, arglocs, inputargs):
         # XXX this should probably go to llsupport/regalloc.py
-        used = {}
+        used = set()
         i = 0
-        for loc in locs:
+        # manually set the register and frame bindings for
+        # all inputargs (for a bridge)
+        for loc in arglocs:
             if loc is None: # xxx bit kludgy
                 loc = ebp
             arg = inputargs[i]
@@ -278,23 +280,18 @@
             if isinstance(loc, RegLoc):
                 if arg.type == FLOAT:
                     self.xrm.reg_bindings[arg] = loc
-                    used[loc] = None
+                    used.add(loc)
                 else:
                     if loc is ebp:
                         self.rm.bindings_to_frame_reg[arg] = None
                     else:
                         self.rm.reg_bindings[arg] = loc
-                        used[loc] = None
+                        used.add(loc)
             else:
                 self.fm.bind(arg, loc)
-        self.rm.free_regs = []
-        for reg in self.rm.all_regs:
-            if reg not in used:
-                self.rm.free_regs.append(reg)
-        self.xrm.free_regs = []
-        for reg in self.xrm.all_regs:
-            if reg not in used:
-                self.xrm.free_regs.append(reg)
+        #
+        self.rm.update_free_registers(used)
+        self.xrm.update_free_registers(used)
         self.possibly_free_vars(list(inputargs))
         self.fm.finish_binding()
         self.rm._check_invariants()


More information about the pypy-commit mailing list