Author: Carl Friedrich Bolz <[email protected]>
Branch: regalloc-playground
Changeset: r92185:b4d4200219d6
Date: 2017-08-19 09:00 +0200
http://bitbucket.org/pypy/pypy/changeset/b4d4200219d6/

Log:    store the last_real_usage on the Lifetimes as well

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
@@ -791,9 +791,15 @@
             return [self.loc(op.getarg(0))]
 
 class Lifetime(object):
-    def __init__(self, definition_pos, last_usage):
+    def __init__(self, definition_pos, last_usage, last_real_usage=-42):
         self.definition_pos = definition_pos
         self.last_usage = last_usage
+        if last_real_usage == -42:
+            last_real_usage = last_usage
+        self.last_real_usage = last_real_usage
+
+    def is_last_real_use_before(self, position):
+        return self.last_real_usage <= position
 
 def compute_vars_longevity(inputargs, operations):
     # compute a dictionary that maps variables to index in
@@ -833,14 +839,17 @@
         if arg.type != 'v' and arg in last_used:
             assert not isinstance(arg, Const)
             assert i < last_used[arg]
-            longevity[arg] = Lifetime(i, last_used[arg])
+            longevity[arg] = Lifetime(
+                i, last_used[arg], last_real_usage.get(arg, -1))
             del last_used[arg]
     for arg in inputargs:
         assert not isinstance(arg, Const)
         if arg not in last_used:
-            longevity[arg] = Lifetime(-1, -1)
+            longevity[arg] = Lifetime(
+                -1, -1, -1)
         else:
-            longevity[arg] = Lifetime(0, last_used[arg])
+            longevity[arg] = Lifetime(
+                0, last_used[arg], last_real_usage.get(arg, -1))
             del last_used[arg]
     assert len(last_used) == 0
 
@@ -853,8 +862,8 @@
                 if not isinstance(arg, Const):
                     assert arg in produced
             produced[op] = None
-    
-    return longevity, last_real_usage
+
+    return longevity
 
 def is_comparison_or_ovf_op(opnum):
     return rop.is_comparison(opnum) or rop.is_ovf(opnum)
diff --git a/rpython/jit/backend/ppc/regalloc.py 
b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -197,10 +197,8 @@
         operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
                                                        allgcrefs)
         # compute longevity of variables
-        longevity, last_real_usage = compute_vars_longevity(
-                                                    inputargs, operations)
+        longevity = compute_vars_longevity(inputargs, operations)
         self.longevity = longevity
-        self.last_real_usage = last_real_usage
         self.rm = PPCRegisterManager(self.longevity,
                                      frame_manager = self.fm,
                                      assembler = self.assembler)
@@ -949,7 +947,7 @@
         position = self.rm.position
         for arg in inputargs:
             assert not isinstance(arg, Const)
-            if self.last_real_usage.get(arg, -1) <= position:
+            if self.longevity[arg].is_last_real_use_before(position):
                 self.force_spill_var(arg)
         #
         # we need to make sure that no variable is stored in spp (=r31)
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
@@ -165,10 +165,8 @@
         operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
                                                        allgcrefs)
         # compute longevity of variables
-        longevity, last_real_usage = compute_vars_longevity(
-                                                    inputargs, operations)
+        longevity = compute_vars_longevity(inputargs, operations)
         self.longevity = longevity
-        self.last_real_usage = last_real_usage
         self.rm = gpr_reg_mgr_cls(self.longevity,
                                   frame_manager = self.fm,
                                   assembler = self.assembler)
@@ -1404,7 +1402,7 @@
         position = self.rm.position
         for arg in inputargs:
             assert not isinstance(arg, Const)
-            if self.last_real_usage.get(arg, -1) <= position:
+            if self.longevity[arg].is_last_real_use_before(position):
                 self.force_spill_var(arg)
         #
         # we need to make sure that no variable is stored in ebp
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
@@ -452,10 +452,8 @@
         operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
                                                        allgcrefs)
         # compute longevity of variables
-        longevity, last_real_usage = compute_vars_longevity(
-                                                    inputargs, operations)
+        longevity = compute_vars_longevity(inputargs, operations)
         self.longevity = longevity
-        self.last_real_usage = last_real_usage
         self.rm = ZARCHRegisterManager(self.longevity,
                                      frame_manager = self.fm,
                                      assembler = self.assembler)
@@ -1307,7 +1305,7 @@
         position = self.rm.position
         for arg in inputargs:
             assert not isinstance(arg, Const)
-            if self.last_real_usage.get(arg, -1) <= position:
+            if self.longevity[arg].is_last_real_use_before(position):
                 self.force_spill_var(arg)
         #
         # we need to make sure that no variable is stored in spp (=r31)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to