[pypy-commit] pypy jit-duplicated_short_boxes: speedups?
hakanardo
noreply at buildbot.pypy.org
Sun Sep 4 21:05:47 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-duplicated_short_boxes
Changeset: r47076:311cc70d5b88
Date: 2011-09-04 21:05 +0200
http://bitbucket.org/pypy/pypy/changeset/311cc70d5b88/
Log: speedups?
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -10,6 +10,7 @@
from pypy.jit.metainterp.typesystem import llhelper, oohelper
from pypy.tool.pairtype import extendabletype
from pypy.rlib.debug import debug_start, debug_stop, debug_print
+from pypy.rlib.objectmodel import specialize
LEVEL_UNKNOWN = '\x00'
LEVEL_NONNULL = '\x01'
@@ -326,12 +327,10 @@
self.loop = loop
self.bridge = bridge
self.values = {}
- self.importable_values = {}
self.interned_refs = self.cpu.ts.new_ref_dict()
self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
self.bool_boxes = {}
self.pure_operations = args_dict()
- self.emitted_pure_operations = {}
self.producer = {}
self.pendingfields = []
self.posponedop = None
@@ -339,12 +338,11 @@
self.quasi_immutable_deps = None
self.opaque_pointers = {}
self.newoperations = []
- self.emitting_dissabled = False
- self.emitted_guards = 0
if loop is not None:
self.call_pure_results = loop.call_pure_results
self.set_optimizations(optimizations)
+ self.setup()
def set_optimizations(self, optimizations):
if optimizations:
@@ -371,23 +369,18 @@
assert self.posponedop is None
def new(self):
+ new = Optimizer(self.metainterp_sd, self.loop)
+ return self._new(new)
+
+ def _new(self, new):
assert self.posponedop is None
- new = Optimizer(self.metainterp_sd, self.loop)
optimizations = [o.new() for o in self.optimizations]
new.set_optimizations(optimizations)
new.quasi_immutable_deps = self.quasi_immutable_deps
return new
def produce_potential_short_preamble_ops(self, sb):
- for op in self.emitted_pure_operations:
- if op.getopnum() == rop.GETARRAYITEM_GC_PURE or \
- op.getopnum() == rop.STRGETITEM or \
- op.getopnum() == rop.UNICODEGETITEM:
- if not self.getvalue(op.getarg(1)).is_constant():
- continue
- sb.add_potential(op)
- for opt in self.optimizations:
- opt.produce_potential_short_preamble_ops(sb)
+ raise NotImplementedError('This is implemented in unroll.UnrollableOptimizer')
def turned_constant(self, value):
for o in self.optimizations:
@@ -409,6 +402,7 @@
else:
return box
+ @specialize.argtype(0)
def getvalue(self, box):
box = self.getinterned(box)
try:
@@ -419,11 +413,9 @@
return value
def ensure_imported(self, value):
- if not self.emitting_dissabled and value in self.importable_values:
- imp = self.importable_values[value]
- del self.importable_values[value]
- imp.import_value(value)
+ pass
+ @specialize.argtype(0)
def get_constant_box(self, box):
if isinstance(box, Const):
return box
@@ -512,18 +504,22 @@
def emit_operation(self, op):
if op.returns_bool_result():
self.bool_boxes[self.getvalue(op.result)] = None
- if self.emitting_dissabled:
- return
+ self._emit_operation(op)
+ @specialize.argtype(0)
+ def _emit_operation(self, op):
for i in range(op.numargs()):
arg = op.getarg(i)
- if arg in self.values:
- box = self.getvalue(arg).force_box()
- op.setarg(i, box)
+ try:
+ value = self.values[arg]
+ except KeyError:
+ pass
+ else:
+ self.ensure_imported(value)
+ op.setarg(i, value.force_box())
self.metainterp_sd.profiler.count(jitprof.OPT_OPS)
if op.is_guard():
self.metainterp_sd.profiler.count(jitprof.OPT_GUARDS)
- self.emitted_guards += 1 # FIXME: can we reuse above counter?
op = self.store_final_boxes_in_guard(op)
elif op.can_raise():
self.exception_might_have_happened = True
@@ -575,6 +571,7 @@
args[n+1] = op.getdescr()
return args
+ @specialize.argtype(0)
def optimize_default(self, op):
canfold = op.is_always_pure()
if op.is_ovf():
@@ -610,13 +607,16 @@
return
else:
self.pure_operations[args] = op
- self.emitted_pure_operations[op] = True
+ self.remember_emitting_pure(op)
# otherwise, the operation remains
self.emit_operation(op)
if nextop:
self.emit_operation(nextop)
+ def remember_emitting_pure(self, op):
+ pass
+
def constant_fold(self, op):
argboxes = [self.get_constant_box(op.getarg(i))
for i in range(op.numargs())]
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -70,6 +70,47 @@
self.snapshot_map[snapshot] = new_snapshot
return new_snapshot
+class UnrollableOptimizer(Optimizer):
+ def setup(self):
+ self.importable_values = {}
+ self.emitting_dissabled = False
+ self.emitted_guards = 0
+ self.emitted_pure_operations = {}
+
+ def ensure_imported(self, value):
+ if not self.emitting_dissabled and value in self.importable_values:
+ imp = self.importable_values[value]
+ del self.importable_values[value]
+ imp.import_value(value)
+
+ def emit_operation(self, op):
+ if op.returns_bool_result():
+ self.bool_boxes[self.getvalue(op.result)] = None
+ if self.emitting_dissabled:
+ return
+ if op.is_guard():
+ self.emitted_guards += 1 # FIXME: can we use counter in self._emit_operation?
+ self._emit_operation(op)
+
+ def new(self):
+ new = UnrollableOptimizer(self.metainterp_sd, self.loop)
+ return self._new(new)
+
+ def remember_emitting_pure(self, op):
+ self.emitted_pure_operations[op] = True
+
+ def produce_potential_short_preamble_ops(self, sb):
+ for op in self.emitted_pure_operations:
+ if op.getopnum() == rop.GETARRAYITEM_GC_PURE or \
+ op.getopnum() == rop.STRGETITEM or \
+ op.getopnum() == rop.UNICODEGETITEM:
+ if not self.getvalue(op.getarg(1)).is_constant():
+ continue
+ sb.add_potential(op)
+ for opt in self.optimizations:
+ opt.produce_potential_short_preamble_ops(sb)
+
+
class UnrollOptimizer(Optimization):
"""Unroll the loop into two iterations. The first one will
@@ -77,7 +118,7 @@
distinction anymore)"""
def __init__(self, metainterp_sd, loop, optimizations):
- self.optimizer = Optimizer(metainterp_sd, loop, optimizations)
+ self.optimizer = UnrollableOptimizer(metainterp_sd, loop, optimizations)
self.cloned_operations = []
for op in self.optimizer.loop.operations:
newop = op.clone()
More information about the pypy-commit
mailing list