[pypy-svn] r74726 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Tue May 25 12:18:32 CEST 2010


Author: arigo
Date: Tue May 25 12:18:30 2010
New Revision: 74726

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitcode.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitcode.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_list.py
Log:
* more debugging support in dump()
* replace enumerate_live_vars() with get_live_vars_info()


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py	Tue May 25 12:18:30 2010
@@ -21,7 +21,9 @@
         it inside the 'jitcode'.  If jitcode is None, make a new one.
         """
         self.setup()
+        ssarepr._insns_pos = []
         for insn in ssarepr.insns:
+            ssarepr._insns_pos.append(len(self.code))
             self.write_insn(insn)
         self.fix_labels()
         self.check_result()

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	Tue May 25 12:18:30 2010
@@ -7,6 +7,7 @@
     def __init__(self, name):
         self.name = name
         self.insns = []
+        self._insns_pos = None     # after being assembled
 
 class Label(object):
     def __init__(self, name):

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/format.py	Tue May 25 12:18:30 2010
@@ -52,7 +52,9 @@
     insns = ssarepr.insns
     if insns and insns[-1] == ('---',):
         insns = insns[:-1]
-    for asm in insns:
+    for i, asm in enumerate(insns):
+        if ssarepr._insns_pos:
+            print >> output, '%4d ' % ssarepr._insns_pos[i],
         if isinstance(asm[0], Label):
             if asm[0].name in seenlabels:
                 print >> output, '%s:' % getlabelname(asm[0])

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitcode.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitcode.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitcode.py	Tue May 25 12:18:30 2010
@@ -47,39 +47,25 @@
     def has_liveness_info(self, pc):
         return pc in self.liveness
 
-    def enumerate_live_vars(self, pc, callback, arg,
-                            registers_i, registers_r, registers_f):
-        # 'pc' gives a position in this bytecode.  This invokes
-        # 'callback' for each variable that is live across the
-        # instruction boundary at 'pc'.  More precisely,
-        # this invokes 'callback(arg, box)' where 'box' comes from one
-        # of the three lists of registers.
+    def get_live_vars_info(self, pc):
+        # 'pc' gives a position in this bytecode.  This returns an object
+        # that describes all variables that are live across the instruction
+        # boundary at 'pc'.  To decode the object, use the global functions
+        # 'get_register_{count,index}_{i,r,f}()'.
         if not we_are_translated() and pc not in self.liveness:
             self._missing_liveness(pc)
-        live_i, live_r, live_f = self.liveness[pc]    # XXX compactify!!
-        for c in live_i:
-            x = callback(arg, registers_i[ord(c)])
-            assert x is None
-        for c in live_r:
-            x = callback(arg, registers_r[ord(c)])
-            assert x is None
-        for c in live_f:
-            x = callback(arg, registers_f[ord(c)])
-            assert x is None
-    enumerate_live_vars._annspecialcase_ = 'specialize:arg(2)'
+        return self.liveness[pc]    # XXX compactify!!
 
     def _live_vars(self, pc):
         # for testing only
-        class Names:
-            def __init__(self, kind):
-                self.kind = kind
-            def __getitem__(self, index):
-                return '%%%s%d' % (self.kind, index)
-        lst = []
-        self.enumerate_live_vars(pc, list.append, lst,
-                                 Names('i'), Names('r'), Names('f'))
-        lst.sort()
-        return ' '.join(lst)
+        info = self.get_live_vars_info(pc)
+        lst_i = ['%%i%d' % get_register_index_i(info, index)
+                 for index in range(get_register_count_i(info))]
+        lst_r = ['%%r%d' % get_register_index_r(info, index)
+                 for index in range(get_register_count_r(info))]
+        lst_f = ['%%f%d' % get_register_index_f(info, index)
+                 for index in range(get_register_count_f(info))]
+        return ' '.join(lst_i + lst_r + lst_f)
 
     def _missing_liveness(self, pc):
         raise MissingLiveness("missing liveness[%d]\n%s" % (pc, self.dump()))
@@ -116,3 +102,18 @@
     def __repr__(self):
         dict = getattr(self, 'dict', '?')
         return '<SwitchDictDescr %s>' % (dict,)
+
+
+def get_register_count_i((live_i, live_r, live_f)):
+    return len(live_i)
+def get_register_count_r((live_i, live_r, live_f)):
+    return len(live_r)
+def get_register_count_f((live_i, live_r, live_f)):
+    return len(live_f)
+
+def get_register_index_i((live_i, live_r, live_f), index):
+    return ord(live_i[index])
+def get_register_index_r((live_i, live_r, live_f), index):
+    return ord(live_r[index])
+def get_register_index_f((live_i, live_r, live_f), index):
+    return ord(live_f[index])

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitcode.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitcode.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitcode.py	Tue May 25 12:18:30 2010
@@ -21,14 +21,4 @@
     j.setup(liveness={5: (" A", "b", "CD")})
     assert j.has_liveness_info(5)
     assert not j.has_liveness_info(4)
-    #
-    seen = []
-    def callback(arg, value):
-        assert arg == "foo"
-        seen.append(value)
-    #
-    j.enumerate_live_vars(5, callback, "foo",
-                          {ord(" "): "i10", ord("A"): "i20"},
-                          {ord("b"): "r30"},
-                          {ord("C"): "f40", ord("D"): "f50"})
-    assert seen == ["i10", "i20", "r30", "f40", "f50"]
+    assert j._live_vars(5) == "%i32 %i65 %r98 %f67 %f68"

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_list.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_list.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_list.py	Tue May 25 12:18:30 2010
@@ -44,6 +44,7 @@
 def builtin_test(oopspec_name, args, RESTYPE, expected):
     v_result = varoftype(RESTYPE)
     tr = Transformer(FakeCPU(), FakeCallControl())
+    tr.immutable_arrays = {}
     if '/' in oopspec_name:
         oopspec_name, property = oopspec_name.split('/')
         def force_flags(op):



More information about the Pypy-commit mailing list