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

Reply via email to