[pypy-commit] pypy optresult: start fixing the merge
fijal
noreply at buildbot.pypy.org
Sat Jan 3 21:36:36 CET 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r75219:2baf29ac51a3
Date: 2015-01-03 22:36 +0200
http://bitbucket.org/pypy/pypy/changeset/2baf29ac51a3/
Log: start fixing the merge
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -173,9 +173,6 @@
class Const(AbstractValue):
__slots__ = ()
- is_source_op = True
- source_op = None
-
@staticmethod
def _new(x):
"NOT_RPYTHON"
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
@@ -151,7 +151,7 @@
opnum = OpHelpers.getfield_for_descr(op.getdescr())
getop = ResOperation(opnum, [op.getarg(0)],
op.getdescr())
- getop.source_op = result
+ xxx
if isinstance(result, Const):
optimizer.make_constant(getop, result)
getop.is_source_op = True
@@ -165,6 +165,7 @@
getop = ResOperation(opnum, [op.getarg(0), op.getarg(1)],
op.getdescr())
getop.source_op = result
+ xxx
if isinstance(result, Const):
xxx
optimizer.make_constant(getop, result)
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -245,8 +245,7 @@
# Transform into INT_ADD. The following guard will be killed
# by optimize_GUARD_NO_OVERFLOW; if we see instead an
# optimize_GUARD_OVERFLOW, then InvalidLoop.
- xxx
- op = op.copy_and_change(rop.INT_ADD)
+ op = self.replace_op_with(op, rop.INT_ADD)
self.emit_operation(op) # emit the op
r = self.getvalue(op)
r.getintbound().intersect(resbound)
@@ -527,7 +526,7 @@
def propagate_bounds_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.getintbound().sub_bound(v2.getintbound())
if v1.getintbound().intersect(b):
self.propagate_bounds_backward(op.getarg(0), v1)
@@ -538,7 +537,7 @@
def propagate_bounds_INT_SUB(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.getintbound().add_bound(v2.getintbound())
if v1.getintbound().intersect(b):
self.propagate_bounds_backward(op.getarg(0), v1)
@@ -549,7 +548,7 @@
def propagate_bounds_INT_MUL(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
- r = self.getvalue(op.result)
+ r = self.getvalue(op)
b = r.getintbound().div_bound(v2.getintbound())
if v1.getintbound().intersect(b):
self.propagate_bounds_backward(op.getarg(0), v1)
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
@@ -324,10 +324,7 @@
if intbound:
self.intbound = intbound
else:
- if isinstance(box, BoxInt):
- self.intbound = IntBound(MININT, MAXINT)
- else:
- self.intbound = IntUnbounded()
+ self.intbound = IntBound(MININT, MAXINT)
def copy_from(self, other_value):
assert isinstance(other_value, IntOptValue)
@@ -595,18 +592,16 @@
@specialize.argtype(0)
def getvalue(self, box):
- while box.source_op is not None:
- box = box.source_op
- assert box.is_source_op
box = self.getinterned(box)
try:
value = self.values[box]
except KeyError:
- if isinstance(box, BoxPtr) or isinstance(box, ConstPtr):
+ if box.type == "r":
value = self.values[box] = PtrOptValue(box)
- elif isinstance(box, BoxInt) or isinstance(box, ConstInt):
+ elif box.type == "i":
value = self.values[box] = IntOptValue(box)
else:
+ assert box.type == "f"
value = self.values[box] = OptValue(box)
self.ensure_imported(value)
return value
@@ -625,8 +620,6 @@
def get_constant_box(self, box):
if isinstance(box, Const):
return box
- while box.source_op is not None:
- box = box.source_op
try:
value = self.values[box]
self.ensure_imported(value)
@@ -657,11 +650,21 @@
# replacing with a different box
cur_value.copy_from(value)
return
+ if not replace:
+ assert box not in self.values
self.values[box] = value
+ def replace_op_with(self, op, newopnum, args=None, descr=None):
+ newop = op.copy_and_change(newopnum, args, descr)
+ if newop.type != 'v':
+ val = self.getvalue(op)
+ val.box = newop
+ self.values[newop] = val
+ return newop
+
def make_constant(self, box, constbox):
if isinstance(constbox, ConstInt):
- self.make_equal_to(box, ConstantIntValue(constbox))
+ self.getvalue(box).make_constant(constbox)
elif isinstance(constbox, ConstPtr):
self.make_equal_to(box, ConstantPtrValue(constbox))
elif isinstance(constbox, ConstFloat):
@@ -734,10 +737,6 @@
@specialize.argtype(0)
def _emit_operation(self, op):
assert not op.is_call_pure()
- if op.getopnum() == rop.GUARD_VALUE:
- val = self.getvalue(op.getarg(0))
- else:
- val = None
changed = False
orig_op = op
for i in range(op.numargs()):
@@ -751,7 +750,7 @@
newbox = value.force_box(self)
if arg is not newbox:
if not changed:
- op = op.clone()
+ op = self.replace_op_with(op, op.getopnum())
changed = True
op.setarg(i, newbox)
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS)
@@ -760,13 +759,12 @@
pendingfields = self.pendingfields
self.pendingfields = None
if self.replaces_guard and orig_op in self.replaces_guard:
- self.replace_op(self.replaces_guard[orig_op], op)
+ self.replace_guard_op(self.replaces_guard[orig_op], op)
del self.replaces_guard[op]
return
else:
- guard_op = op.clone()
- op = self.store_final_boxes_in_guard(guard_op, pendingfields,
- val)
+ guard_op = self.replace_op_with(op, op.getopnum())
+ 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
@@ -784,11 +782,11 @@
if box is not arg:
if not changed:
changed = True
- op = op.clone()
+ op = self.replace_op_with(op, op.getopnum())
op.setarg(i, box)
return op
- def replace_op(self, old_op_pos, new_op):
+ def replace_guard_op(self, old_op_pos, new_op):
old_op = self._newoperations[old_op_pos]
assert old_op.is_guard()
old_descr = old_op.getdescr()
@@ -796,7 +794,7 @@
new_descr.copy_all_attributes_from(old_descr)
self._newoperations[old_op_pos] = new_op
- def store_final_boxes_in_guard(self, op, pendingfields, val):
+ def store_final_boxes_in_guard(self, op, pendingfields):
assert pendingfields is not None
if op.getdescr() is not None:
descr = op.getdescr()
@@ -818,12 +816,12 @@
descr.store_final_boxes(op, newboxes, self.metainterp_sd)
#
if op.getopnum() == rop.GUARD_VALUE:
+ val = self.getvalue(op.getarg(0))
if val in self.bool_boxes:
# 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.
- v = self.getvalue(op)
constvalue = op.getarg(1).getint()
if constvalue == 0:
opnum = rop.GUARD_FALSE
@@ -831,9 +829,8 @@
opnum = rop.GUARD_TRUE
else:
raise AssertionError("uh?")
- newop = ResOperation(opnum, [op.getarg(0)], descr)
+ newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr)
newop.setfailargs(op.getfailargs())
- v.box = newop
return newop
else:
# a real GUARD_VALUE. Make it use one counter per value.
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
@@ -56,7 +56,7 @@
if nextop:
self.emit_operation(nextop)
if args is not None:
- self.pure_operations[args] = self.getvalue(op.result)
+ self.pure_operations[args] = self.getvalue(op)
if remember:
self.remember_emitting_pure(remember)
@@ -75,14 +75,13 @@
op.getdescr())
oldval = self.pure_operations.get(args, None)
if oldval is not None:
- assert oldop.getopnum() == op.getopnum()
# this removes a CALL_PURE that has the same (non-constant)
# arguments as a previous CALL_PURE.
self.make_equal_to(op, oldval)
self.last_emitted_operation = REMOVED
return
else:
- self.pure_operations[args] = self.getvalue(op.result)
+ self.pure_operations[args] = self.getvalue(op)
# replace CALL_PURE with just CALL
args = op.getarglist()
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
@@ -291,7 +291,6 @@
def optimize_GUARD_VALUE(self, op):
value = self.getvalue(op.getarg(0))
- opv = self.getvalue(op)
if value.is_virtual():
arg = value.get_constant_class(self.optimizer.cpu)
if arg:
@@ -346,7 +345,6 @@
value.make_constant_class(None, expectedclassbox)
def optimize_GUARD_CLASS(self, op):
- opv = self.getvalue(op)
value = self.getvalue(op.getarg(0))
expectedclassbox = op.getarg(1)
assert isinstance(expectedclassbox, Const)
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -54,7 +54,7 @@
def optimize_JUMP(self, op):
if not self.unroll:
- op = op.clone()
+ op = op.copy_and_change(op.getopnum())
descr = op.getdescr()
assert isinstance(descr, JitCellToken)
if not descr.target_tokens:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -18,7 +18,7 @@
b0 = InputArgInt()
b1 = InputArgInt()
opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
- None)
+ None, None)
op = ResOperation(rop.GUARD_TRUE, ['dummy'], None)
# setup rd data
fi0 = resume.FrameInfo(None, "code0", 11)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -97,44 +97,6 @@
class OptimizeOptTest(BaseTestWithUnroll):
-<<<<<<< local
- def setup_method(self, meth=None):
- class FailDescr(compile.ResumeGuardDescr):
- oparse = None
- def _oparser_uses_descr_of_guard(self, oparse, fail_args):
- # typically called 3 times: once when parsing 'ops',
- # once when parsing 'preamble', once when parsing 'expected'.
- self.oparse = oparse
- self.rd_frame_info_list, self.rd_snapshot = snapshot(fail_args)
- def _clone_if_mutable(self, memo):
- assert self is fdescr
- return fdescr2
- def __repr__(self):
- if self is fdescr:
- return 'fdescr'
- if self is fdescr2:
- return 'fdescr2'
- return compile.ResumeGuardDescr.__repr__(self)
- #
- def snapshot(fail_args, got=[]):
- if not got: # only the first time, i.e. when parsing 'ops'
- rd_frame_info_list = resume.FrameInfo(None, "code", 11)
- rd_snapshot = resume.Snapshot(None, fail_args)
- got.append(rd_frame_info_list)
- got.append(rd_snapshot)
- return got
- #
- fdescr = instantiate(FailDescr)
- self.namespace['fdescr'] = fdescr
- fdescr2 = instantiate(FailDescr)
- self.namespace['fdescr2'] = fdescr2
-
- def teardown_method(self, meth):
- self.namespace.pop('fdescr', None)
- self.namespace.pop('fdescr2', None)
-
-=======
->>>>>>> other
def test_simple(self):
ops = """
[]
@@ -1184,11 +1146,7 @@
i1 = getfield_gc_i(p0, descr=valuedescr)
i2 = int_sub(i1, 1)
i3 = int_add(i0, i1)
-<<<<<<< local
#i4 = same_as_i(i2) # This same_as should be killed by backend
-=======
- i4 = same_as(i2) # This same_as should be killed by backend
->>>>>>> other
jump(i3, i1, i2)
"""
expected = """
@@ -2448,31 +2406,17 @@
guard_true(i3) [p1]
i4 = int_neg(i2)
setfield_gc(p1, NULL, descr=nextdescr)
-<<<<<<< local
escape_n()
#i5 = same_as(i4)
jump(p1, i2, i4)
-=======
- escape()
- i5 = same_as(i4)
- jump(p1, i2, i4, i5)
->>>>>>> other
- """
- expected = """
-<<<<<<< local
- [p1, i2, i4]
-=======
- [p1, i2, i4, i5]
->>>>>>> other
+ """
+ expected = """
+ [p1, i2, i4] # i5
guard_true(i4) [p1]
setfield_gc(p1, NULL, descr=nextdescr)
-<<<<<<< local
escape_n()
jump(p1, i2, 1)
-=======
- escape()
- jump(p1, i2, i5, i5)
->>>>>>> other
+ #jump(p1, i2, i5, i5)
"""
self.optimize_loop(ops, expected, preamble)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -13,7 +13,7 @@
from rpython.jit.codewriter.effectinfo import EffectInfo
from rpython.jit.metainterp.logger import LogOperations
from rpython.jit.codewriter.heaptracker import register_known_gctype
-from rpython.jit.tool.oparser import parse, pure_parse
+from rpython.jit.tool.oparser import OpParser
from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
from rpython.jit.metainterp import compile, resume, history
from rpython.jit.metainterp.jitprof import EmptyProfiler
@@ -356,7 +356,7 @@
_kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
return sorted(boxes, key=lambda box: _kind2count[box.type])
-final_descr = BasicFinalDescr()
+final_descr = history.BasicFinalDescr()
class BaseTest(object):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -268,9 +268,7 @@
# in case it does, we would prefer to be suboptimal in asm
# to a fatal RPython exception.
# XXX investigate what is it
- source_op = newresult
- while source_op.source_op:
- source_op = source_op.source_op
+ xxxx
if source_op is not op and \
not self.short_boxes.has_producer(newresult) and \
not newvalue.is_constant():
@@ -396,6 +394,7 @@
target_token = start_label.getdescr()
assert isinstance(target_token, TargetToken)
+ xxx
# Turn guards into conditional jumps to the preamble
#for i in range(len(short)):
# op = short[i]
@@ -607,7 +606,6 @@
while i < len(short_preamble):
shop = short_preamble[i]
newop = shop.clone(memo)
- newop.is_source_op = True
if newop.is_guard():
if not patchguardop:
raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -638,6 +638,7 @@
return alts
def add_to_short(self, box, op):
+ xxx
#if op:
# op = op.clone(self.memo)
# op.is_source_op = True
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -66,7 +66,6 @@
mode.STRLEN, [box])
else:
lengthop = ResOperation(mode.STRLEN, [box])
- lengthop.is_source_op = True
string_optimizer.emit_operation(lengthop)
return lengthop
@@ -111,7 +110,7 @@
assert self.source_op is not None
lengthbox = self.getstrlen(optforce, self.mode, None)
op = ResOperation(self.mode.NEWSTR, [lengthbox])
- op.source_op = self.source_op
+ xxx
self.box = op
if not we_are_translated():
op.name = 'FORCE'
@@ -360,7 +359,7 @@
if string_optimizer is None:
return None
op = ResOperation(rop.INT_ADD, [box1, box2])
- op.is_source_op = True
+ xxx
string_optimizer.emit_operation(op)
return op
@@ -371,7 +370,7 @@
if isinstance(box1, ConstInt):
return ConstInt(box1.value - box2.value)
op = ResOperation(rop.INT_SUB, [box1, box2])
- op.is_source_op = True
+ xxx
string_optimizer.emit_operation(op)
return op
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -292,8 +292,8 @@
def setfailargs(self, fail_args):
self._fail_args = fail_args
- def copy_and_change(self, opnum, args=None, result=None, descr=None):
- newop = AbstractResOp.copy_and_change(self, opnum, args, result, descr)
+ def copy_and_change(self, opnum, args=None, descr=None):
+ newop = AbstractResOp.copy_and_change(self, opnum, args, descr)
assert isinstance(newop, GuardResOp)
newop.setfailargs(self.getfailargs())
newop.rd_snapshot = self.rd_snapshot
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -372,15 +372,8 @@
storage = self.storage
# make sure that nobody attached resume data to this guard yet
assert not storage.rd_numb
-<<<<<<< local
- snapshot = storage.rd_snapshot
- if snapshot is None:
- assert not we_are_translated()
- return # for tests in optimizeopt
-=======
snapshot = self.snapshot_storage.rd_snapshot
assert snapshot is not None # is that true?
->>>>>>> other
numb, liveboxes_from_env, v = self.memo.number(optimizer, snapshot)
self.liveboxes_from_env = liveboxes_from_env
self.liveboxes = {}
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -22,6 +22,16 @@
def getopname(self):
return 'escape'
+ def copy_and_change(self, opnum, args=None, descr=None):
+ assert opnum == self.OPNUM
+ op = self.__class__()
+ if args is not None:
+ op.initarglist(args)
+ else:
+ op.initarglist(self._args)
+ assert descr is None
+ return op
+
def clone(self, memo):
op = self.__class__()
op.initarglist([memo.get(arg, arg) for arg in self.getarglist()])
@@ -71,7 +81,7 @@
op.initarglist(self.getarglist()[:])
return op
- def _copy_and_change(self, opnum, args=None, descr=None):
+ def copy_and_change(self, opnum, args=None, descr=None):
assert opnum == self.OPNUM
newop = FORCE_SPILL()
newop.initarglist(args or self.getarglist())
More information about the pypy-commit
mailing list