Author: fijal
Branch: jit-leaner-frontend
Changeset: r83332:e625c46190c9
Date: 2016-03-25 11:23 +0200
http://bitbucket.org/pypy/pypy/changeset/e625c46190c9/

Log:    try to shorten the ranges and numbers

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
@@ -76,7 +76,7 @@
                  metainterp_sd=None):
         self.trace = trace
         self.metainterp_sd = metainterp_sd
-        self._cache = [None] * trace._count
+        self._cache = [None] * trace._index
         if force_inputargs is not None:
             # the trace here is cut and we're working from
             # inputargs that are in the middle, shuffle stuff around a bit
@@ -92,6 +92,7 @@
         self.start = start
         self.pos = start
         self._count = start
+        self._index = start
         self.start_index = start
         self.end = end
 
@@ -152,7 +153,9 @@
             if rop.is_guard(opnum):
                 self.get_snapshot_iter(descr_index).update_liveranges(
                     index, liveranges)
-        return index + 1
+        if opclasses[opnum].type != 'v':
+            return index + 1
+        return index
 
     def next(self):
         opnum = self._next()
@@ -180,16 +183,18 @@
             assert isinstance(res, GuardResOp)
             res.rd_resume_position = descr_index
         if res.type != 'v':
-            self._cache[self._count] = res
+            self._cache[self._index] = res
+            self._index += 1
         self._count += 1
         return res
 
 class CutTrace(BaseTrace):
-    def __init__(self, trace, start, count, inputargs):
+    def __init__(self, trace, start, count, index, inputargs):
         self.trace = trace
         self.start = start
         self.inputargs = inputargs
         self.count = count
+        self.index = index
 
     def cut_at(self, cut):
         assert cut[1] > self.count
@@ -199,7 +204,8 @@
         iter = TraceIterator(self.trace, self.start, self.trace._pos,
                              self.inputargs, metainterp_sd=metainterp_sd)
         iter._count = self.count
-        iter.start_index = self.count
+        iter.start_index = self.index
+        iter._index = self.index
         return iter
 
 def combine_uint(index1, index2):
@@ -246,7 +252,8 @@
         self._snapshots = []
         for i, inparg in enumerate(inputargs):
             inparg.set_position(i)
-        self._count = len(inputargs)
+        self._count = len(inputargs) # total count
+        self._index = len(inputargs) # "position" of resulting resops
         self._start = len(inputargs)
         self._pos = self._start
         self.inputargs = inputargs
@@ -281,14 +288,15 @@
         return self._pos
 
     def cut_point(self):
-        return self._pos, self._count
+        return self._pos, self._count, self._index
 
     def cut_at(self, end):
         self._pos = end[0]
         self._count = end[1]
+        self._index = end[2]
 
-    def cut_trace_from(self, (start, count), inputargs):
-        return CutTrace(self, start, count, inputargs)
+    def cut_trace_from(self, (start, count, index), inputargs):
+        return CutTrace(self, start, count, index, inputargs)
 
     def _encode(self, box):
         if isinstance(box, Const):
@@ -334,7 +342,7 @@
             assert False, "unreachable code"
 
     def record_op(self, opnum, argboxes, descr=None):
-        pos = self._count
+        pos = self._index
         self.append(opnum)
         expected_arity = oparity[opnum]
         if expected_arity == -1:
@@ -351,6 +359,8 @@
             else:
                 self.append(self._encode_descr(descr))
         self._count += 1
+        if opclasses[opnum].type != 'v':
+            self._index += 1
         return pos
 
     def _encode_descr(self, descr):
@@ -404,7 +414,7 @@
 
     def get_live_ranges(self, metainterp_sd):
         t = self.get_iter(metainterp_sd)
-        liveranges = [0] * self._count
+        liveranges = [0] * self._index
         index = t._count
         while not t.done():
             index = t.next_element_update_live_range(index, liveranges)
@@ -427,7 +437,8 @@
             if self._deadranges[0] == self._count:
                 return self._deadranges[1]
         liveranges = self.get_live_ranges(metainterp_sd)
-        deadranges = [0] * (self._count + 1)
+        deadranges = [0] * (self._index + 2)
+        assert len(deadranges) == len(liveranges) + 2
         for i in range(self._start, len(liveranges)):
             elem = liveranges[i]
             if elem:
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
@@ -520,7 +520,8 @@
                 break
             self.first_optimization.propagate_forward(op)
             trace.kill_cache_at(deadranges[i + trace.start_index])
-            i += 1
+            if op.type != 'v':
+                i += 1
         # accumulate counters
         if flush:
             self.flush()
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
@@ -187,7 +187,7 @@
         p0 = FakeOp(t.record_op(rop.NEW_WITH_VTABLE, [], descr=SomeDescr()))
         t.record_op(rop.GUARD_TRUE, [i0])
         resume.capture_resumedata([], [i1, i2, p0], [p0, i1], t)
-        assert t.get_live_ranges(metainterp_sd) == [4, 4, 4, 4, 0]
+        assert t.get_live_ranges(metainterp_sd) == [4, 4, 4, 4]
 
     def test_deadranges(self):
         i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0)
@@ -203,4 +203,4 @@
         t.record_op(rop.ESCAPE_N, [ConstInt(3)])
         t.record_op(rop.ESCAPE_N, [ConstInt(3)])
         t.record_op(rop.FINISH, [i4])
-        assert t.get_dead_ranges(metainterp_sd) == [0, 0, 0, 0, 0, 3, 0, 5, 0, 
0, 0, 0, 0, 6]
+        assert t.get_dead_ranges(metainterp_sd) == [0, 0, 0, 0, 0, 3, 4, 5]
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to