Author: Hakan Ardo <[email protected]>
Branch: jit-targets
Changeset: r50087:6da95987f8ae
Date: 2011-12-03 15:17 +0100
http://bitbucket.org/pypy/pypy/changeset/6da95987f8ae/
Log: test framework for traces with labels
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
b/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
new file mode 100644
--- /dev/null
+++ b/pypy/jit/metainterp/optimizeopt/test/test_multilabel.py
@@ -0,0 +1,108 @@
+from pypy.jit.metainterp.optimizeopt.test.test_util import (
+ LLtypeMixin, BaseTest, Storage, _sortboxes, FakeDescrWithSnapshot)
+from pypy.jit.metainterp.history import TreeLoop, JitCellToken, TargetToken
+from pypy.jit.metainterp.resoperation import rop, opname, ResOperation
+from pypy.jit.metainterp.optimize import InvalidLoop
+from py.test import raises
+
+class BaseTestMultiLabel(BaseTest):
+ enable_opts =
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
+
+ def optimize_loop(self, ops, expected):
+ loop = self.parse(ops)
+ if expected != "crash!":
+ expected = self.parse(expected)
+
+ part = TreeLoop('part')
+ part.inputargs = loop.inputargs
+ part.start_resumedescr = FakeDescrWithSnapshot()
+ token = loop.original_jitcell_token
+
+ optimized = TreeLoop('optimized')
+ optimized.inputargs = loop.inputargs
+ optimized.operations = []
+
+ labels = [i for i, op in enumerate(loop.operations) \
+ if op.getopnum()==rop.LABEL]
+ prv = 0
+ last_label = []
+ for nxt in labels + [len(loop.operations)]:
+ assert prv != nxt
+ operations = last_label + loop.operations[prv:nxt]
+ if nxt < len(loop.operations):
+ label = loop.operations[nxt]
+ assert label.getopnum() == rop.LABEL
+ jumpop = ResOperation(rop.JUMP, label.getarglist(),
+ None, descr=token)
+ operations.append(jumpop)
+ part.operations = operations
+ self._do_optimize_loop(part, None)
+ if part.operations[-1].getopnum() == rop.LABEL:
+ last_label = [part.operations.pop()]
+ else:
+ last_label = []
+ optimized.operations.extend(part.operations)
+ prv = nxt + 1
+
+ #
+ print
+ print "Optimized:"
+ if optimized.operations:
+ print '\n'.join([str(o) for o in optimized.operations])
+ else:
+ print 'Failed!'
+ print
+
+ assert expected != "crash!", "should have raised an exception"
+ self.assert_equal(optimized, expected)
+
+ return optimized
+
+ def test_simple(self):
+ ops = """
+ [i1]
+ i2 = int_add(i1, 1)
+ escape(i2)
+ label(i1)
+ i3 = int_add(i1, 1)
+ escape(i3)
+ jump(i1)
+ """
+ expected = """
+ [i1]
+ i2 = int_add(i1, 1)
+ escape(i2)
+ label(i1, i2)
+ escape(i2)
+ jump(i1, i2)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_forced_virtual(self):
+ ops = """
+ [p1]
+ p3 = new_with_vtable(ConstClass(node_vtable))
+ label(p3)
+ escape(p3)
+ jump(p3)
+ """
+ with raises(InvalidLoop):
+ self.optimize_loop(ops, ops)
+
+ def test_virtuals_with_nonmatching_fields(self):
+ ops = """
+ [p1]
+ p3 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p3, 1, descr=valuedescr)
+ label(p3)
+ p4 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p4, 1, descr=nextdescr)
+ jump(p4)
+ """
+ with raises(InvalidLoop):
+ self.optimize_loop(ops, ops)
+
+
+class TestLLtype(BaseTestMultiLabel, LLtypeMixin):
+ pass
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit