[pypy-commit] pypy optresult-unroll: start working towards short preamble
fijal
noreply at buildbot.pypy.org
Mon Jun 29 11:17:02 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78344:18d849cece6c
Date: 2015-06-25 13:20 +0200
http://bitbucket.org/pypy/pypy/changeset/18d849cece6c/
Log: start working towards short preamble ;
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
@@ -233,6 +233,7 @@
self.optpure = None
self.optheap = None
self.optearlyforce = None
+ self.optunroll = None
# the following two fields is the data kept for unrolling,
# those are the operations that can go to the short_preamble
if loop is not None:
@@ -307,9 +308,6 @@
return info.force_box(op, self)
return op
- def ensure_imported(self, value):
- pass
-
def is_inputarg(self, op):
return op in self.inparg_dict
@@ -409,7 +407,7 @@
op.getdescr().get_index())
elif op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC:
opinfo = info.ArrayPtrInfo(op.getdescr())
- elif op.getopnum() == rop.GUARD_CLASS:
+ elif op.getopnum() in (rop.GUARD_CLASS, rop.GUARD_NONNULL_CLASS):
opinfo = info.InstancePtrInfo()
elif op.getopnum() in (rop.STRLEN,):
opinfo = vstring.StrPtrInfo(vstring.mode_string)
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -2,6 +2,7 @@
from rpython.jit.metainterp.resoperation import rop, OpHelpers, AbstractResOp,\
ResOperation
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
+from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp
class RecentPureOps(object):
@@ -17,12 +18,19 @@
self.next_index = (next_index + 1) % self.REMEMBER_LIMIT
self.lst[next_index] = op
+ def force_preamble_op(self, opt, op, i):
+ if not isinstance(op, PreambleOp):
+ return
+ op = opt.force_op_from_preamble(op)
+ self.lst[i] = op
+
def lookup1(self, opt, box0, descr):
for i in range(self.REMEMBER_LIMIT):
op = self.lst[i]
if op is None:
break
if opt.get_box_replacement(op.getarg(0)).same_box(box0) and op.getdescr() is descr:
+ self.force_preamble_op(opt, op, i)
return opt.get_box_replacement(op)
return None
@@ -33,6 +41,7 @@
break
if (opt.get_box_replacement(op.getarg(0)).same_box(box0) and opt.get_box_replacement(op.getarg(1)).same_box(box1)
and op.getdescr() is descr):
+ self.force_preamble_op(opt, op, i)
return opt.get_box_replacement(op)
return None
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -88,7 +88,8 @@
short_preamble.operations = short
self.assert_equal(short_preamble, convert_old_style_to_targets(expected_short, jump=True),
text_right='expected short preamble')
- assert short[-1].getdescr() == loop.operations[0].getdescr()
+ #assert short[-1].getdescr() == loop.operations[0].getdescr()
+ # XXX not sure what to do about that one
return loop
@@ -187,7 +188,12 @@
[i0]
jump(i0)
"""
- self.optimize_loop(ops, expected)
+ short = """
+ [i2]
+ p3 = cast_int_to_ptr(i2)
+ #jump(i2) <- think about it
+ """
+ self.optimize_loop(ops, expected, expected_short=short)
def test_reverse_of_cast_2(self):
ops = """
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
@@ -5,11 +5,12 @@
from rpython.jit.metainterp.logger import LogOperations
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
-from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
+ Optimization
from rpython.jit.metainterp.optimizeopt.virtualstate import (VirtualStateConstructor,
ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
from rpython.jit.metainterp.resoperation import rop, ResOperation,\
- OpHelpers, AbstractInputArg, GuardResOp
+ OpHelpers, AbstractInputArg, GuardResOp, AbstractResOp
from rpython.jit.metainterp.resume import Snapshot
from rpython.jit.metainterp import compile
from rpython.rlib.debug import debug_print, debug_start, debug_stop
@@ -25,6 +26,17 @@
return opt.propagate_all_forward(start_state, export_state)
+class PreambleOp(AbstractResOp):
+ def __init__(self, op):
+ self.op = op
+
+ def getarg(self, i):
+ return self.op.getarg(i)
+
+ def __repr__(self):
+ return "Preamble(%r)" % (self.op,)
+
+
class UnrollableOptimizer(Optimizer):
def setup(self):
self.importable_values = {}
@@ -44,6 +56,11 @@
self.emitted_guards += 1 # FIXME: can we use counter in self._emit_operation?
self._emit_operation(op)
+ def force_op_from_preamble(self, op):
+ op = op.op
+ self.optunroll.short.append(op)
+ return op
+
class UnrollOptimizer(Optimization):
"""Unroll the loop into two iterations. The first one will
@@ -55,6 +72,7 @@
def __init__(self, metainterp_sd, jitdriver_sd, loop, optimizations):
self.optimizer = UnrollableOptimizer(metainterp_sd, jitdriver_sd,
loop, optimizations)
+ self.optimizer.optunroll = self
self.boxes_created_this_iteration = None
def get_virtual_state(self, args):
@@ -121,11 +139,12 @@
# Initial label matches, jump to it
jumpop = ResOperation(rop.JUMP, stop_label.getarglist(),
descr=start_label.getdescr())
- if self.short:
- # Construct our short preamble
- self.close_loop(start_label, jumpop, patchguardop)
- else:
- self.optimizer.send_extra_operation(jumpop)
+ #if self.short:
+ # # Construct our short preamble
+ # self.close_loop(start_label, jumpop, patchguardop)
+ #else:
+ start_label.getdescr().short_preamble = self.short
+ self.optimizer.send_extra_operation(jumpop)
return
if cell_token.target_tokens:
@@ -275,10 +294,19 @@
# Setup the state of the new optimizer by emiting the
# short operations and discarding the result
- self.optimizer.emitting_dissabled = True
- for source, target in exported_state.inputarg_setup_ops:
- source.set_forwarded(target)
+ #self.optimizer.emitting_dissabled = True
+ # think about it, it seems to be just for consts
+ #for source, target in exported_state.inputarg_setup_ops:
+ # source.set_forwarded(target)
+ for op in self.short_boxes.operations():
+ if not op:
+ continue
+ if op.is_always_pure():
+ self.pure(op.getopnum(), PreambleOp(op))
+ else:
+ yyy
+ return
seen = {}
for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
More information about the pypy-commit
mailing list