[pypy-svn] r59207 - in pypy/branch/oo-jit/pypy/jit/codegen: cli/test test

antocuni at codespeak.net antocuni at codespeak.net
Sat Oct 18 14:11:38 CEST 2008


Author: antocuni
Date: Sat Oct 18 14:11:36 2008
New Revision: 59207

Modified:
   pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_rgenop.py
   pypy/branch/oo-jit/pypy/jit/codegen/test/rgenop_tests.py
Log:
add a test to rgenop that shows a bug of the cli backend



Modified: pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_rgenop.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_rgenop.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_rgenop.py	Sat Oct 18 14:11:36 2008
@@ -84,6 +84,8 @@
     def test_interior_access(self):
         py.test.skip('fixme')
 
+    def test_switch_goto_parent_block_direct(self):
+        py.test.skip('fixme')
 
 class TestRCliGenopCompile(AbstractRGenOpTestsCompile):
     RGenOp = RCliGenOp
@@ -143,3 +145,5 @@
     def test_ovfcheck1_compile(self):
         py.test.skip('fixme')
 
+    def test_switch_goto_parent_block_compile(self):
+        py.test.skip('fixme')

Modified: pypy/branch/oo-jit/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/test/rgenop_tests.py	(original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/test/rgenop_tests.py	Sat Oct 18 14:11:36 2008
@@ -501,6 +501,69 @@
         return res
     return large_switch_runner
 
+
+def make_switch_goto_parent_block(T, rgenop):
+    """
+    def f(v0, v1):
+      firstblock:   # label
+        if v0 == 0: # switch
+            return 21*v1
+        elif v0 == 1:
+            return 21+v1
+        elif v0 == 2:
+            v0 = v0-1
+            v1 = v1*2
+            goto firstblock
+        else:
+            return v1
+    """
+    sigtoken = rgenop.sigToken(T.FUNC2)
+    builder, gv_switch, [gv0, gv1] = rgenop.newgraph(sigtoken, "switch")
+    builder.start_writing()
+
+    args_gv = [gv0, gv1]
+    firstblock = builder.enter_next_block(args_gv)
+    gv0, gv1 = args_gv
+
+    args_gv = [gv0, gv1]
+    flexswitch, default_builder = builder.flexswitch(gv0, args_gv)
+    gv0, gv1 = args_gv
+    
+    const21 = rgenop.genconst(21)
+
+    # default
+    default_builder.finish_and_return(sigtoken, gv1)
+    # case == 0
+    const0 = rgenop.genconst(0)
+    case_builder = flexswitch.add_case(const0)
+    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1)
+    case_builder.finish_and_return(sigtoken, gv_res_case0)
+    # case == 1
+    const1 = rgenop.genconst(1)
+    case_builder = flexswitch.add_case(const1)
+    gv_res_case1 = case_builder.genop2('int_add', const21, gv1)
+    case_builder.finish_and_return(sigtoken, gv_res_case1)
+    # case == 2
+    const2 = rgenop.genconst(2)
+    case_builder = flexswitch.add_case(const2)
+    gv0_new = case_builder.genop2('int_sub', gv0, const1)
+    gv1_new = case_builder.genop2('int_mul', gv1, const2)
+    case_builder.finish_and_goto([gv0_new, gv1_new], firstblock)
+
+    builder.end()
+    return gv_switch
+
+def get_switch_goto_parent_block_runner(T, RGenOp):
+    def switch_goto_parent_block_runner(x, y):
+        rgenop = RGenOp()
+        gv_switchfn = make_switch_goto_parent_block(T, rgenop)
+        switchfn = gv_switchfn.revealconst(T.Ptr(T.FUNC2))
+        res = switchfn(x, y)
+        keepalive_until_here(rgenop)    # to keep the code blocks alive
+        return res
+    return switch_goto_parent_block_runner
+
+
 def make_fact(T, rgenop):
     # def fact(x):
     #     if x:
@@ -1167,6 +1230,18 @@
         res = fn(42, 18)
         assert res == 18
 
+    def test_switch_goto_parent_block_compile(self):
+        fn = self.compile(get_switch_goto_parent_block_runner(self.T, self.RGenOp), [int, int])
+        res = fn(0, 2)
+        assert res == 42
+        res = fn(1, 16)
+        assert res == 37
+        res = fn(2, 15)
+        assert res == 51
+        res = fn(42, 16)
+        assert res == 16
+
+
     def test_fact_compile(self):
         fn = self.compile(get_fact_runner(self.T, self.RGenOp), [int])
         res = fn(2)
@@ -1407,6 +1482,19 @@
         res = fnptr(42, 16, 3, 4, 5)
         assert res == 16
 
+    def test_switch_goto_parent_block_direct(self):
+        rgenop = self.RGenOp()
+        gv_switchfn = make_switch_goto_parent_block(self.T, rgenop)
+        fnptr = self.cast(gv_switchfn, 2)
+        res = fnptr(0, 2)
+        assert res == 42
+        res = fnptr(1, 16)
+        assert res == 37
+        res = fnptr(2, 15)
+        assert res == 51
+        res = fnptr(42, 16)
+        assert res == 16
+
     def test_large_switch_direct(self):
         rgenop = self.RGenOp()
         gv_switchfn = make_large_switch(self.T, rgenop)



More information about the Pypy-commit mailing list