[pypy-commit] pypy optresult-unroll: start passing construction of args
fijal
noreply at buildbot.pypy.org
Mon Jun 29 17:20:11 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78352:fdaae9ee19c7
Date: 2015-06-29 17:19 +0200
http://bitbucket.org/pypy/pypy/changeset/fdaae9ee19c7/
Log: start passing construction of args
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
@@ -297,9 +297,15 @@
self.make_constant_class(op, known_class, False)
def get_box_replacement(self, op):
+ from rpython.jit.metainterp.optimizeopt.unroll import PreambleOp
+
+ orig_op = op
if op is None:
return op
- return op.get_box_replacement()
+ res = op.get_box_replacement()
+ if isinstance(res, PreambleOp):
+ xxx
+ return res
def force_box(self, op):
op = self.get_box_replacement(op)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -1,22 +1,26 @@
from __future__ import with_statement
import py
-from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo, VStructStateInfo, \
- VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes, GenerateGuardState, \
- VirtualStatesCantMatch, VArrayStructStateInfo
-from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, PtrOptValue,\
- IntOptValue
-from rpython.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr, ConstInt, ConstPtr
+from rpython.jit.metainterp.optimizeopt.virtualstate import VirtualStateInfo,\
+ VStructStateInfo, LEVEL_CONSTANT,\
+ VArrayStateInfo, NotVirtualStateInfo, VirtualState, ShortBoxes,\
+ GenerateGuardState, VirtualStatesCantMatch, VArrayStructStateInfo
+from rpython.jit.metainterp.history import ConstInt, ConstPtr
+from rpython.jit.metainterp.resoperation import InputArgInt, InputArgRef,\
+ InputArgFloat
from rpython.rtyper.lltypesystem import lltype, llmemory
from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin, BaseTest, \
equaloplists
from rpython.jit.metainterp.optimizeopt.intutils import IntBound
-from rpython.jit.metainterp.optimizeopt.virtualize import (VirtualValue,
- VArrayValue, VStructValue, VArrayStructValue)
from rpython.jit.metainterp.history import TreeLoop, JitCellToken
from rpython.jit.metainterp.optimizeopt.test.test_optimizeopt import FakeMetaInterpStaticData
+from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.metainterp import resume
+class FakeOptimizer(Optimizer):
+ def __init__(self):
+ self.optearlyforce = None
+
class BaseTestGenerateGuards(BaseTest):
def _box_or_value(self, box_or_value=None):
@@ -74,6 +78,14 @@
with py.test.raises(VirtualStatesCantMatch):
info1.generate_guards(info2, value, state)
+ def test_make_inputargs(self):
+ optimizer = FakeOptimizer()
+ args = [InputArgInt()]
+ info0 = NotVirtualStateInfo(optimizer, args[0])
+ vs = VirtualState([info0])
+ assert vs.make_inputargs(args, optimizer) == args
+ info0.level = LEVEL_CONSTANT
+ assert vs.make_inputargs(args, optimizer) == []
def test_position_generalization(self):
def postest(info1, info2):
@@ -95,7 +107,7 @@
self.check_invalid(info1, info2, state=state)
assert info1 in state.bad and info2 in state.bad
- for BoxType in (BoxInt, BoxFloat, BoxPtr):
+ for BoxType in (InputArgInt, InputArgFloat, InputArgPtr):
info1 = NotVirtualStateInfo(OptValue(BoxType()))
info2 = NotVirtualStateInfo(OptValue(BoxType()))
postest(info1, info2)
@@ -1386,16 +1398,6 @@
class TestLLtypeBridges(BaseTestBridges, LLtypeMixin):
pass
-class FakeOptimizer:
- def __init__(self):
- self.opaque_pointers = {}
- self.values = {}
- def make_equal_to(*args):
- pass
- def getvalue(*args):
- pass
- def emit_operation(*args):
- pass
class TestShortBoxes:
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
@@ -137,7 +137,13 @@
if start_label and self.jump_to_start_label(start_label, stop_label):
# Initial label matches, jump to it
- jumpop = ResOperation(rop.JUMP, stop_label.getarglist(),
+ vs = start_label.getdescr().virtual_state
+ if vs is not None:
+ args = vs.make_inputargs(stop_label.getarglist(),
+ self.optimizer)
+ else:
+ args = stop_label.getarglist()
+ jumpop = ResOperation(rop.JUMP, args,
descr=start_label.getdescr())
#if self.short:
# # Construct our short preamble
@@ -222,7 +228,7 @@
short_boxes = ShortBoxes(self.optimizer, inputargs)
- inputarg_setup_ops = []
+ proven_constants = []
for i in range(len(original_jump_args)):
srcbox = jump_args[i]
if srcbox is not original_jump_args[i]:
@@ -231,7 +237,7 @@
if info and info.is_virtual():
xxx
if original_jump_args[i] is not srcbox and srcbox.is_constant():
- inputarg_setup_ops.append((original_jump_args[i], srcbox))
+ proven_constants.append((original_jump_args[i], srcbox))
#opnum = OpHelpers.same_as_for_type(original_jump_args[i].type)
#op = ResOperation(opnum, [srcbox])
#self.optimizer.emit_operation(op)
@@ -264,7 +270,7 @@
if op and op.type != 'v':
exported_values[op] = self.optimizer.getinfo(op)
- return ExportedState(short_boxes, inputarg_setup_ops, exported_values)
+ return ExportedState(short_boxes, proven_constants, exported_values)
def import_state(self, targetop, exported_state):
if not targetop: # Trace did not start with a label
@@ -291,6 +297,8 @@
for box in self.inputargs:
preamble_info = exported_state.exported_values[box]
self.optimizer.setinfo_from_preamble(box, preamble_info)
+ for box, const in exported_state.proven_constants:
+ box.set_forwarded(const)
# Setup the state of the new optimizer by emiting the
# short operations and discarding the result
@@ -309,6 +317,7 @@
return
seen = {}
for op in self.short_boxes.operations():
+ yyy
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.type != 'v':
preamble_value = exported_state.exported_values[op]
@@ -709,9 +718,9 @@
class ExportedState(object):
- def __init__(self, short_boxes, inputarg_setup_ops, exported_values):
+ def __init__(self, short_boxes, proven_constants, exported_values):
self.short_boxes = short_boxes
- self.inputarg_setup_ops = inputarg_setup_ops
+ self.proven_constants = proven_constants
self.exported_values = exported_values
def dump(self, metainterp_sd):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -282,7 +282,14 @@
lenbound = None
intbound = None
- def __init__(self, cpu, ptrinfo, is_opaque=False):
+ def __init__(self, optimizer, box):
+ info = optimizer.getinfo(box)
+ if info and info.is_constant():
+ self.level = LEVEL_CONSTANT
+ else:
+ self.level = LEVEL_UNKNOWN
+ return
+ yyy
self.level = LEVEL_UNKNOWN
if ptrinfo is not None:
self.known_class = ptrinfo.get_known_class(cpu)
@@ -461,15 +468,6 @@
debug_print(indent + mark + 'NotVirtualInfo(%d' % self.position +
', ' + l + ', ' + self.intbound.__repr__() + lb + ')')
-class IntNotVirtualStateInfo(NotVirtualStateInfo):
- def __init__(self, intbound):
- # XXX do we care about non null?
- self.intbound = intbound
- if intbound.is_constant():
- self.level = LEVEL_CONSTANT
- else:
- self.level = LEVEL_UNKNOWN
-
class VirtualState(object):
def __init__(self, state):
@@ -502,8 +500,11 @@
if optimizer.optearlyforce:
optimizer = optimizer.optearlyforce
assert len(inputargs) == len(self.state)
- return [x for x in inputargs if not isinstance(x, Const)]
- return inputargs
+ inpargs = []
+ for i, state in enumerate(self.state):
+ if state.level != LEVEL_CONSTANT:
+ inpargs.append(inputargs[i])
+ return inpargs
inputargs = [None] * self.numnotvirtuals
# We try twice. The first time around we allow boxes to be forced
@@ -597,16 +598,9 @@
return VirtualState(state)
- def visit_not_ptr(self, box, intbound):
- return IntNotVirtualStateInfo(intbound=intbound)
-
def visit_not_virtual(self, box):
is_opaque = box in self.optimizer.opaque_pointers
- if box.type == 'r':
- ptrinfo = self.optimizer.getptrinfo(box)
- else:
- return self.visit_not_ptr(box, self.optimizer.getintbound(box))
- return NotVirtualStateInfo(self.optimizer.cpu, ptrinfo, is_opaque)
+ return NotVirtualStateInfo(self.optimizer, box)
def visit_virtual(self, known_class, fielddescrs):
return VirtualStateInfo(known_class, fielddescrs)
More information about the pypy-commit
mailing list