[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