Author: fijal
Branch: jit-leaner-frontend
Changeset: r82852:2c79e6dbfade
Date: 2016-03-07 18:28 +0200
http://bitbucket.org/pypy/pypy/changeset/2c79e6dbfade/

Log:    in-progress

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
@@ -82,10 +82,10 @@
     """ This represents ops() with a jump at the end that goes to some
     loop, we need to deal with virtual state and inlining of short preamble
     """
-    def __init__(self, start_label, operations, call_pure_results=None,
+    def __init__(self, trace, runtime_boxes, call_pure_results=None,
                  enable_opts=None, inline_short_preamble=False):
-        self.start_label = start_label
-        self.operations = operations
+        self.trace = trace
+        self.runtime_boxes = runtime_boxes
         self.call_pure_results = call_pure_results
         self.enable_opts = enable_opts
         self.inline_short_preamble = inline_short_preamble
@@ -94,7 +94,7 @@
         from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer
 
         opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
-        return opt.optimize_bridge(self.start_label, self.operations,
+        return opt.optimize_bridge(self.trace, self.runtime_boxes,
                                    self.call_pure_results,
                                    self.inline_short_preamble,
                                    self.box_names_memo)
@@ -200,8 +200,9 @@
 # ____________________________________________________________
 
 
-def compile_simple_loop(metainterp, greenkey, start, inputargs, ops, jumpargs,
+def compile_simple_loop(metainterp, greenkey, start, trace, jumpargs,
                         enable_opts):
+    xxxx
     from rpython.jit.metainterp.optimizeopt import optimize_trace
 
     jitdriver_sd = metainterp.jitdriver_sd
@@ -261,8 +262,8 @@
     jitcell_token = make_jitcell_token(jitdriver_sd)
     history.record(rop.JUMP, jumpargs, None, descr=jitcell_token)
     if 'unroll' not in enable_opts or not 
metainterp.cpu.supports_guard_gc_type:
-        xxx
-        return compile_simple_loop(metainterp, greenkey, start, inputargs, ops,
+        return compile_simple_loop(metainterp, greenkey, start, inputargs,
+                                   history.trace,
                                    jumpargs, enable_opts)
     call_pure_results = metainterp.call_pure_results
     preamble_data = LoopCompileData(history.trace, inputargs,
@@ -1033,8 +1034,7 @@
     call_pure_results = metainterp.call_pure_results
 
     if metainterp.history.ends_with_jump:
-        xxx
-        data = BridgeCompileData(label, operations[:],
+        data = BridgeCompileData(trace, inputargs,
                                  call_pure_results=call_pure_results,
                                  enable_opts=enable_opts,
                                  inline_short_preamble=inline_short_preamble)
diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py
--- a/rpython/jit/metainterp/logger.py
+++ b/rpython/jit/metainterp/logger.py
@@ -12,6 +12,15 @@
         self.metainterp_sd = metainterp_sd
         self.guard_number = guard_number
 
+    def log_loop_from_trace(self, trace, memo):
+        if not have_debug_prints():
+            return
+        ops = []
+        i = trace.get_iter()
+        while not i.done():
+            ops.append(i.next())
+        self.log_loop(i.inputargs, ops, memo=memo)
+
     def log_loop(self, inputargs, operations, number=0, type=None,
                  ops_offset=None, name='', memo=None):
         if type is None:
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
@@ -53,7 +53,7 @@
     """
     debug_start("jit-optimize")
     try:
-        #metainterp_sd.logger_noopt.log_loop(compile_data.trace, memo=memo)
+        metainterp_sd.logger_noopt.log_loop_from_trace(compile_data.trace, 
memo=memo)
         if memo is None:
             memo = {}
         compile_data.box_names_memo = memo
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
@@ -224,13 +224,12 @@
                 return token.virtual_state
         return label_vs
 
-    def optimize_bridge(self, start_label, operations, call_pure_results,
+    def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
                         inline_short_preamble, box_names_memo):
-        self._check_no_forwarding([start_label.getarglist()])
-        info, ops = self.optimizer.propagate_all_forward(
-            start_label.getarglist()[:], operations[:-1],
+        self._check_no_forwarding([trace.inputargs])
+        info, ops = self.optimizer.propagate_all_forward(trace.get_iter(),
             call_pure_results)
-        jump_op = operations[-1]
+        jump_op = info.jump_op
         cell_token = jump_op.getdescr()
         assert isinstance(cell_token, JitCellToken)
         if not inline_short_preamble or len(cell_token.target_tokens) == 1:
@@ -241,9 +240,9 @@
         for a in jump_op.getarglist():
             self.optimizer.force_box_for_end_of_preamble(a)
         try:
-            vs = self.jump_to_existing_trace(jump_op, None)
+            vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes)
         except InvalidLoop:
-            return self.jump_to_preamble(cell_token, jump_op, info)            
+            return self.jump_to_preamble(cell_token, jump_op, info)
         if vs is None:
             return info, self.optimizer._newoperations[:]
         warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
@@ -254,6 +253,7 @@
         else:
             debug_print("Retrace count reached, jumping to preamble")
             return self.jump_to_preamble(cell_token, jump_op, info)
+        xxx
         exported_state = self.export_state(start_label,
                                            operations[-1].getarglist(),
                                            info.inputargs, box_names_memo)
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
@@ -2609,14 +2609,12 @@
         self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None,
                             descr=target_jitcell_token)
         self.history.ends_with_jump = True
-        try:
-            target_token = compile.compile_trace(self, self.resumekey)
-        finally:
-            self.history.operations.pop()     # remove the JUMP
+        target_token = compile.compile_trace(self, self.resumekey)
         if target_token is not None: # raise if it *worked* correctly
             assert isinstance(target_token, TargetToken)
             jitcell_token = target_token.targeting_jitcell_token
             self.raise_continue_running_normally(live_arg_boxes, jitcell_token)
+        xxxx # remove the jump op and continue tracing
 
     def compile_done_with_this_frame(self, exitbox):
         # temporarily put a JUMP to a pseudo-loop
@@ -2709,7 +2707,7 @@
             self.history = history.History()
             inputargs_and_holes = self.rebuild_state_after_failure(resumedescr,
                                                                    deadframe)
-            self.history.inputargs = [box for box in inputargs_and_holes if 
box]
+            self.history.set_inputargs([box for box in inputargs_and_holes if 
box])
         finally:
             rstack._stack_criticalcode_stop()
 
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
@@ -1436,7 +1436,16 @@
     def is_pure_with_descr(opnum, descr):
         if rop.is_always_pure(opnum):
             return True
-        xxxx
+        if (opnum == rop.GETFIELD_RAW_I or
+            opnum == rop.GETFIELD_RAW_R or
+            opnum == rop.GETFIELD_RAW_F or
+            opnum == rop.GETFIELD_GC_I or
+            opnum == rop.GETFIELD_GC_R or
+            opnum == rop.GETFIELD_GC_F or
+            opnum == rop.GETARRAYITEM_RAW_I or
+            opnum == rop.GETARRAYITEM_RAW_F):
+            return descr.is_always_pure()
+        return False
 
     @staticmethod
     def is_pure_getfield(opnum, descr):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to