Author: fijal
Branch: jit-leaner-frontend
Changeset: r81613:a59079c649da
Date: 2016-01-08 09:51 +0200
http://bitbucket.org/pypy/pypy/changeset/a59079c649da/
Log: a bit of random progress
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
@@ -5,7 +5,7 @@
ResOperation, oparity, opname, rop
from rpython.rlib.rarithmetic import intmask
-TAGINT, TAGCONST, TAGBOX = range(3)
+TAGINT, TAGCONST, TAGBOX, TAGOUTPUT = range(4)
TAGMASK = 0x3
TAGSHIFT = 2
MAXINT = 65536
@@ -38,10 +38,11 @@
return RecordedOp(pos, opnum, args)
class RecordedOp(AbstractValue):
- def __init__(self, pos, opnum, args):
+ def __init__(self, pos, opnum, args, descr=None):
self.opnum = opnum
self.args = args
self._pos = pos
+ self.descr = descr
def get_tag(self):
return tag(TAGBOX, self._pos)
@@ -49,6 +50,9 @@
def getarglist(self):
return self.args
+ def getdescr(self):
+ return self.descr
+
def numargs(self):
return len(self.args)
@@ -69,7 +73,6 @@
class Trace(object):
- # XXX eventually merge with history.TreeLoop, maybe
def __init__(self, inputargs):
self._ops = [0] * (2 * len(inputargs)) # place for forwarding inputargs
# plus infos
@@ -92,6 +95,19 @@
self._count += 1
return pos
+ def _record_raw(self, opnum, tagged_args, tagged_descr=-1):
+ operations = self._ops
+ pos = len(operations)
+ operations.append(opnum)
+ operations.append(self._count) # here we keep the index into infos
+ if oparity[opnum] == -1:
+ operations.append(len(tagged_args))
+ operations.extend(tagged_args)
+ if tagged_descr != -1:
+ operations.append(tagged_descr)
+ self._count += 1
+ return pos
+
def record_forwarding(self, op, newtag):
index = op._pos
self._ops[index] = -newtag - 1
@@ -101,8 +117,11 @@
pos = self._record_op(opnum, argboxes, descr)
return ResOperation(opnum, argboxes, pos, descr)
- def record_op_tag(self, opnum, argboxes, descr=None):
- return tag(TAGBOX, self._record_op(opnum, argboxes, descr))
+ def record_op_tag(self, opnum, tagged_args, descr=None):
+ return tag(TAGBOX, self._record_raw(opnum, tagged_args, descr))
+
+ def record_op_output_tag(self, opnum, tagged_args, descr=None):
+ return tag(TAGOUTPUT, self._record_raw(opnum, tagged_args, descr))
def get_info(self, infos, pos):
index = self._ops[pos + 1]
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
@@ -356,6 +356,7 @@
tagged = -opnum - 1
def force_box(self, op, optforce=None):
+ # XXX
return op
op = self.get_box_replacement(op)
if optforce is None:
@@ -416,11 +417,16 @@
else:
op.set_forwarded(newop)
- def replace_op_with(self, op, newopnum, args=None, descr=None):
+ def replace_op_with(self, op, newopnum, args=None, descr=None,
output=False):
# recorded_op -> tagged
- newtag = self.trace.record_op_tag(newopnum, args, descr)
+ if not output:
+ newtag = self.trace.record_op_tag(newopnum, args, descr)
+ else:
+ newtag = self.output.record_op_output_tag(newopnum, args, descr)
self.trace.record_forwarding(op, newtag)
+ # XXX info forwarding
return newtag
+
newop = op.copy_and_change(newopnum, args, descr)
if newop.type != 'v':
op = self.get_box_replacement(op)
@@ -529,7 +535,7 @@
def propagate_all_forward(self, trace, call_pure_results=None,
rename_inputargs=True, flush=True):
- #self.output = opencoder.Trace() # <- XXXX
+ self.output = opencoder.Trace([]) # <- XXXX, put inputargs
self.infos = [None] * trace._count
self.trace = trace
#if rename_inputargs:
@@ -577,14 +583,14 @@
def emit_operation(self, op):
if rop.returns_bool_result(op.opnum):
self.getintbound(op).make_bool()
- self._emit_operation(op)
- op = self.get_box_replacement(op)
- if op.type == 'i':
- opinfo = op.get_forwarded()
- if opinfo is not None:
- assert isinstance(opinfo, IntBound)
- if opinfo.is_constant():
- op.set_forwarded(ConstInt(opinfo.getint()))
+ tagged_op = self._emit_operation(op)
+ # XXX what is this about? looks pretty optional
+ #if op.type == 'i':
+ # opinfo = op.get_forwarded()
+ # if opinfo is not None:
+ # assert isinstance(opinfo, IntBound)
+ # if opinfo.is_constant():
+ # op.set_forwarded(ConstInt(opinfo.getint()))
@specialize.argtype(0)
def _emit_operation(self, op):
@@ -594,13 +600,15 @@
if self.is_constant(tagged):
return # can happen e.g. if we postpone the operation that becomes
# constant
- xxxx
- op = self.replace_op_with(op, op.getopnum())
- for i in range(op.numargs()):
- arg = self.force_box(op.getarg(i))
- op.setarg(i, arg)
+ arglist = op.getarglist()
+ for i in range(len(arglist)):
+ arglist[i] = self.force_box(arglist[i])
+ opnum = op.opnum
+ tagged_op = self.replace_op_with(op, opnum, arglist, op.getdescr(),
+ output=True)
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS)
- if op.is_guard():
+ if rop.is_guard(opnum):
+ xxx
assert isinstance(op, GuardResOp)
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS)
pendingfields = self.pendingfields
@@ -611,15 +619,16 @@
return
else:
op = self.emit_guard_operation(op, pendingfields)
- elif op.can_raise():
+ elif rop.can_raise(opnum):
self.exception_might_have_happened = True
- if ((op.has_no_side_effect() or op.is_guard() or op.is_jit_debug() or
- op.is_ovf()) and not self.is_call_pure_pure_canraise(op)):
- pass
- else:
- self._last_guard_op = None
+ #if ((op.has_no_side_effect() or op.is_guard() or op.is_jit_debug() or
+ # op.is_ovf()) and not self.is_call_pure_pure_canraise(op)):
+ # pass
+ #else:
+ # self._last_guard_op = None
self._really_emitted_operation = op
- self._newoperations.append(op)
+ #self._newoperations.append(op)
+ return tagged_op
def emit_guard_operation(self, op, pendingfields):
guard_op = self.replace_op_with(op, op.getopnum())
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
@@ -361,9 +361,6 @@
# XXX kill all those in favor of ophelpers
- def is_guard(self):
- return rop._GUARD_FIRST <= self.getopnum() <= rop._GUARD_LAST
-
def is_foldable_guard(self):
return rop._GUARD_FOLDABLE_FIRST <= self.getopnum() <=
rop._GUARD_FOLDABLE_LAST
@@ -384,9 +381,6 @@
def has_no_side_effect(self):
return rop._NOSIDEEFFECT_FIRST <= self.getopnum() <=
rop._NOSIDEEFFECT_LAST
- def can_raise(self):
- return rop._CANRAISE_FIRST <= self.getopnum() <= rop._CANRAISE_LAST
-
def is_malloc(self):
# a slightly different meaning from can_malloc
return rop._MALLOC_FIRST <= self.getopnum() <= rop._MALLOC_LAST
@@ -1311,8 +1305,9 @@
return rop.CALL_F
return rop.CALL_N
- def is_guard(self):
- return rop._GUARD_FIRST <= self.getopnum() <= rop._GUARD_LAST
+ @staticmethod
+ def is_guard(opnum):
+ return rop._GUARD_FIRST <= opnum <= rop._GUARD_LAST
@staticmethod
def is_comparison(opnum):
@@ -1340,8 +1335,9 @@
def has_no_side_effect(opnum):
return rop._NOSIDEEFFECT_FIRST <= opnum <= rop._NOSIDEEFFECT_LAST
- def can_raise(self):
- return rop._CANRAISE_FIRST <= self.getopnum() <= rop._CANRAISE_LAST
+ @staticmethod
+ def can_raise(opnum):
+ return rop._CANRAISE_FIRST <= opnum <= rop._CANRAISE_LAST
def is_malloc(self):
# a slightly different meaning from can_malloc
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
@@ -5,9 +5,17 @@
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
class SimpleOptimizer(Optimizer):
+ class metainterp_sd:
+ class profiler:
+ @staticmethod
+ def count(*args):
+ pass
+
def __init__(self, trace):
self.trace = trace
+ self.optimizer = self # uh?
self.infos = [None] * trace._count
+ self.output = Trace([])
class TestOpencoder(object):
def unpack(self, t):
@@ -26,10 +34,10 @@
assert len(l) == 2
assert l[0].opnum == rop.INT_ADD
assert l[1].opnum == rop.INT_ADD
- assert (untag(l[1].args[1]) == TAGINT, 1)
- assert (untag(l[1].args[0]) == TAGBOX, l[0]._pos)
- assert (untag(l[0].args[0]) == TAGBOX, 0)
- assert (untag(l[0].args[1]) == TAGBOX, 1)
+ assert untag(l[1].args[1]) == (TAGINT, 1)
+ assert untag(l[1].args[0]) == (TAGBOX, l[0]._pos)
+ assert untag(l[0].args[0]) == (TAGBOX, 0)
+ assert untag(l[0].args[1]) == (TAGBOX, 1)
def test_forwarding(self):
i0, i1 = InputArgInt(), InputArgInt()
@@ -51,4 +59,10 @@
assert opt.getintbound(add.get_tag())
def test_output(self):
- pass
\ No newline at end of file
+ i0 = InputArgInt()
+ t = Trace([i0])
+ t.record_op(rop.INT_ADD, [i0, ConstInt(1)])
+ opt = SimpleOptimizer(t)
+ add, = self.unpack(t)
+ opt.emit_operation(add)
+# xxx
\ No newline at end of file
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit