[pypy-svn] r20845 - in pypy/dist/pypy/jit: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Dec 7 17:04:32 CET 2005


Author: cfbolz
Date: Wed Dec  7 17:04:30 2005
New Revision: 20845

Modified:
   pypy/dist/pypy/jit/llabstractinterp.py
   pypy/dist/pypy/jit/test/test_llabstractinterp.py
Log:
(cfbolz, arigo, pedronis around)

Branching.


Modified: pypy/dist/pypy/jit/llabstractinterp.py
==============================================================================
--- pypy/dist/pypy/jit/llabstractinterp.py	(original)
+++ pypy/dist/pypy/jit/llabstractinterp.py	Wed Dec  7 17:04:30 2005
@@ -1,6 +1,7 @@
 import operator
 from pypy.objspace.flow.model import Variable, Constant, SpaceOperation
 from pypy.objspace.flow.model import Block, Link, FunctionGraph
+from pypy.objspace.flow.model import checkgraph, last_exception
 from pypy.rpython.lltypesystem import lltype
 
 
@@ -117,6 +118,7 @@
         copygraph.getreturnvar().concretetype = (
             origgraph.getreturnvar().concretetype)
         returnstate.resolveblock(copygraph.returnblock)
+        checkgraph(copygraph)   # sanity-check
         return copygraph
 
     def applyhint(self, args_a, origblock):
@@ -194,24 +196,34 @@
             handler = getattr(self, 'op_' + op.opname)
             a_result = handler(op, *[binding(v) for v in op.args])
             bindings[op.result] = a_result
-        if 1:  # self.residual_operations:
-            inputargs = []
-            for v in origblock.inputargs:
-                a = bindings[v]
-                if not isinstance(a, LLConcreteValue):
-                    inputargs.append(a.getvarorconst())
-            newblock = Block(inputargs)
-            newblock.operations = self.residual_operations
-            del self.residual_operations   # just in case
-            assert origblock.exitswitch is None   # XXX
-            origlink, = origblock.exits  # XXX
+        inputargs = []
+        for v in origblock.inputargs:
+            a = bindings[v]
+            if not isinstance(a, LLConcreteValue):
+                inputargs.append(a.getvarorconst())
+        newblock = Block(inputargs)
+        newblock.operations = self.residual_operations
+        del self.residual_operations   # just in case
+        if origblock.exitswitch is None:
+            links = origblock.exits
+        elif origblock.exitswitch == Constant(last_exception):
+            XXX
+        else:
+            v = bindings[origblock.exitswitch].getvarorconst()
+            if isinstance(v, Variable):
+                newblock.exitswitch = v
+                links = origblock.exits
+            else:
+                links = [link for link in origblock.exits
+                              if link.llexitcase == v.value]
+        newlinks = []
+        for origlink in links:
             args_a = [binding(v) for v in origlink.args]
             newlink = self.schedule(args_a, origlink.target)
-            print "CLOSING"
-            newblock.closeblock(newlink)
-            state.resolveblock(newblock)
-        else:
-            XXX
+            newlinks.append(newlink)
+        print "CLOSING"
+        newblock.closeblock(*newlinks)
+        state.resolveblock(newblock)
 
     def constantfold(self, constant_op, args_a):
         concretevalues = []
@@ -249,5 +261,8 @@
 
     # ____________________________________________________________
 
+    def op_int_is_true(self, op, a):
+        return self.residualize(op, [a], operator.truth)
+
     def op_int_add(self, op, a1, a2):
         return self.residualize(op, [a1, a2], operator.add)

Modified: pypy/dist/pypy/jit/test/test_llabstractinterp.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_llabstractinterp.py	(original)
+++ pypy/dist/pypy/jit/test/test_llabstractinterp.py	Wed Dec  7 17:04:30 2005
@@ -65,6 +65,32 @@
 def test_simple2():
     def ll_function(x, y):
         return x + y
+    graph2, insns = abstrinterp(ll_function, [6, 42], [0, 1])
+    assert not insns
+
+def test_constantbranch():
+    def ll_function(x, y):
+        if x:
+            y += 1
+        y += 2
+        return y
+    graph2, insns = abstrinterp(ll_function, [6, 42], [0])
+    assert insns == {'int_add': 2}
 
+def test_constantbranch_two_constants():
+    def ll_function(x, y):
+        if x:
+            y += 1
+        y += 2
+        return y
     graph2, insns = abstrinterp(ll_function, [6, 42], [0, 1])
     assert not insns
+
+def test_branch():
+    def ll_function(x, y):
+        if x:
+            y += 1
+        y += 2
+        return y
+    graph2, insns = abstrinterp(ll_function, [6, 42], [])
+    assert insns == {'int_is_true': 1, 'int_add': 2}



More information about the Pypy-commit mailing list