[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