[pypy-svn] r36329 - in pypy/dist/pypy/jit/codegen: i386/test llgraph/test test

arigo at codespeak.net arigo at codespeak.net
Tue Jan 9 11:58:09 CET 2007


Author: arigo
Date: Tue Jan  9 11:58:06 2007
New Revision: 36329

Added:
   pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
Modified:
   pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
   pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
(mwh, arigo)

Use the general rgenop_tests with the llgraph backend too.


Modified: pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	Tue Jan  9 11:58:06 2007
@@ -3,3 +3,6 @@
 
 class TestRI386Genop(AbstractRGenOpTests):
     RGenOp = RI386GenOp
+
+    # for the individual tests see
+    # ====> ../../test/rgenop_tests.py

Added: pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/jit/codegen/llgraph/test/test_rgenop.py	Tue Jan  9 11:58:06 2007
@@ -0,0 +1,25 @@
+import py
+from pypy.rpython.lltypesystem import lltype
+from pypy.jit.codegen.llgraph.rgenop import RGenOp
+from pypy.jit.codegen.llgraph.llimpl import testgengraph
+from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests
+from pypy.rpython.test.test_llinterp import interpret
+
+
+class TestLLGraphRGenop(AbstractRGenOpTests):
+    RGenOp = RGenOp
+
+    def cast(self, gv, nb_args):
+        F1 = lltype.FuncType([lltype.Signed] * nb_args, lltype.Signed)
+        ptr = gv.revealconst(lltype.Ptr(F1))
+        def runner(*args):
+            return testgengraph(ptr._obj.graph, list(args))
+        return runner
+
+    def getcompiled(self, runner, argtypes, annotatorpolicy):
+        def quasi_compiled_runner(*args):
+            return interpret(runner, args, policy=annotatorpolicy)
+        return quasi_compiled_runner
+
+    # for the individual tests see
+    # ====> ../../test/rgenop_tests.py

Modified: pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/test/rgenop_tests.py	(original)
+++ pypy/dist/pypy/jit/codegen/test/rgenop_tests.py	Tue Jan  9 11:58:06 2007
@@ -67,7 +67,7 @@
     builder, gv_branchingfn, [gv_x, gv_y] = rgenop.newgraph(sigtoken,
                                                             "branching")
     gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(5))
-    false_builder = builder.jump_if_false(gv_cond)
+    false_builder = builder.jump_if_false(gv_cond, [gv_y])
 
     # true path
     args_gv = [rgenop.genconst(1), gv_x, gv_y]
@@ -78,9 +78,7 @@
     builder.finish_and_return(sigtoken, gv_s2)
 
     # false path
-    args_gv = [gv_y]
-    false_builder.enter_next_block([signed_kind], args_gv)
-    [gv_y] = args_gv
+    false_builder.start_writing()
     false_builder.finish_and_return(sigtoken, gv_y)
 
     # done
@@ -105,7 +103,7 @@
     [gv_x, gv_y, gv_z] = args_gv
 
     gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(0))
-    bodybuilder = builder.jump_if_true(gv_cond)
+    bodybuilder = builder.jump_if_true(gv_cond, args_gv)
     return args_gv, loopblock, bodybuilder
 
 # loop exit
@@ -119,11 +117,7 @@
 
 # loop body
 def loop_body(rgenop, loopblock, bodybuilder, signed_kind, gv_x, gv_y, gv_z):
-    args_gv = [gv_z, gv_y, gv_x]
-    bodybuilder.enter_next_block(
-        [signed_kind, signed_kind, signed_kind], args_gv)
-    [gv_z, gv_y, gv_x] = args_gv
-
+    bodybuilder.start_writing()
     gv_z2 = bodybuilder.genop2("int_mul", gv_x, gv_z)
     gv_y2 = bodybuilder.genop2("int_add", gv_x, gv_y)
     gv_x2 = bodybuilder.genop2("int_sub", gv_x, rgenop.genconst(1))
@@ -177,13 +171,9 @@
     [gv_x1, gv_unused] = args_gv
 
     gv_cond = builder.genop2("int_gt", gv_x1, rgenop.genconst(5))
-    elsebuilder = builder.jump_if_false(gv_cond)
-    elseargs_gv = [gv_x1]
+    elsebuilder = builder.jump_if_false(gv_cond, [gv_x1])
 
     # 'then' block
-    args_gv = [gv_x1]
-    builder.enter_next_block([signed_kind], args_gv)
-    [gv_x1] = args_gv
     gv_x2 = builder.genop2("int_floordiv", gv_x1, rgenop.genconst(2))
 
     # end block
@@ -194,9 +184,8 @@
     builder.finish_and_return(sigtoken, gv_res)
 
     # now the else branch
-    elsebuilder.enter_next_block([signed_kind], elseargs_gv)
-    [gv_x3] = elseargs_gv
-    elsebuilder.finish_and_goto([gv_x3, gv_x3], label)
+    elsebuilder.start_writing()
+    elsebuilder.finish_and_goto([gv_x1, gv_x1], label)
 
     # done
     builder.end()
@@ -226,30 +215,20 @@
     sigtoken = rgenop.sigToken(FUNC2)
     builder, gv_switch, [gv0, gv1] = rgenop.newgraph(sigtoken, "switch")
 
-    flexswitch = builder.flexswitch(gv0)
+    flexswitch, default_builder = builder.flexswitch(gv0, [gv1])
     const21 = rgenop.genconst(21)
 
+    # default
+    default_builder.finish_and_return(sigtoken, gv1)
     # case == 0
     const0 = rgenop.genconst(0)
     case_builder = flexswitch.add_case(const0)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_kind], case_args_gv)
-    [gv1_case0] = case_args_gv
-    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1_case0)
+    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1)
     case_builder.finish_and_return(sigtoken, gv_res_case0)
-    # default
-    default_builder = flexswitch.add_default()
-    default_args_gv = [gv1]
-    default_builder.enter_next_block([signed_kind], default_args_gv)
-    [gv1_default] = default_args_gv
-    default_builder.finish_and_return(sigtoken, gv1_default)
     # case == 1
     const1 = rgenop.genconst(1)
     case_builder = flexswitch.add_case(const1)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_kind], case_args_gv)
-    [gv1_case1] = case_args_gv
-    gv_res_case1 = case_builder.genop2('int_add', const21, gv1_case1)
+    gv_res_case1 = case_builder.genop2('int_add', const21, gv1)
     case_builder.finish_and_return(sigtoken, gv_res_case1)
 
     builder.end()
@@ -284,32 +263,22 @@
     f2_token = rgenop.sigToken(FUNC2)
     builder, gv_switch, (gv0, gv1) = rgenop.newgraph(f2_token, "large_switch")
 
-    flexswitch = builder.flexswitch(gv0)
+    flexswitch, default_builder = builder.flexswitch(gv0, [gv1])
     const21 = rgenop.genconst(21)
 
+    # default
+    default_builder.finish_and_return(f2_token, gv1)
     # case == 0
     const0 = rgenop.genconst(0)
     case_builder = flexswitch.add_case(const0)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_tok], case_args_gv)
-    [gv1_case0] = case_args_gv
-    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1_case0)
+    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1)
     case_builder.finish_and_return(f2_token, gv_res_case0)
-    # default
-    default_builder = flexswitch.add_default()
-    default_args_gv = [gv1]
-    default_builder.enter_next_block([signed_tok], default_args_gv)
-    [gv1_default] = default_args_gv
-    default_builder.finish_and_return(f2_token, gv1_default)
     # case == x
     for x in range(1,11):
          constx = rgenop.genconst(x)
          case_builder = flexswitch.add_case(constx)
-         case_args_gv = [gv1]
-         case_builder.enter_next_block([signed_tok], case_args_gv)
-         [gv1_casex] = case_args_gv
-         const2px= rgenop.genconst(1<<x)
-         gv_res_casex = case_builder.genop2('int_add', const2px, gv1_casex)
+         const2px = rgenop.genconst(1<<x)
+         gv_res_casex = case_builder.genop2('int_add', const2px, gv1)
          case_builder.finish_and_return(f2_token, gv_res_casex)
 
     builder.end()
@@ -339,21 +308,17 @@
 
     gv_cond = builder.genop1("int_is_true", gv_x)
 
-    true_builder = builder.jump_if_true(gv_cond)
+    true_builder = builder.jump_if_true(gv_cond, [gv_x])
 
-    args_gv = [gv_x]
-    true_builder.enter_next_block([signed_kind], args_gv)
-    [gv_x2] = args_gv
+    builder.enter_next_block([], [])
+    builder.finish_and_return(sigtoken, rgenop.genconst(1))
 
+    true_builder.start_writing()
     gv_y = true_builder.genop2("int_sub", gv_x, rgenop.genconst(1))
     gv_z = true_builder.genop_call(sigtoken, gv_fact, [gv_y])
     gv_w = true_builder.genop2("int_mul", gv_x, gv_z)
-
     true_builder.finish_and_return(sigtoken, gv_w)
 
-    builder.enter_next_block([], [])
-
-    builder.finish_and_return(sigtoken, rgenop.genconst(1))
     builder.end()
     return gv_fact
 
@@ -374,10 +339,14 @@
         return self.getcompiled(runner, argtypes,
                                 annotatorpolicy = GENOP_POLICY)
 
+    def cast(self, gv, nb_args):
+        print gv.value
+        return cast(c_void_p(gv.value), CFUNCTYPE(c_int, *[c_int]*nb_args))
+
     def test_adder_direct(self):
         rgenop = self.RGenOp()
         gv_add_5 = make_adder(rgenop, 5)
-        fnptr = cast(c_void_p(gv_add_5.value), CFUNCTYPE(c_int, c_int))
+        fnptr = self.cast(gv_add_5, 1)
         res = fnptr(37)
         assert res == 42
 
@@ -389,8 +358,7 @@
     def test_dummy_direct(self):
         rgenop = self.RGenOp()
         gv_dummyfn = make_dummy(rgenop)
-        print gv_dummyfn.value
-        fnptr = cast(c_void_p(gv_dummyfn.value), CFUNCTYPE(c_int, c_int, c_int))
+        fnptr = self.cast(gv_dummyfn, 2)
         res = fnptr(30, 17)
         assert res == 42
 
@@ -399,11 +367,52 @@
         res = fn(40, 37)
         assert res == 42
 
+    def test_hide_and_reveal(self):
+        RGenOp = self.RGenOp
+        def hide_and_reveal(v):
+            rgenop = RGenOp()
+            gv = rgenop.genconst(v)
+            res = gv.revealconst(lltype.Signed)
+            keepalive_until_here(rgenop)
+            return res
+        res = hide_and_reveal(42)
+        assert res == 42
+        fn = self.compile(hide_and_reveal, [int])
+        res = fn(42)
+        assert res == 42
+
+    def test_hide_and_reveal_p(self):
+        RGenOp = self.RGenOp
+        S = lltype.GcStruct('s', ('x', lltype.Signed))
+        S_PTR = lltype.Ptr(S)
+        s1 = lltype.malloc(S)
+        s1.x = 8111
+        s2 = lltype.malloc(S)
+        s2.x = 8222
+        def hide_and_reveal_p(n):
+            rgenop = RGenOp()
+            if n == 1:
+                s = s1
+            else:
+                s = s2
+            gv = rgenop.genconst(s)
+            s_res = gv.revealconst(S_PTR)
+            keepalive_until_here(rgenop)
+            return s_res.x
+        res = hide_and_reveal_p(1)
+        assert res == 8111
+        res = hide_and_reveal_p(2)
+        assert res == 8222
+        fn = self.compile(hide_and_reveal_p, [int])
+        res = fn(1)
+        assert res == 8111
+        res = fn(2)
+        assert res == 8222
+
     def test_branching_direct(self):
         rgenop = self.RGenOp()
         gv_branchingfn = make_branching(rgenop)
-        fnptr = cast(c_void_p(gv_branchingfn.value),
-                     CFUNCTYPE(c_int, c_int, c_int))
+        fnptr = self.cast(gv_branchingfn, 2)
         res = fnptr(30, 17)
         assert res == 29
         res = fnptr(3, 17)
@@ -419,8 +428,7 @@
     def test_goto_direct(self):
         rgenop = self.RGenOp()
         gv_gotofn = make_goto(rgenop)
-        print gv_gotofn.value
-        fnptr = cast(c_void_p(gv_gotofn.value), CFUNCTYPE(c_int, c_int, c_int))
+        fnptr = self.cast(gv_gotofn, 2)
         res = fnptr(10, 17)    # <== the segfault is here
         assert res == 3628872
         res = fnptr(3, 17)    # <== or here
@@ -436,8 +444,7 @@
     def test_if_direct(self):
         rgenop = self.RGenOp()
         gv_iffn = make_if(rgenop)
-        print gv_iffn.value
-        fnptr = cast(c_void_p(gv_iffn.value), CFUNCTYPE(c_int, c_int, c_int))
+        fnptr = self.cast(gv_iffn, 2)
         res = fnptr(30, 0)
         assert res == 45
         res = fnptr(3, 0)
@@ -453,9 +460,7 @@
     def test_switch_direct(self):
         rgenop = self.RGenOp()
         gv_switchfn = make_switch(rgenop)
-        print gv_switchfn.value
-        import os
-        fnptr = cast(c_void_p(gv_switchfn.value), CFUNCTYPE(c_int, c_int))
+        fnptr = self.cast(gv_switchfn, 2)
         res = fnptr(0, 2)
         assert res == 42
         res = fnptr(1, 16)
@@ -475,8 +480,7 @@
     def test_large_switch_direct(self):
         rgenop = self.RGenOp()
         gv_switchfn = make_large_switch(rgenop)
-        print gv_switchfn.value
-        fnptr = cast(c_void_p(gv_switchfn.value), CFUNCTYPE(c_int, c_int, c_int))
+        fnptr = self.cast(gv_switchfn, 2)
         res = fnptr(0, 2)
         assert res == 42
         for x in range(1,11):
@@ -498,8 +502,7 @@
     def test_fact_direct(self):
         rgenop = self.RGenOp()
         gv_fact = make_fact(rgenop)
-        print gv_fact.value
-        fnptr = cast(c_void_p(gv_fact.value), CFUNCTYPE(c_int))
+        fnptr = self.cast(gv_fact, 1)
         res = fnptr(2)
         assert res == 2
         res = fnptr(10)



More information about the Pypy-commit mailing list