Author: fijal
Branch: jit-leaner-frontend
Changeset: r83026:af5c4f0c2cc9
Date: 2016-03-14 10:11 +0200
http://bitbucket.org/pypy/pypy/changeset/af5c4f0c2cc9/

Log:    maaaybe implement global numbering

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -472,6 +472,13 @@
 
     # ------------------------------------------------------------
 
+    def setup_descrs(self):
+        all_descrs = []
+        for k, v in self.descrs.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        return all_descrs
+
     def calldescrof(self, FUNC, ARGS, RESULT, effect_info):
         key = ('call', getkind(RESULT),
                tuple([getkind(A) for A in ARGS]),
diff --git a/rpython/jit/backend/llsupport/descr.py 
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -21,6 +21,30 @@
         self._cache_call = {}
         self._cache_interiorfield = {}
 
+    def setup_descrs(self):
+        all_descrs = []
+        for k, v in self._cache_size.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        for k, v in self._cache_field.iteritems():
+            for k1, v1 in v.iteritems():
+                v1.descr_index = len(all_descrs)
+                all_descrs.append(v1)
+        for k, v in self._cache_array.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        for k, v in self._cache_arraylen.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        for k, v in self._cache_call.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        for k, v in self._cache_interiorfield.iteritems():
+            v.descr_index = len(all_descrs)
+            all_descrs.append(v)
+        assert len(all_descrs) < 2**15
+        return all_descrs
+
     def init_size_descr(self, STRUCT, sizedescr):
         pass
 
diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -316,6 +316,9 @@
             return ll_frame
         return execute_token
 
+    def setup_descrs(self):
+        return self.gc_ll_descr.setup_descrs()
+
     # ------------------- helpers and descriptions --------------------
 
     @staticmethod
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
@@ -75,7 +75,7 @@
 
         #assert not unroll
         opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations)
