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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to