[pypy-svn] pypy out-of-line-guards: Emit extra -live- at the beginning of each entry point
fijal
commits-noreply at bitbucket.org
Thu Feb 17 16:07:28 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: out-of-line-guards
Changeset: r42111:25925a2a13cd
Date: 2011-02-17 06:41 -0700
http://bitbucket.org/pypy/pypy/changeset/25925a2a13cd/
Log: Emit extra -live- at the beginning of each entry point
diff --git a/pypy/jit/codewriter/call.py b/pypy/jit/codewriter/call.py
--- a/pypy/jit/codewriter/call.py
+++ b/pypy/jit/codewriter/call.py
@@ -148,7 +148,7 @@
def grab_initial_jitcodes(self):
for jd in self.jitdrivers_sd:
- jd.mainjitcode = self.get_jitcode(jd.portal_graph)
+ jd.mainjitcode = self.get_jitcode(jd.portal_graph, entry_point=True)
jd.mainjitcode.is_portal = True
def enum_pending_graphs(self):
@@ -156,14 +156,14 @@
graph = self.unfinished_graphs.pop()
yield graph, self.jitcodes[graph]
- def get_jitcode(self, graph, called_from=None):
+ def get_jitcode(self, graph, called_from=None, entry_point=False):
# 'called_from' is only one of the callers, used for debugging.
try:
return self.jitcodes[graph]
except KeyError:
fnaddr, calldescr = self.get_jitcode_calldescr(graph)
jitcode = JitCode(graph.name, fnaddr, calldescr,
- called_from=called_from)
+ called_from=called_from, entry_point=entry_point)
self.jitcodes[graph] = jitcode
self.unfinished_graphs.append(graph)
return jitcode
diff --git a/pypy/jit/codewriter/codewriter.py b/pypy/jit/codewriter/codewriter.py
--- a/pypy/jit/codewriter/codewriter.py
+++ b/pypy/jit/codewriter/codewriter.py
@@ -49,7 +49,7 @@
# which means mostly producing a linear list of operations and
# inserting jumps or conditional jumps. This is a list of tuples
# of the shape ("opname", arg1, ..., argN) or (Label(...),).
- ssarepr = flatten_graph(graph, regallocs)
+ ssarepr = flatten_graph(graph, regallocs, jitcode.entry_point)
#
# step 3b: compute the liveness around certain operations
compute_liveness(ssarepr)
diff --git a/pypy/jit/codewriter/jitcode.py b/pypy/jit/codewriter/jitcode.py
--- a/pypy/jit/codewriter/jitcode.py
+++ b/pypy/jit/codewriter/jitcode.py
@@ -9,13 +9,15 @@
_empty_r = []
_empty_f = []
- def __init__(self, name, fnaddr=None, calldescr=None, called_from=None):
+ def __init__(self, name, fnaddr=None, calldescr=None, called_from=None,
+ entry_point=False):
self.name = name
self.fnaddr = fnaddr
self.calldescr = calldescr
self.is_portal = False
self._called_from = called_from # debugging
self._ssarepr = None # debugging
+ self.entry_point = entry_point
def setup(self, code='', constants_i=[], constants_r=[], constants_f=[],
num_regs_i=255, num_regs_r=255, num_regs_f=255,
diff --git a/pypy/jit/codewriter/flatten.py b/pypy/jit/codewriter/flatten.py
--- a/pypy/jit/codewriter/flatten.py
+++ b/pypy/jit/codewriter/flatten.py
@@ -60,10 +60,12 @@
# ____________________________________________________________
-def flatten_graph(graph, regallocs, _include_all_exc_links=False):
+def flatten_graph(graph, regallocs, _include_all_exc_links=False,
+ entry_point=False):
"""Flatten the graph into an SSARepr, with already-computed register
allocations. 'regallocs' in a dict {kind: RegAlloc}."""
- flattener = GraphFlattener(graph, regallocs, _include_all_exc_links)
+ flattener = GraphFlattener(graph, regallocs, _include_all_exc_links,
+ entry_point)
flattener.enforce_input_args()
flattener.generate_ssa_form()
return flattener.ssarepr
@@ -71,7 +73,8 @@
class GraphFlattener(object):
- def __init__(self, graph, regallocs, _include_all_exc_links=False):
+ def __init__(self, graph, regallocs, _include_all_exc_links=False,
+ entry_point=False):
self.graph = graph
self.regallocs = regallocs
self._include_all_exc_links = _include_all_exc_links
@@ -81,6 +84,7 @@
else:
name = '?'
self.ssarepr = SSARepr(name)
+ self.entry_point = entry_point
def enforce_input_args(self):
inputargs = self.graph.startblock.inputargs
@@ -98,6 +102,8 @@
def generate_ssa_form(self):
self.seen_blocks = {}
+ if self.entry_point:
+ self.emitline('-live-')
self.make_bytecode_block(self.graph.startblock)
def make_bytecode_block(self, block):
diff --git a/pypy/jit/codewriter/test/test_flatten.py b/pypy/jit/codewriter/test/test_flatten.py
--- a/pypy/jit/codewriter/test/test_flatten.py
+++ b/pypy/jit/codewriter/test/test_flatten.py
@@ -115,7 +115,8 @@
return self.rtyper.annotator.translator.graphs
def encoding_test(self, func, args, expected,
- transform=False, liveness=False, cc=None, jd=None):
+ transform=False, liveness=False, cc=None, jd=None,
+ entry_point=False):
graphs = self.make_graphs(func, args)
#graphs[0].show()
if transform:
@@ -123,7 +124,8 @@
cc = cc or FakeCallControl()
transform_graph(graphs[0], FakeCPU(self.rtyper), cc, jd)
ssarepr = flatten_graph(graphs[0], fake_regallocs(),
- _include_all_exc_links=not transform)
+ _include_all_exc_links=not transform,
+ entry_point=entry_point)
if liveness:
from pypy.jit.codewriter.liveness import compute_liveness
compute_liveness(ssarepr)
@@ -628,6 +630,15 @@
int_return %i0
""", transform=True, liveness=True)
+ def test_live_at_the_beginning(self):
+ def f(x):
+ return 3 + x
+ self.encoding_test(f, [5], """
+ -live-
+ int_add $3, %i0 -> %i1
+ int_return %i1
+ """, entry_point=True)
+
def test_ptr_nonzero(self):
def f(p):
if p:
More information about the Pypy-commit
mailing list