-        return opt.propagate_all_forward(self.trace.get_iter(),
+        return opt.propagate_all_forward(self.trace.get_iter(metainterp_sd),
             self.call_pure_results)
 
 class BridgeCompileData(CompileData):
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
@@ -124,6 +124,7 @@
 class AbstractDescr(AbstractValue):
     __slots__ = ()
     llopaque = True
+    descr_index = -1
 
     def repr_of_descr(self):
         return '%r' % (self,)
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
@@ -20,7 +20,7 @@
 
     def _unpack_trace(self, trace):
         ops = []
-        i = trace.get_iter()
+        i = trace.get_iter(self.metainterp_sd)
         while not i.done():
             ops.append(i.next())
         return i.inputargs, ops
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
@@ -55,8 +55,10 @@
         return [self.get(i) for i in arr]
 
 class TraceIterator(BaseTrace):
-    def __init__(self, trace, start, end, force_inputargs=None):
+    def __init__(self, trace, start, end, force_inputargs=None,
+                 metainterp_sd=None):
         self.trace = trace
+        self.metainterp_sd = metainterp_sd
         self._cache = [None] * trace._count
         if force_inputargs is not None:
             self.inputargs = [rop.inputarg_from_tp(arg.type) for
@@ -122,10 +124,13 @@
         descr_index = -1
         if opwithdescr[opnum]:
             descr_index = self._next()
-            if descr_index == -1 or rop.is_guard(opnum):
+            if descr_index == 0 or rop.is_guard(opnum):
                 descr = None
             else:
-                descr = self.trace._descrs[descr_index]
+                if descr_index < 0:
+                    descr = self.metainterp_sd.all_descrs[-descr_index-1]
+                else:
+                    descr = self.trace._descrs[descr_index]
         else:
             descr = None
         res = ResOperation(opnum, args, -1, descr=descr)
@@ -143,9 +148,9 @@
         self.inputargs = inputargs
         self.count = count
 
-    def get_iter(self):
+    def get_iter(self, metainterp_sd=None):
         iter = TraceIterator(self.trace, self.start, self.trace._pos,
-                             self.inputargs)
+                             self.inputargs, metainterp_sd=metainterp_sd)
         iter._count = self.count
         return iter
 
@@ -295,15 +300,15 @@
             self.append(self._encode(box))
         if opwithdescr[opnum]:
             if descr is None:
-                self.append(-1)
+                self.append(0)
             else:
                 self.append(self._encode_descr(descr))
         self._count += 1
         return pos
 
     def _encode_descr(self, descr):
-        # XXX provide a global cache for prebuilt descrs so we don't
-        #     have to repeat them here        
+        if descr.descr_index != -1:
+            return -descr.descr_index-1
         self._descrs.append(descr)
         return len(self._descrs) - 1
 
@@ -324,18 +329,20 @@
         return [rffi.cast(rffi.SHORT, self._encode(box)) for box in boxes]
 
     def create_top_snapshot(self, jitcode, pc, boxes, vable_boxes, vref_boxes):
+        self._total_snapshots += 1
         array = self._list_of_boxes(boxes)
         vable_array = self._list_of_boxes(vable_boxes)
         vref_array = self._list_of_boxes(vref_boxes)
         s = TopSnapshot(combine_uint(jitcode.index, pc), array, vable_array,
                         vref_array)
-        assert rffi.cast(lltype.Signed, self._ops[self._pos - 1]) == -1
+        assert rffi.cast(lltype.Signed, self._ops[self._pos - 1]) == 0
         # guards have no descr
         self._snapshots.append(s)
         self._ops[self._pos - 1] = rffi.cast(rffi.SHORT, len(self._snapshots) 
- 1)
         return s
 
     def create_empty_top_snapshot(self, vable_boxes, vref_boxes):
+        self._total_snapshots += 1
         vable_array = self._list_of_boxes(vable_boxes)
         vref_array = self._list_of_boxes(vref_boxes)
         s = TopSnapshot(combine_uint(2**16 - 1, 0), [], vable_array,
@@ -347,11 +354,13 @@
         return s
 
     def create_snapshot(self, jitcode, pc, boxes):
+        self._total_snapshots += 1
         array = self._list_of_boxes(boxes)
         return Snapshot(combine_uint(jitcode.index, pc), array)
 
-    def get_iter(self):
-        return TraceIterator(self, 0, self._pos)
+    def get_iter(self, metainterp_sd=None):
+        assert metainterp_sd
+        return TraceIterator(self, 0, self._pos, metainterp_sd=metainterp_sd)
 
     def unpack(self):
         iter = self.get_iter()
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
@@ -122,7 +122,8 @@
             assert not self.optimizer._newoperations
     
     def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo):
-        info, newops = self.optimizer.propagate_all_forward(trace.get_iter(),
+        info, newops = self.optimizer.propagate_all_forward(
+            trace.get_iter(self.optimizer.metainterp_sd),
             call_pure_results, flush=False)
         exported_state = self.export_state(info.jump_op.getarglist(),
                                            info.inputargs,
@@ -135,7 +136,7 @@
 
     def optimize_peeled_loop(self, trace, celltoken, state,
                              call_pure_results, inline_short_preamble=True):
-        trace = trace.get_iter()
+        trace = trace.get_iter(self.optimizer.metainterp_sd)
         try:
             label_args = self.import_state(trace.inputargs, state)
         except VirtualStatesCantMatch:
@@ -226,7 +227,7 @@
 
     def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
                         inline_short_preamble, box_names_memo):
-        trace = trace.get_iter()
+        trace = trace.get_iter(self.optimizer.metainterp_sd)
         self._check_no_forwarding([trace.inputargs])
         info, ops = self.optimizer.propagate_all_forward(trace,
             call_pure_results, False)
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
@@ -1804,6 +1804,7 @@
         self.cpu.propagate_exception_descr = exc_descr
         #
         self.globaldata = MetaInterpGlobalData(self)
+        self.all_descrs = self.cpu.setup_descrs()
 
     def _setup_once(self):
         """Runtime setup needed by the various components of the JIT."""
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to