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