[pypy-commit] pypy result-in-resops: first real virtual test
fijal
noreply at buildbot.pypy.org
Sun Oct 28 18:41:43 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r58535:a08cae4bda5b
Date: 2012-10-28 18:21 +0100
http://bitbucket.org/pypy/pypy/changeset/a08cae4bda5b/
Log: first real virtual test
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -368,21 +368,29 @@
return pendingfields
def optimize_GETFIELD_GC_i(self, op):
- structvalue = self.getvalue(op.getarg(0))
+ structvalue = self.getforwarded(op.getarg(0))
cf = self.field_cache(op.getdescr())
fieldvalue = cf.getfield_from_cache(self, structvalue)
if fieldvalue is not None:
self.replace(op, fieldvalue.op)
return
# default case: produce the operation
- structvalue.ensure_nonnull()
- self.emit_operation(op)
- # then remember the result of reading the field
- fieldvalue = self.getvalue(op)
- cf.remember_field_value(structvalue, fieldvalue, op)
+ structvalue.setknownnonnull(True)
+ return op
+
optimize_GETFIELD_GC_r = optimize_GETFIELD_GC_i
optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
+ def postprocess_GETFIELD_GC_i(self, op):
+ # then remember the result of reading the field
+ structvalue = self.getforwarded(op.getarg(0))
+ fieldvalue = self.getforwarded(op)
+ cf = self.field_cache(op.getdescr())
+ cf.remember_field_value(structvalue, fieldvalue, op)
+
+ postprocess_GETFIELD_GC_r = postprocess_GETFIELD_GC_i
+ postprocess_GETFIELD_GC_f = postprocess_GETFIELD_GC_i
+
def optimize_GETFIELD_GC_PURE_i(self, op):
structvalue = self.getvalue(op.getarg(0))
cf = self.field_cache(op.getdescr())
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -561,6 +561,7 @@
def store_final_boxes_in_guard(self, op):
return op # XXX we disable it for tests
+ xxxx
assert op.getdescr() is None
descr = op.invent_descr(self.jitdriver_sd, self.metainterp_sd)
op.setdescr(descr)
@@ -573,29 +574,6 @@
raise compile.giveup()
descr.store_final_boxes(op, newboxes)
#
- xxx
- if op.getopnum() == rop.GUARD_VALUE:
- xxx
- if self.getvalue(op.getarg(0)).is_bool_box:
- # Hack: turn guard_value(bool) into guard_true/guard_false.
- # This is done after the operation is emitted to let
- # store_final_boxes_in_guard set the guard_opnum field of the
- # descr to the original rop.GUARD_VALUE.
- constvalue = op.getarg(1).getint()
- if constvalue == 0:
- newop = create_resop_1(rop.GUARD_FALSE, None,
- op.getarg(0))
- elif constvalue == 1:
- newop = create_resop_1(rop.GUARD_TRUE, None,
- op.getarg(0))
- else:
- raise AssertionError("uh?")
- newop.set_extra("failargs", op.get_extra("failargs"))
- self.replace(op, newop)
- return newop
- else:
- # a real GUARD_VALUE. Make it use one counter per value.
- descr.make_a_counter_per_value(op)
return op
def optimize_default(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -440,8 +440,8 @@
fieldvalue = self.optimizer.new_const(op.getdescr())
self.optimizer.replace(op, fieldvalue)
else:
- value.ensure_nonnull()
- self.emit_operation(op)
+ value.setknownnonnull(True)
+ return op
optimize_GETFIELD_GC_r = optimize_GETFIELD_GC_i
optimize_GETFIELD_GC_f = optimize_GETFIELD_GC_i
diff --git a/pypy/jit/metainterp/virtualmodel.py b/pypy/jit/metainterp/virtualmodel.py
--- a/pypy/jit/metainterp/virtualmodel.py
+++ b/pypy/jit/metainterp/virtualmodel.py
@@ -1,5 +1,6 @@
-from pypy.jit.metainterp.resoperation import rop, opclasses
+from pypy.jit.metainterp.resoperation import rop, opclasses, create_resop_2
+from pypy.rlib.objectmodel import we_are_translated
NEW_WITH_VTABLE = opclasses[rop.NEW_WITH_VTABLE]
@@ -34,8 +35,19 @@
def force(self, optimizer):
if not self._is_forced:
+ self._is_forced = True
optimizer.emit_operation(self)
- self._is_forced = True
+ iteritems = self._fields.iteritems()
+ if not we_are_translated(): #random order is fine, except for tests
+ iteritems = list(iteritems)
+ iteritems.sort(key = lambda (x,y): x.sort_key())
+ for ofs, value in iteritems:
+ if value.is_null():
+ continue
+ subbox = value.force(optimizer)
+ op = create_resop_2(rop.SETFIELD_GC, None, self, subbox,
+ descr=ofs)
+ optimizer.emit_operation(op)
return self
def is_virtual(self):
More information about the pypy-commit
mailing list