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