Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78176:ab923482ef81
Date: 2015-06-18 13:50 +0200
http://bitbucket.org/pypy/pypy/changeset/ab923482ef81/
Log: scarily enough to start passing unrolling tests
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
@@ -279,39 +279,16 @@
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_FORCINGS)
self.resumedata_memo.forget_numberings()
- def getinterned(self, box):
- constbox = self.get_constant_box(box)
- if constbox is None:
- return box
- if constbox.type == REF:
- value = constbox.getref_base()
- if not value:
- return box
- return self.interned_refs.setdefault(value, box)
- #elif constbox.type == INT:
- # value = constbox.getint()
- # return self.interned_ints.setdefault(value, box)
+ def getinfo(self, op):
+ if op.type == 'r':
+ return self.getptrinfo(op)
+ elif op.type == 'i':
+ return self.getintbound(op)
else:
- return box
+ zzz
- ## def getinfo(self, op, create=False):
- ## xxx
- ## yyy
-
- ## XXX
- ## box = self.getinterned(box)
- ## try:
- ## value = self.values[box]
- ## except KeyError:
- ## if box.type == "r":
- ## value = self.values[box] = PtrOptValue(box)
- ## elif box.type == "i":
- ## value = self.values[box] = IntOptValue(box)
- ## else:
- ## assert box.type == "f"
- ## value = self.values[box] = OptValue(box)
- ## self.ensure_imported(value)
- ## return value
+ def setinfo_from_preamble(self, op, old_info):
+ pass # deal with later
def get_box_replacement(self, op):
if op is None:
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
@@ -179,9 +179,9 @@
virtual_state = self.get_virtual_state(jump_args)
- values = [self.getinfo(arg) for arg in jump_args]
- inputargs = virtual_state.make_inputargs(values, self.optimizer)
- short_inputargs = virtual_state.make_inputargs(values, self.optimizer,
keyboxes=True)
+ inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
+ short_inputargs = virtual_state.make_inputargs(jump_args,
+ self.optimizer, keyboxes=True)
if self.boxes_created_this_iteration is not None:
for box in self.inputargs:
@@ -190,16 +190,22 @@
short_boxes = ShortBoxes(self.optimizer, inputargs)
self.optimizer.clear_newoperations()
- for i in range(len(original_jump_args)):
- srcbox = jump_args[i]
- if values[i].is_virtual():
- srcbox = values[i].force_box(self.optimizer)
- if original_jump_args[i] is not srcbox:
- opnum = OpHelpers.same_as_for_type(original_jump_args[i].type)
- op = self.optimizer.replace_op_with(original_jump_args[i],
- opnum, [srcbox],
- descr=DONT_CHANGE)
- self.optimizer.emit_operation(op)
+ # for i in range(len(original_jump_args)):
+ # srcbox = jump_args[i]
+ # if srcbox is not original_jump_args[i]:
+ # xxx
+ # if srcbox.type != 'r':
+ # continue
+ # info = self.optimizer.getptrinfo(srcbox)
+ # if info and info.is_virtual():
+ # xxx
+ # srcbox = values[i].force_box(self.optimizer)
+ # if original_jump_args[i] is not srcbox:
+ # opnum =
OpHelpers.same_as_for_type(original_jump_args[i].type)
+ # op = self.optimizer.replace_op_with(original_jump_args[i],
+ # opnum, [srcbox],
+ # descr=DONT_CHANGE)
+ # self.optimizer.emit_operation(op)
inputarg_setup_ops = self.optimizer.get_newoperations()
target_token = targetop.getdescr()
@@ -210,10 +216,10 @@
exported_values = {}
for box in inputargs:
- exported_values[box] = self.optimizer.getvalue(box)
+ exported_values[box] = self.optimizer.getinfo(box)
for op in short_boxes.operations():
if op and op.type != 'v':
- exported_values[op] = self.optimizer.getvalue(op)
+ exported_values[op] = self.optimizer.getinfo(op)
return ExportedState(short_boxes, inputarg_setup_ops, exported_values)
@@ -240,9 +246,8 @@
self.initial_virtual_state = target_token.virtual_state
for box in self.inputargs:
- preamble_value = exported_state.exported_values[box]
- value = self.optimizer.getvalue(box)
- value.import_from(preamble_value, self.optimizer)
+ preamble_info = exported_state.exported_values[box]
+ self.optimizer.setinfo_from_preamble(box, preamble_info)
# Setup the state of the new optimizer by emiting the
# short operations and discarding the result
@@ -255,6 +260,7 @@
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.type != 'v':
preamble_value = exported_state.exported_values[op]
+ continue
value = self.optimizer.getvalue(op)
if not value.is_virtual() and not value.is_constant():
imp = ValueImporter(self, preamble_value, op)
@@ -306,9 +312,10 @@
# Construct jumpargs from the virtual state
original_jumpargs = jumpop.getarglist()[:]
- values = [self.getvalue(arg) for arg in jumpop.getarglist()]
+ jump_boxes = [self.get_box_replacement(arg) for arg in
+ jumpop.getarglist()]
try:
- jumpargs = virtual_state.make_inputargs(values, self.optimizer)
+ jumpargs = virtual_state.make_inputargs(jump_boxes, self.optimizer)
except BadVirtualState:
raise InvalidLoop('The state of the optimizer at the end of ' +
'peeled loop is inconsistent with the ' +
@@ -317,7 +324,7 @@
jumpop.initarglist(jumpargs)
# Inline the short preamble at the end of the loop
- jmp_to_short_args = virtual_state.make_inputargs(values,
+ jmp_to_short_args = virtual_state.make_inputargs(jump_boxes,
self.optimizer,
keyboxes=True)
assert len(short_inputargs) == len(jmp_to_short_args)
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
@@ -9,6 +9,8 @@
from rpython.rlib.debug import debug_start, debug_stop, debug_print
from rpython.rlib.objectmodel import we_are_translated
+LEVEL_UNKNOWN = '\x00'
+LEVEL_CONSTANT = '\x01'
class BadVirtualState(Exception):
pass
@@ -276,9 +278,14 @@
def debug_header(self, indent):
debug_print(indent + 'VArrayStructStateInfo(%d):' % self.position)
-
class NotVirtualStateInfo(AbstractVirtualStateInfo):
- def __init__(self, value, is_opaque=False):
+ lenbound = None
+ intbound = None
+
+ def __init__(self, box, is_opaque=False):
+ self.level = LEVEL_UNKNOWN
+ return
+ xxx
self.is_opaque = is_opaque
self.known_class = value.get_known_class()
self.level = value.getlevel()
@@ -385,6 +392,8 @@
assert 0, "unreachable"
def _generate_guards_intbounds(self, other, box, extra_guards):
+ if self.intbound is None:
+ return
if self.intbound.contains_bound(other.intbound):
return
xxx
@@ -450,6 +459,15 @@
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):
@@ -478,10 +496,11 @@
state)
return state
- def make_inputargs(self, values, optimizer, keyboxes=False):
+ def make_inputargs(self, inputargs, optimizer, keyboxes=False):
if optimizer.optearlyforce:
optimizer = optimizer.optearlyforce
- assert len(values) == len(self.state)
+ assert len(inputargs) == len(self.state)
+ return inputargs
inputargs = [None] * self.numnotvirtuals
# We try twice. The first time around we allow boxes to be forced
@@ -555,20 +574,32 @@
opt = self.optimizer.optearlyforce
else:
opt = self.optimizer
+ state = []
for box in jump_args:
+ box = opt.get_box_replacement(box)
if box.type == 'r':
- zxsadsadsa
+ info = opt.getptrinfo(box)
+ if info is not None and info.is_virtual():
+ xxx
+ else:
+ state.append(self.visit_not_virtual(box))
+ elif box.type == 'i':
+ intbound = opt.getintbound(box)
+ state.append(self.visit_not_ptr(box, intbound))
+ else:
+ xxx
#values = [self.getvalue(box).force_at_end_of_preamble(already_forced,
# opt)
# for box in jump_args]
- #for value in values:
- # value.visitor_walk_recursive(self)
- return VirtualState([self.state(box) for box in jump_args])
+ return VirtualState(state)
- def visit_not_virtual(self, value):
- is_opaque = value in self.optimizer.opaque_pointers
- return NotVirtualStateInfo(value, is_opaque)
+ 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
+ return NotVirtualStateInfo(box, is_opaque)
def visit_virtual(self, known_class, fielddescrs):
return VirtualStateInfo(known_class, fielddescrs)
@@ -643,10 +674,6 @@
return alts
def add_to_short(self, box, op):
- xxx
- #if op:
- # op = op.clone(self.memo)
- # op.is_source_op = True
if box in self.short_boxes:
xxx
return # XXX avoid those corner cases
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit