[pypy-commit] pypy pypy-dont-copy-ops: fixes
fijal
noreply at buildbot.pypy.org
Tue Dec 30 13:43:09 CET 2014
Author: Maciej Fijalkowski <fijall at 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
More information about the pypy-commit
mailing list