Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68854:2b6d417a7f05
Date: 2014-01-18 15:00 +0100
http://bitbucket.org/pypy/pypy/changeset/2b6d417a7f05/

Log:    Finish few bits and bobs to pass test_loop again

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
@@ -817,7 +817,7 @@
     else:
         inline_short_preamble = True
     try:
-        optimize_trace(metainterp_sd, new_trace, state.enable_opts, 
inline_short_preamble)
+        optimize_trace(metainterp_sd, new_trace, state.enable_opts, 
inline_short_preamble, inpframes=new_trace.inputframes)
     except InvalidLoop:
         debug_print("compile_new_bridge: got an InvalidLoop")
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py 
b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -47,7 +47,8 @@
 
     return optimizations, unroll
 
-def optimize_trace(metainterp_sd, loop, enable_opts, 
inline_short_preamble=True):
+def optimize_trace(metainterp_sd, loop, enable_opts, 
inline_short_preamble=True,
+                   inpframes=None):
     """Optimize loop.operations to remove internal overheadish operations.
     """
     from rpython.jit.resume.backend import flatten
@@ -60,7 +61,8 @@
         if unroll:
             optimize_unroll(metainterp_sd, loop, optimizations, 
inline_short_preamble)
         else:
-            optimizer = Optimizer(metainterp_sd, loop, optimizations)
+            optimizer = Optimizer(metainterp_sd, loop, optimizations,
+                                  inpframes=inpframes)
             optimizer.propagate_all_forward()
     finally:
         debug_stop("jit-optimize")
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
@@ -344,7 +344,8 @@
 
 class Optimizer(Optimization):
 
-    def __init__(self, metainterp_sd, loop, optimizations=None):
+    def __init__(self, metainterp_sd, loop, optimizations=None,
+                 inpframes=None):
         self.metainterp_sd = metainterp_sd
         self.cpu = metainterp_sd.cpu
         self.loop = loop
@@ -367,7 +368,7 @@
             self.call_pure_results = loop.call_pure_results
 
         self.set_optimizations(optimizations)
-        self.resumebuilder = OptResumeBuilder(self)
+        self.resumebuilder = OptResumeBuilder(self, inpframes)
         self.setup()
 
     def set_optimizations(self, optimizations):
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
@@ -155,9 +155,13 @@
         if encoded_pos == CLEAR_POSITION:
             return
         tag, index = self.decode(encoded_pos)
-        if tag & TAGBOX:
+        if tag == TAGBOX:
             curbh.registers_i[i] = self.cpu.get_int_value(self.deadframe, 
index)
-            return
+        elif tag == TAGSMALLINT:
+            curbh.registers_i[i] = index
+        else:
+            xxx
+        return
         xxx
         if jitframe_pos >= 0:
             curbh.registers_i[i] = self.cpu.get_int_value(
@@ -169,9 +173,13 @@
         if encoded_pos == CLEAR_POSITION:
             return
         tag, index = self.decode(encoded_pos)
-        if tag & TAGBOX:
+        if tag == TAGBOX:
             curbh.registers_r[i] = self.cpu.get_ref_value(self.deadframe, 
index)
-            return
+        elif tag == TAGCONST:
+            curbh.registers_r[i] = self.consts[index].getref_base()
+        else:
+            xxx
+        return
         xxxx
         if jitframe_pos >= 0:
             curbh.registers_r[i] = self.cpu.get_ref_value(
@@ -207,6 +215,9 @@
             if TP == INT:
                 val = self.metainterp.cpu.get_int_value(self.deadframe, pos)
                 res = BoxInt(val)
+            elif TP == REF:
+                val = self.metainterp.cpu.get_ref_value(self.deadframe, pos)
+                res = BoxPtr(val)
             else:
                 xxx
             self.cache[encoded_pos] = res
diff --git a/rpython/jit/resume/optimizer.py b/rpython/jit/resume/optimizer.py
--- a/rpython/jit/resume/optimizer.py
+++ b/rpython/jit/resume/optimizer.py
@@ -4,18 +4,25 @@
 from rpython.jit.codewriter.jitcode import JitCode
 
 class ResumeFrame(object):
-    def __init__(self, pc, jitcode):
+    def __init__(self, pc, jitcode, no=-1):
         self.pc = pc
-        assert isinstance(jitcode, JitCode)
-        self.jitcode = jitcode
-        self.values = [None] * jitcode.num_regs()
+        if jitcode is None:
+            assert no >= 0
+            self.values = [None] * no
+        else:
+            assert isinstance(jitcode, JitCode)
+            self.jitcode = jitcode
+            self.values = [None] * jitcode.num_regs()
 
 class OptResumeBuilder(object):
-    def __init__(self, opt):
+    def __init__(self, opt, inpframes=None):
         self.framestack = []
         self.last_flushed_pos = 0
         self.opt = opt
         self.virtuals = {}
+        if inpframes is not None:
+            for frame in inpframes:
+                self.framestack.append(ResumeFrame(0, None, len(frame)))
 
     def enter_frame(self, pc, jitcode):
         self.framestack.append(ResumeFrame(pc, jitcode))
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
@@ -58,8 +58,7 @@
         self.virtuals[index].fields[descr] = fieldpos
 
     def resume_clear(self, frame_no, frontend_position):
-        xxx
-        self.framestack[frame_no].registers[frontend_position] = -1
+        self.framestack[frame_no].registers[frontend_position] = 
rescode.CLEAR_POSITION
 
     def resume_set_pc(self, pc):
         self.framestack[-1].pc = pc
@@ -112,7 +111,10 @@
                 self.resume_setfield_gc(structpos, fieldpos, descr)
                 pos += 7
             elif op == rescode.RESUME_CLEAR:
-                xxx
+                frame_pos = self.read(pos + 1)
+                pos_in_frame = self.read(pos + 2)
+                self.resume_clear(frame_pos, pos_in_frame)
+                pos += 3
             elif op == rescode.RESUME_SET_PC:
                 pc = self.read_short(pos + 1)
                 self.resume_set_pc(pc)
@@ -140,11 +142,17 @@
     def resume_new(self, v_pos, descr):
         self.l.append("%d = resume_new %d" % (v_pos, descr.global_descr_index))
 
+    def leave_frame(self):
+        self.l.append("leave_frame")
+
     def resume_setfield_gc(self, structpos, fieldpos, descr):
         stag, sindex = self.decode(structpos)
         ftag, findex = self.decode(fieldpos)
         self.l.append("resume_setfield_gc (%d, %d) (%d, %d) %d" % (
             stag, sindex, ftag, findex, descr.global_descr_index))
 
+    def resume_set_pc(self, pc):
+        self.l.append("set_resume_pc %d" % pc)
+
     def finish(self):
         return "\n".join(self.l)
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
@@ -63,7 +63,8 @@
     def encode_const(self, const):
         if isinstance(const, ConstInt) and 0 <= const.getint() < 0x4000:
             return TAGSMALLINT | (const.getint() << 2)
-        xxx
+        self.consts.append(const)
+        return TAGCONST | ((len(self.consts) - 1) << 2)
 
     def resume_set_pc(self, pc):
         self.write(RESUME_SET_PC)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to