Author: fijal
Branch: jit-leaner-frontend
Changeset: r83069:5413d954e8a2
Date: 2016-03-15 15:28 +0200
http://bitbucket.org/pypy/pypy/changeset/5413d954e8a2/
Log: try to not have position on resop at all
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
@@ -7,7 +7,8 @@
from rpython.conftest import option
from rpython.jit.metainterp.resoperation import ResOperation, rop,\
- AbstractValue, oparity, AbstractResOp, IntOp, RefOp, FloatOp
+ AbstractValue, oparity, AbstractResOp, IntOp, RefOp, FloatOp,\
+ opclasses
from rpython.jit.codewriter import heaptracker, longlong
import weakref
@@ -647,15 +648,27 @@
def __init__(self, pos):
self.position = pos
+ def get_position(self):
+ return self.position
+
class IntFrontendOp(IntOp, FrontendOp):
_attrs_ = ('position', '_resint')
+ def copy_value_from(self, other):
+ self._resint = other.getint()
+
class FloatFrontendOp(FloatOp, FrontendOp):
_attrs_ = ('position', '_resfloat')
+ def copy_value_from(self, other):
+ self._resfloat = other.getfloatstorage()
+
class RefFrontendOp(RefOp, FrontendOp):
_attrs_ = ('position', '_resref')
+ def copy_value_from(self, other):
+ self._resref = other.getref_base()
+
class History(object):
ends_with_jump = False
trace = None
@@ -673,12 +686,9 @@
self.inputargs = inpargs
if self._cache:
# hack to record the ops *after* we know our inputargs
- for op in self._cache:
- newop = self.trace.record_op(op.getopnum(), op.getarglist(),
- op.getdescr())
- op.position = newop.position
- if op.type != 'v':
- newop.copy_value_from(op)
+ for (opnum, argboxes, op, descr) in self._cache:
+ pos = self.trace.record_op(opnum, argboxes, descr)
+ op.position = pos
self._cache = None
def length(self):
@@ -710,29 +720,39 @@
@specialize.argtype(3)
def record(self, opnum, argboxes, value, descr=None):
if self.trace is None:
- op = ResOperation(opnum, argboxes, -1, descr)
- self._cache.append(op)
+ pos = -1
else:
- pos = self.trace._record_op(opnum, argboxes, descr)
- if value is None:
- op = FrontendOp(pos)
- elif isinstance(value, bool):
- op = IntFrontendOp(pos)
- elif lltype.typeOf(value) == lltype.Signed:
- op = IntFrontendOp(pos)
- elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
- op = FloatFrontendOp(pos)
- else:
- op = RefFrontendOp(pos)
+ pos = self.trace.record_op(opnum, argboxes, descr)
+ if value is None:
+ op = FrontendOp(pos)
+ elif isinstance(value, bool):
+ op = IntFrontendOp(pos)
+ elif lltype.typeOf(value) == lltype.Signed:
+ op = IntFrontendOp(pos)
+ elif lltype.typeOf(value) is longlong.FLOATSTORAGE:
+ op = FloatFrontendOp(pos)
+ else:
+ op = RefFrontendOp(pos)
+ if self.trace is None:
+ self._cache.append((opnum, argboxes, op, descr))
self.set_op_value(op, value)
return op
def record_nospec(self, opnum, argboxes, descr=None):
- return self.trace.record_op(opnum, argboxes, descr)
+ tp = opclasses[opnum].type
+ pos = self.trace.record_op(opnum, argboxes, descr)
+ if tp == 'v':
+ return FrontendOp(pos)
+ elif tp == 'i':
+ return IntFrontendOp(pos)
+ elif tp == 'f':
+ return FloatFrontendOp(pos)
+ assert tp == 'r'
+ return RefFrontendOp(pos)
def record_default_val(self, opnum, argboxes, descr=None):
assert rop.is_same_as(opnum)
- op = self.trace.record_op(opnum, argboxes, descr)
+ op = self.record_nospec(opnum, argboxes, descr)
op.copy_value_from(argboxes[0])
return op
diff --git a/rpython/jit/metainterp/opencoder.py
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -133,7 +133,7 @@
descr = self.trace._descrs[descr_index]
else:
descr = None
- res = ResOperation(opnum, args, -1, descr=descr)
+ res = ResOperation(opnum, args, descr=descr)
if rop.is_guard(opnum):
assert isinstance(res, GuardResOp)
res.rd_resume_position = descr_index
@@ -288,7 +288,7 @@
else:
assert False, "unreachable code"
- def _record_op(self, opnum, argboxes, descr=None):
+ def record_op(self, opnum, argboxes, descr=None):
pos = self._count
self.append(opnum)
expected_arity = oparity[opnum]
@@ -319,12 +319,6 @@
self.append(-upper-1)
self.append(lower)
- def record_op(self, opnum, argboxes, descr=None):
- # return an ResOperation instance, ideally die in hell
- pos = self._record_op(opnum, argboxes, descr)
- assert opnum >= 0
- return ResOperation(opnum, argboxes, pos, descr)
-
def _list_of_boxes(self, boxes):
array = [rffi.cast(rffi.SHORT, 0)] * len(boxes)
for i in range(len(boxes)):
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
@@ -206,7 +206,7 @@
def pure_from_args(self, opnum, args, op, descr=None):
newop = ResOperation(opnum,
[self.get_box_replacement(arg) for arg in args],
- -1, descr=descr)
+ descr=descr)
newop.set_forwarded(op)
self.pure(opnum, newop)
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
@@ -56,13 +56,13 @@
arg0 = op.getarg(0)
arg1 = op.getarg(1)
if oldopnum != -1:
- top = ResOperation(oldopnum, [arg0, arg1], -1)
+ top = ResOperation(oldopnum, [arg0, arg1])
if self.try_boolinvers(op, top):
return True
oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL
if oldopnum != -1:
- top = ResOperation(oldopnum, [arg1, arg0], -1)
+ top = ResOperation(oldopnum, [arg1, arg0])
oldop = self.get_pure_result(top)
if oldop is not None:
self.optimizer.make_equal_to(op, oldop)
@@ -72,7 +72,7 @@
return False
oldopnum = opclasses[op.boolreflex].boolinverse
if oldopnum != -1:
- top = ResOperation(oldopnum, [arg1, arg0], -1)
+ top = ResOperation(oldopnum, [arg1, arg0])
if self.try_boolinvers(op, top):
return True
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2540,9 +2540,7 @@
i = len(self.history._cache)
op1 = self.history.record(rop.SAVE_EXC_CLASS, [], exc_class)
op2 = self.history.record(rop.SAVE_EXCEPTION, [], exception)
- assert op1 is self.history._cache[i]
- assert op2 is self.history._cache[i + 1]
- self.history._cache = [op1, op2] + self.history._cache[:i]
+ self.history._cache = self.history._cache[i:] +
self.history._cache[:i]
self.history.record(rop.RESTORE_EXCEPTION, [op1, op2], None)
self.history.set_inputargs(inputargs)
if exception_obj:
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
@@ -81,12 +81,10 @@
return False
-def ResOperation(opnum, args, position=-1, descr=None):
+def ResOperation(opnum, args, descr=None):
cls = opclasses[opnum]
op = cls()
op.initarglist(args)
- assert isinstance(position, int)
- op.position = position
if descr is not None:
assert isinstance(op, ResOpWithDescr)
if opnum == rop.FINISH:
@@ -331,7 +329,7 @@
descr = self.getdescr()
if descr is DONT_CHANGE:
descr = None
- newop = ResOperation(opnum, args, -1, descr)
+ newop = ResOperation(opnum, args, descr)
if self.type != 'v':
newop.copy_value_from(self)
return newop
diff --git a/rpython/jit/metainterp/test/test_opencoder.py
b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -1,6 +1,6 @@
from rpython.jit.metainterp.opencoder import Trace, untag, TAGINT, TAGBOX
-from rpython.jit.metainterp.resoperation import rop, InputArgInt
+from rpython.jit.metainterp.resoperation import rop, InputArgInt, AbstractResOp
from rpython.jit.metainterp.history import ConstInt
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
from rpython.jit.metainterp import resume
@@ -16,6 +16,13 @@
class metainterp_sd(object):
pass
+class FakeOp(AbstractResOp):
+ def __init__(self, pos):
+ self.pos = pos
+
+ def get_position(self):
+ return self.pos
+
class FakeFrame(object):
parent_snapshot = None
@@ -53,7 +60,7 @@
def test_simple_iterator(self):
i0, i1 = InputArgInt(), InputArgInt()
t = Trace([i0, i1])
- add = t.record_op(rop.INT_ADD, [i0, i1])
+ add = FakeOp(t.record_op(rop.INT_ADD, [i0, i1]))
t.record_op(rop.INT_ADD, [add, ConstInt(1)])
(i0, i1), l, _ = self.unpack(t)
assert len(l) == 2
@@ -67,7 +74,7 @@
def test_rd_snapshot(self):
i0, i1 = InputArgInt(), InputArgInt()
t = Trace([i0, i1])
- add = t.record_op(rop.INT_ADD, [i0, i1])
+ add = FakeOp(t.record_op(rop.INT_ADD, [i0, i1]))
t.record_op(rop.GUARD_FALSE, [add])
# now we write rd_snapshot and friends
frame0 = FakeFrame(1, JitCode(2), [i0, i1])
@@ -126,12 +133,12 @@
inputargs, ops = lst
t = Trace(inputargs)
for op in ops:
- newop = t.record_op(op.getopnum(), op.getarglist())
+ newop = FakeOp(t.record_op(op.getopnum(), op.getarglist()))
newop.orig_op = op
if newop.is_guard():
resume.capture_resumedata(op.framestack,
None, [], t)
- op.position = newop.position
+ op.position = newop.get_position()
inpargs, l, iter = self.unpack(t)
loop1 = TreeLoop("loop1")
loop1.inputargs = inputargs
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit