Author: Maciej Fijalkowski <fij...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit