Author: Maciej Fijalkowski <fij...@gmail.com> Branch: pypy-dont-copy-ops Changeset: r75159:9053d96eece4 Date: 2014-12-30 14:42 +0200 http://bitbucket.org/pypy/pypy/changeset/9053d96eece4/
Log: fixes diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -130,7 +130,7 @@ label = ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(jitcell_token)) end_label = ResOperation(rop.LABEL, jumpargs, None, descr=jitcell_token) - part.operations = [label] + h_ops + [end_label] + part.operations = [label] + h_ops[start:] + [end_label] try: start_state = optimize_trace(metainterp_sd, jitdriver_sd, part, @@ -208,7 +208,7 @@ h_ops = history.operations part.operations = [partial_trace.operations[-1]] + \ - h_ops + \ + h_ops[start:] + \ [ResOperation(rop.JUMP, jumpargs, None, descr=loop_jitcell_token)] label = part.operations[0] orignial_label = label.clone() @@ -768,8 +768,7 @@ hidden_all_virtuals = obj.hide(metainterp_sd.cpu) metainterp_sd.cpu.set_savedata_ref(deadframe, hidden_all_virtuals) -def invent_fail_descr_for_op(op, optimizer): - opnum = op.getopnum() +def invent_fail_descr_for_op(opnum, optimizer): if opnum == rop.GUARD_NOT_FORCED or opnum == rop.GUARD_NOT_FORCED_2: resumedescr = ResumeGuardForcedDescr() resumedescr._init(optimizer.metainterp_sd, optimizer.jitdriver_sd) @@ -837,7 +836,6 @@ # it does not work -- i.e. none of the existing old_loop_tokens match. new_trace = create_empty_loop(metainterp) new_trace.inputargs = metainterp.history.inputargs[:] - # clone ops, as optimize_bridge can mutate the ops new_trace.operations = metainterp.history.operations[:] metainterp_sd = metainterp.staticdata diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -94,10 +94,12 @@ else: return self._cached_fields.get(structvalue, None) - def remember_field_value(self, structvalue, fieldvalue, getfield_op=None): + def remember_field_value(self, structvalue, fieldvalue, op=None, + optimizer=None): assert self._lazy_setfield is None self._cached_fields[structvalue] = fieldvalue - self._cached_fields_getfield_op[structvalue] = getfield_op + op = optimizer.get_op_replacement(op) + self._cached_fields_getfield_op[structvalue] = op def force_lazy_setfield(self, optheap, can_cache=True): op = self._lazy_setfield @@ -121,7 +123,8 @@ # field. structvalue = optheap.getvalue(op.getarg(0)) fieldvalue = optheap.getvalue(op.getarglist()[-1]) - self.remember_field_value(structvalue, fieldvalue, op) + self.remember_field_value(structvalue, fieldvalue, op, + optheap.optimizer) elif not can_cache: self.clear() @@ -446,7 +449,7 @@ self.emit_operation(op) # then remember the result of reading the field fieldvalue = self.getvalue(op.result) - cf.remember_field_value(structvalue, fieldvalue, op) + cf.remember_field_value(structvalue, fieldvalue, op, self.optimizer) def optimize_GETFIELD_GC_PURE(self, op): structvalue = self.getvalue(op.getarg(0)) @@ -490,7 +493,7 @@ # the remember the result of reading the array item if cf is not None: fieldvalue = self.getvalue(op.result) - cf.remember_field_value(arrayvalue, fieldvalue, op) + cf.remember_field_value(arrayvalue, fieldvalue, op, self.optimizer) def optimize_GETARRAYITEM_GC_PURE(self, op): arrayvalue = self.getvalue(op.getarg(0)) diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -239,14 +239,17 @@ def make_nonnull(self, optimizer): assert self.getlevel() < LEVEL_NONNULL self.setlevel(LEVEL_NONNULL) - self.last_guard_pos = len(optimizer._newoperations) + if optimizer is not None: + self.last_guard_pos = len(optimizer._newoperations) - 1 + assert self.get_last_guard(optimizer).is_guard() def make_constant_class(self, optimizer, classbox): assert self.getlevel() < LEVEL_KNOWNCLASS self.known_class = classbox self.setlevel(LEVEL_KNOWNCLASS) if optimizer is not None: - self.last_guard_pos = len(optimizer._newoperations) + self.last_guard_pos = len(optimizer._newoperations) - 1 + assert self.get_last_guard(optimizer).is_guard() def import_from(self, other, optimizer): OptValue.import_from(self, other, optimizer) @@ -381,7 +384,7 @@ def get_last_guard(self, optimizer): return None - def get_known_class(self, optimizer): + def get_known_class(self): return None def getlenbound(self): @@ -602,6 +605,13 @@ self.ensure_imported(value) return value + def get_box_replacement(self, box): + try: + v = self.values[box] + except KeyError: + return box + return v.get_key_box() + def ensure_imported(self, value): pass @@ -726,9 +736,10 @@ else: self.ensure_imported(value) newbox = value.force_box(self) - if not changed and arg is not newbox: - op = op.clone() - changed = True + if arg is not newbox: + if not changed: + op = op.clone() + changed = True op.setarg(i, newbox) self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS) if op.is_guard(): @@ -744,8 +755,25 @@ op = self.store_final_boxes_in_guard(guard_op, pendingfields) elif op.can_raise(): self.exception_might_have_happened = True + self._last_emitted_op = orig_op self._newoperations.append(op) + def get_op_replacement(self, op): + changed = False + for i, arg in enumerate(op.getarglist()): + try: + v = self.values[arg] + except KeyError: + pass + else: + box = v.get_key_box() + if box is not arg: + if not changed: + changed = True + op = op.clone() + op.setarg(i, box) + return op + def replace_op(self, old_op_pos, new_op): old_op = self._newoperations[old_op_pos] assert old_op.is_guard() @@ -760,7 +788,7 @@ descr = op.getdescr() assert isinstance(descr, compile.ResumeAtPositionDescr) else: - descr = compile.invent_fail_descr_for_op(op, self) + descr = compile.invent_fail_descr_for_op(op.getopnum(), self) op.setdescr(descr) assert isinstance(descr, compile.ResumeGuardDescr) assert isinstance(op, GuardResOp) @@ -799,13 +827,7 @@ n = op.numargs() args = [None] * (n + 2) for i in range(n): - arg = op.getarg(i) - try: - value = self.values[arg] - except KeyError: - pass - else: - arg = value.get_key_box() + arg = self.get_box_replacement(op.getarg(i)) args[i] = arg args[n] = ConstInt(op.getopnum()) args[n + 1] = op.getdescr() diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py --- a/rpython/jit/metainterp/optimizeopt/pure.py +++ b/rpython/jit/metainterp/optimizeopt/pure.py @@ -26,6 +26,7 @@ nextop = None args = None + remember = None if canfold: for i in range(op.numargs()): if self.get_constant_box(op.getarg(i)) is None: @@ -45,7 +46,7 @@ self.optimizer.make_equal_to(op.result, oldvalue, True) return else: - self.remember_emitting_pure(op) + remember = op # otherwise, the operation remains self.emit_operation(op) @@ -55,6 +56,8 @@ self.emit_operation(nextop) if args is not None: self.pure_operations[args] = self.getvalue(op.result) + if remember: + self.remember_emitting_pure(remember) def optimize_CALL_PURE(self, op): # Step 1: check if all arguments are constant @@ -77,12 +80,12 @@ return else: self.pure_operations[args] = self.getvalue(op.result) - self.remember_emitting_pure(op) # replace CALL_PURE with just CALL args = op.getarglist() self.emit_operation(ResOperation(rop.CALL, args, op.result, op.getdescr())) + self.remember_emitting_pure(op) def optimize_GUARD_NO_EXCEPTION(self, op): if self.last_emitted_operation is REMOVED: @@ -112,6 +115,7 @@ return self.pure_operations.get(key, None) def remember_emitting_pure(self, op): + op = self.optimizer.get_op_replacement(op) self.emitted_pure_operations[op] = True def produce_potential_short_preamble_ops(self, sb): diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -317,6 +317,7 @@ args = [old_guard_op.getarg(0), op.getarg(1)], descr = descr) self.optimizer.replace_guard(op, value) + descr.make_a_counter_per_value(op) # to be safe if isinstance(value, PtrOptValue): value.last_guard_pos = -1 @@ -364,8 +365,13 @@ args = [old_guard_op.getarg(0), op.getarg(1)], descr=descr) self.optimizer.replace_guard(op, value) + # not emitting the guard, so we have to pass None to + # make_constant_class, so last_guard_pos is not updated + self.emit_operation(op) + value.make_constant_class(None, expectedclassbox) + return + self.emit_operation(op) value.make_constant_class(self.optimizer, expectedclassbox) - self.emit_operation(op) def optimize_GUARD_NONNULL_CLASS(self, op): value = self.getvalue(op.getarg(0)) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py @@ -125,12 +125,12 @@ ptr = PtrOptValue(BoxPtr()) nonnull = PtrOptValue(BoxPtr()) - nonnull.make_nonnull(0) + nonnull.make_nonnull(None) knownclass = PtrOptValue(BoxPtr()) clsbox = self.cpu.ts.cls_of_box(BoxPtr(self.myptr)) - knownclass.make_constant_class(clsbox, 0) + knownclass.make_constant_class(None, clsbox) const = PtrOptValue(BoxPtr) - const.make_constant_class(clsbox, 0) + const.make_constant_class(None, clsbox) const.make_constant(ConstPtr(self.myptr)) inorder = [ptr, nonnull, knownclass, const] for i in range(len(inorder)): @@ -181,18 +181,18 @@ def test_known_class_generalization(self): knownclass1 = PtrOptValue(BoxPtr()) - knownclass1.make_constant_class(ConstPtr(self.myptr), 0) + knownclass1.make_constant_class(None, ConstPtr(self.myptr)) info1 = NotVirtualStateInfo(knownclass1) info1.position = 0 knownclass2 = PtrOptValue(BoxPtr()) - knownclass2.make_constant_class(ConstPtr(self.myptr), 0) + knownclass2.make_constant_class(None, ConstPtr(self.myptr)) info2 = NotVirtualStateInfo(knownclass2) info2.position = 0 self.check_no_guards(info1, info2) self.check_no_guards(info2, info1) knownclass3 = PtrOptValue(BoxPtr()) - knownclass3.make_constant_class(ConstPtr(self.myptr2), 0) + knownclass3.make_constant_class(None, ConstPtr(self.myptr2)) info3 = NotVirtualStateInfo(knownclass3) info3.position = 0 self.check_invalid(info1, info3) @@ -221,11 +221,11 @@ knownclass_val = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - knownclass_val.make_constant_class(classbox, -1) + knownclass_val.make_constant_class(None, classbox,) knownclass_info = NotVirtualStateInfo(knownclass_val) knownclass2_val = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - knownclass2_val.make_constant_class(classbox, -1) + knownclass2_val.make_constant_class(None, classbox) knownclass2_info = NotVirtualStateInfo(knownclass2_val) constant_val = IntOptValue(BoxInt()) @@ -385,7 +385,7 @@ def test_known_class(self): value1 = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value1.make_constant_class(classbox, -1) + value1.make_constant_class(None, classbox) info1 = NotVirtualStateInfo(value1) info2 = NotVirtualStateInfo(PtrOptValue(self.nodebox)) expected = """ @@ -399,7 +399,7 @@ def test_known_class_value(self): value1 = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value1.make_constant_class(classbox, -1) + value1.make_constant_class(None, classbox) box = self.nodebox guards = value1.make_guards(box) expected = """ @@ -423,7 +423,7 @@ def test_equal_inputargs(self): value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) vstate1 = VirtualState([knownclass_info, knownclass_info]) assert vstate1.generalization_of(vstate1) @@ -461,7 +461,7 @@ def test_generate_guards_on_virtual_fields_matches_array(self): innervalue1 = PtrOptValue(self.nodebox) constclassbox = self.cpu.ts.cls_of_box(self.nodebox) - innervalue1.make_constant_class(constclassbox, -1) + innervalue1.make_constant_class(None, constclassbox) innerinfo1 = NotVirtualStateInfo(innervalue1) innerinfo1.position = 1 innerinfo2 = NotVirtualStateInfo(PtrOptValue(self.nodebox)) @@ -488,7 +488,7 @@ def test_generate_guards_on_virtual_fields_matches_instance(self): innervalue1 = PtrOptValue(self.nodebox) constclassbox = self.cpu.ts.cls_of_box(self.nodebox) - innervalue1.make_constant_class(constclassbox, -1) + innervalue1.make_constant_class(None, constclassbox) innerinfo1 = NotVirtualStateInfo(innervalue1) innerinfo1.position = 1 innerinfo2 = NotVirtualStateInfo(PtrOptValue(self.nodebox)) @@ -513,7 +513,7 @@ def test_generate_guards_on_virtual_fields_matches_struct(self): innervalue1 = PtrOptValue(self.nodebox) constclassbox = self.cpu.ts.cls_of_box(self.nodebox) - innervalue1.make_constant_class(constclassbox, -1) + innervalue1.make_constant_class(None, constclassbox) innerinfo1 = NotVirtualStateInfo(innervalue1) innerinfo1.position = 1 innerinfo2 = NotVirtualStateInfo(PtrOptValue(self.nodebox)) @@ -540,7 +540,7 @@ def test_generate_guards_on_virtual_fields_matches_arraystruct(self): innervalue1 = PtrOptValue(self.nodebox) constclassbox = self.cpu.ts.cls_of_box(self.nodebox) - innervalue1.make_constant_class(constclassbox, -1) + innervalue1.make_constant_class(None, constclassbox) innerinfo1 = NotVirtualStateInfo(innervalue1) innerinfo1.position = 1 innerinfo2 = NotVirtualStateInfo(PtrOptValue(self.nodebox)) @@ -572,7 +572,7 @@ info1 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -600,7 +600,7 @@ info1 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -609,7 +609,7 @@ info2 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info, knownclass_info] vstate2 = VirtualState([info2]) @@ -622,7 +622,7 @@ info1 = VirtualStateInfo(ConstInt(42), [10, 20]) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -631,7 +631,7 @@ info2 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info, knownclass_info] vstate2 = VirtualState([info2]) @@ -644,7 +644,7 @@ info1 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -653,7 +653,7 @@ info2 = VirtualStateInfo(ConstInt(7), [1, 2]) value = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info, knownclass_info] vstate2 = VirtualState([info2]) @@ -666,7 +666,7 @@ info1 = VirtualStateInfo(ConstInt(42), [1, 2]) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -683,7 +683,7 @@ info1 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -692,7 +692,7 @@ info2 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info, knownclass_info] vstate2 = VirtualState([info2]) @@ -705,7 +705,7 @@ info1 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -714,7 +714,7 @@ info2 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info] vstate2 = VirtualState([info2]) @@ -727,7 +727,7 @@ info1 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -736,7 +736,7 @@ info2 = VArrayStateInfo(7) value = PtrOptValue(self.nodebox2) classbox = self.cpu.ts.cls_of_box(self.nodebox2) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info2.fieldstate = [knownclass_info, knownclass_info] vstate2 = VirtualState([info2]) @@ -749,7 +749,7 @@ info1 = VArrayStateInfo(42) value = PtrOptValue(self.nodebox) classbox = self.cpu.ts.cls_of_box(self.nodebox) - value.make_constant_class(classbox, -1) + value.make_constant_class(None, classbox) knownclass_info = NotVirtualStateInfo(value) info1.fieldstate = [knownclass_info, knownclass_info] vstate1 = VirtualState([info1]) @@ -766,7 +766,7 @@ def test_crash_varay_clear(self): innervalue1 = PtrOptValue(self.nodebox) constclassbox = self.cpu.ts.cls_of_box(self.nodebox) - innervalue1.make_constant_class(constclassbox, -1) + innervalue1.make_constant_class(None, constclassbox) innerinfo1 = NotVirtualStateInfo(innervalue1) innerinfo1.position = 1 innerinfo1.position_in_notvirtuals = 0 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit