[pypy-svn] r25196 - in pypy/dist/pypy/jit: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Mar 31 19:25:59 CEST 2006
Author: arigo
Date: Fri Mar 31 19:25:58 2006
New Revision: 25196
Modified:
pypy/dist/pypy/jit/hintmodel.py
pypy/dist/pypy/jit/rtimeshift.py
pypy/dist/pypy/jit/test/test_hint_timeshift.py
pypy/dist/pypy/jit/test/test_llabstractinterp.py
Log:
(pedronis, arre, arigo)
Pass the next test: propagation of VirtualRedBoxes across links.
Modified: pypy/dist/pypy/jit/hintmodel.py
==============================================================================
--- pypy/dist/pypy/jit/hintmodel.py (original)
+++ pypy/dist/pypy/jit/hintmodel.py Fri Mar 31 19:25:58 2006
@@ -168,6 +168,11 @@
def setfield(hs_v1, hs_fieldname, hs_value):
pass
+ def getsubstruct(hs_v1, hs_fieldname):
+ S = hs_v1.concretetype.TO
+ FIELD_TYPE = getattr(S, hs_fieldname.const)
+ return SomeLLAbstractVariable(lltype.Ptr(FIELD_TYPE))
+
class __extend__(SomeLLAbstractConstant):
def hint(hs_c1, hs_flags):
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Fri Mar 31 19:25:58 2006
@@ -32,6 +32,9 @@
def same_constant(self, other):
return False
+ def getallvariables(self, result_gv):
+ pass
+
# generic implementation of some operations
def op_getfield(self, jitstate, fielddesc):
op_args = lltype.malloc(VARLIST.TO, 2)
@@ -59,6 +62,14 @@
def getgenvar(self, jitstate):
return self.genvar
+ def getallvariables(self, result_gv):
+ result_gv.append(self.genvar)
+
+ def copybox(self, newblock, gv_type):
+ newgenvar = rgenop.geninputarg(newblock, gv_type)
+ return VarRedBox(newgenvar)
+
+
VCONTAINER = lltype.GcStruct("vcontainer")
class ContainerRedBox(RedBox):
@@ -116,6 +127,25 @@
boxes[i])
return self.genvar
+ def getallvariables(self, result_gv):
+ if self.genvar:
+ result_gv.append(self.genvar)
+ else:
+ for smallbox in self.content_boxes:
+ smallbox.getallvariables(result_gv)
+
+ def copybox(self, newblock, gv_type):
+ if self.genvar:
+ newgenvar = rgenop.geninputarg(newblock, gv_type)
+ return VarRedBox(newgenvar)
+ bigbox = VirtualRedBox(self.typedesc)
+ for i in range(len(bigbox.content_boxes)):
+ # XXX need a memo for sharing
+ gv_fldtype = self.typedesc.fielddescs[i].gv_resulttype
+ bigbox.content_boxes[i] = self.content_boxes[i].copybox(newblock,
+ gv_fldtype)
+ return bigbox
+
def op_getfield(self, jitstate, fielddesc):
if self.content_boxes is None:
return RedBox.op_getfield(self, jitstate, fielddesc)
@@ -137,6 +167,9 @@
def getgenvar(self, jitstate):
return self.genvar
+ def copybox(self, newblock, gv_type):
+ return self
+
def ll_fromvalue(value):
T = lltype.typeOf(value)
gv = rgenop.genconst(value)
@@ -435,15 +468,13 @@
return jitstate
retrieve_jitstate_for_merge._annspecialcase_ = "specialize:arglltype(2)"
-def enter_block(jitstate, redboxes, TYPES):
+def enter_block(jitstate, redboxes, types_gv):
newblock = rgenop.newblock()
incoming = []
for i in range(len(redboxes)):
redbox = redboxes[i]
- if isinstance(redbox, VarRedBox):
- incoming.append(redbox.genvar)
- newgenvar = rgenop.geninputarg(newblock, TYPES[i])
- redboxes[i] = VarRedBox(newgenvar)
+ redbox.getallvariables(incoming)
+ redboxes[i] = redbox.copybox(newblock, types_gv[i])
rgenop.closelink(jitstate.curoutgoinglink, incoming, newblock)
jitstate.curblock = newblock
jitstate.curoutgoinglink = lltype.nullptr(rgenop.LINK.TO)
Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py (original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py Fri Mar 31 19:25:58 2006
@@ -372,3 +372,30 @@
insns, res = timeshift(ll_function, [42], [], policy=P_NOVIRTUAL)
assert res == 42
assert insns == {}
+
+def test_red_propagate():
+ S = lltype.GcStruct('S', ('n', lltype.Signed))
+ def ll_function(n, k):
+ s = lltype.malloc(S)
+ s.n = n
+ if k < 0:
+ return -123
+ return s.n * k
+ insns, res = timeshift(ll_function, [3, 8], [], policy=P_NOVIRTUAL)
+ assert res == 24
+ assert insns == {'int_lt': 1, 'int_mul': 1}
+
+def test_red_subcontainer():
+ py.test.skip("in-progress")
+ S = lltype.Struct('S', ('n', lltype.Signed))
+ T = lltype.GcStruct('T', ('s', S), ('n', lltype.Float))
+ def ll_function(k):
+ t = lltype.malloc(T)
+ s = t.s
+ s.n = k
+ if k > 0:
+ k -= 1
+ return s.n * k
+ insns, res = timeshift(ll_function, [7], [], policy=P_NOVIRTUAL)
+ assert res == 42
+ #assert insns == ... in-progress
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 Fri Mar 31 19:25:58 2006
@@ -66,7 +66,8 @@
graph = graphs.pop()
for block in graph.iterblocks():
for op in block.operations:
- insns[op.opname] = insns.get(op.opname, 0) + 1
+ if op.opname != 'same_as':
+ insns[op.opname] = insns.get(op.opname, 0) + 1
for arg in op.args:
if isinstance(arg, flowmodel.Constant):
if (isinstance(arg.concretetype, lltype.Ptr) and
More information about the Pypy-commit
mailing list