[pypy-commit] pypy resume-refactor: finish plumbing until we pass a few more tests

fijal noreply at buildbot.pypy.org
Wed Jan 29 16:14:00 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68994:4726582b17ae
Date: 2014-01-29 16:06 +0100
http://bitbucket.org/pypy/pypy/changeset/4726582b17ae/

Log:	finish plumbing until we pass a few more tests

diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -5,5 +5,6 @@
 
 * compress the resumedata in the backend
 
-* do escape analysis in the resumeopt.py
+* do escape analysis in the resume/optimizer.py
 
+* make_a_counter_per_value got screwed, but a bit no clue what it does
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -499,24 +499,23 @@
 
     def make_a_counter_per_value(self, guard_value_op):
         assert guard_value_op.getopnum() == rop.GUARD_VALUE
+        # XXX I have no clue what exactly it does, but we killed failargs
+        #     so i is always 0 now
         box = guard_value_op.getarg(0)
-        try:
-            i = guard_value_op.getfailargs().index(box)
-        except ValueError:
-            return     # xxx probably very rare
+        i = 0
+        # used to be i = guard_value_op.getfailargs().index(box)
+        if i > self.CNT_BASE_MASK:
+            return    # probably never, but better safe than sorry
+        if box.type == history.INT:
+            cnt = self.CNT_INT
+        elif box.type == history.REF:
+            cnt = self.CNT_REF
+        elif box.type == history.FLOAT:
+            cnt = self.CNT_FLOAT
         else:
-            if i > self.CNT_BASE_MASK:
-                return    # probably never, but better safe than sorry
-            if box.type == history.INT:
-                cnt = self.CNT_INT
-            elif box.type == history.REF:
-                cnt = self.CNT_REF
-            elif box.type == history.FLOAT:
-                cnt = self.CNT_FLOAT
-            else:
-                assert 0, box.type
-            assert cnt > self.CNT_BASE_MASK
-            self._counter = cnt | i
+            assert 0, box.type
+        assert cnt > self.CNT_BASE_MASK
+        self._counter = cnt | i
 
     def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd):
         if self.must_compile(deadframe, metainterp_sd, jitdriver_sd):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -415,7 +415,6 @@
             op = short[i]
             if op.is_guard():
                 op = op.clone()
-                op.setfailargs(None)
                 descr = target_token.resume_at_jump_descr.clone_if_mutable()
                 op.setdescr(descr)
                 short[i] = op
@@ -583,7 +582,6 @@
                 for guard in extra_guards:
                     if guard.is_guard():
                         descr = target.resume_at_jump_descr.clone_if_mutable()
-                        inliner.inline_descr_inplace(descr)
                         guard.setdescr(descr)
                     self.optimizer.send_extra_operation(guard)
 
diff --git a/rpython/jit/metainterp/test/test_loop_unroll.py b/rpython/jit/metainterp/test/test_loop_unroll.py
--- a/rpython/jit/metainterp/test/test_loop_unroll.py
+++ b/rpython/jit/metainterp/test/test_loop_unroll.py
@@ -8,7 +8,7 @@
     enable_opts = ALL_OPTS_NAMES
 
     automatic_promotion_result = {
-        'int_gt': 1, 'guard_false': 1, 'jump': 1, 'int_add': 3,
+        'int_gt': 2, 'guard_false': 2, 'jump': 1, 'int_add': 6,
         'guard_value': 1
     }
 
diff --git a/rpython/jit/resume/backend.py b/rpython/jit/resume/backend.py
--- a/rpython/jit/resume/backend.py
+++ b/rpython/jit/resume/backend.py
@@ -62,10 +62,10 @@
     def resume_new(self, result, descr):
         self.deps[result] = DepsFields()
 
-    def resume_newunicode(self, result, length):
+    def resume_newstr(self, result, length):
         self.deps[result] = DepsArray(length)
 
-    def resume_concatunicode(self, result, left, right):
+    def resume_concatstr(self, result, left, right):
         self.deps[result] = DepsConcat(left, right)
 
     def resume_new_with_vtable(self, result, klass):
@@ -108,13 +108,13 @@
                 self.resume_clear(op.getarg(0).getint(),
                                   op.getarg(1).getint())
             elif op.getopnum() == rop.RESUME_NEWSTR:
-                xxx
+                self.resume_newstr(op.result, op.getarg(0).getint())
             elif op.getopnum() == rop.RESUME_NEWUNICODE:
-                self.resume_newunicode(op.result, op.getarg(0).getint())
+                self.resume_newstr(op.result, op.getarg(0).getint())
             elif op.getopnum() == rop.RESUME_CONCATSTR:
-                xxx
+                self.resume_concatstr(op.result, op.getarg(0), op.getarg(1))
             elif op.getopnum() == rop.RESUME_CONCATUNICODE:
-                self.resume_concatunicode(op.result, op.getarg(0), op.getarg(1))
+                self.resume_concatstr(op.result, op.getarg(0), op.getarg(1))
             elif op.getopnum() == rop.RESUME_STRSETITEM:
                 self.resume_strsetitem(op.getarg(0), op.getarg(1).getint(),
                                        op.getarg(2))
@@ -204,13 +204,19 @@
             self.builder.resume_clear(op.getarg(0).getint(),
                                       op.getarg(1).getint())
         elif op.getopnum() == rop.RESUME_NEWSTR:
-            xxx
+            v_pos = len(self.virtuals)
+            self.virtuals[op.result] = v_pos
+            self.builder.resume_newstr(v_pos, op.getarg(0).getint())
         elif op.getopnum() == rop.RESUME_NEWUNICODE:
             v_pos = len(self.virtuals)
             self.virtuals[op.result] = v_pos
             self.builder.resume_newunicode(v_pos, op.getarg(0).getint())
         elif op.getopnum() == rop.RESUME_CONCATSTR:
-            xxx
+            v_pos = len(self.virtuals)
+            self.virtuals[op.result] = v_pos
+            leftpos = self.get_box_pos(op.getarg(0))
+            rightpos = self.get_box_pos(op.getarg(1))
+            self.builder.resume_concatstr(v_pos, leftpos, rightpos)
         elif op.getopnum() == rop.RESUME_CONCATUNICODE:
             v_pos = len(self.virtuals)
             self.virtuals[op.result] = v_pos
diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py
--- a/rpython/jit/resume/frontend.py
+++ b/rpython/jit/resume/frontend.py
@@ -22,6 +22,7 @@
 
     def finish(self):
         nextbh = None
+        curbh = None
         for frame in self.framestack:
             curbh = self.bhinterpbuilder.acquire_interp()
             curbh.nextblackholeinterp = nextbh
diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py
--- a/rpython/jit/resume/reader.py
+++ b/rpython/jit/resume/reader.py
@@ -109,8 +109,11 @@
             str2 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), rightval)
             result = funcptr(str1, str2)
             return lltype.cast_opaque_ptr(llmemory.GCREF, result)
-        else:
-            xxx
+        funcptr = cic.funcptr_for_oopspec(EffectInfo.OS_STR_CONCAT)
+        str1 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), leftval)
+        str2 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), rightval)
+        result = funcptr(str1, str2)
+        return lltype.cast_opaque_ptr(llmemory.GCREF, result)
 
 class AbstractResumeReader(object):
     """ A resume reader that can follow resume until given point. Consult
@@ -258,7 +261,11 @@
                 self.resume_newunicode(v_pos, lgt)
                 pos += 4
             elif op == rescode.RESUME_CONCATSTR:
-                xxx
+                v_pos = self.read_short(pos + 1)
+                left = self.read_short(pos + 3)
+                right = self.read_short(pos + 5)
+                self.resume_concatstr(v_pos, left, right)
+                pos += 7
             elif op == rescode.RESUME_CONCATUNICODE:
                 v_pos = self.read_short(pos + 1)
                 left = self.read_short(pos + 3)
diff --git a/rpython/jit/resume/rescode.py b/rpython/jit/resume/rescode.py
--- a/rpython/jit/resume/rescode.py
+++ b/rpython/jit/resume/rescode.py
@@ -100,6 +100,12 @@
         self.write(index)
         self.write_short(encoded_source)
 
+    def resume_concatstr(self, v_pos, leftpos, rightpos):
+        self.write(RESUME_CONCATSTR)
+        self.write_short(v_pos)
+        self.write_short(leftpos)
+        self.write_short(rightpos)
+
     def resume_newunicode(self, v_pos, lgt):
         self.write(RESUME_NEWUNICODE)
         self.write_short(v_pos) # XXX byte virtuals?


More information about the pypy-commit mailing list