[pypy-commit] pypy optresult: hack unrolling enough to pass the first actual test
fijal
noreply at buildbot.pypy.org
Sun Dec 14 19:05:41 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74917:2713ea9e60e2
Date: 2014-12-14 20:05 +0200
http://bitbucket.org/pypy/pypy/changeset/2713ea9e60e2/
Log: hack unrolling enough to pass the first actual test
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
@@ -150,6 +150,7 @@
loop.operations = self.optimizer.get_newoperations()
final_state = self.export_state(stop_label)
+ final_state.dump(self.optimizer.metainterp_sd)
loop.operations.append(stop_label)
return final_state
@@ -386,7 +387,7 @@
for i in range(len(short)):
op = short[i]
if op.is_guard():
- op = op.clone()
+ #op = op.clone() XXXX
op.setfailargs(None)
op.setdescr(None) # will be set to a proper descr when the preamble is used
short[i] = op
@@ -453,13 +454,13 @@
if op.is_guard():
op.setdescr(None) # will be set to a proper descr when the preamble is used
- if guards_needed and self.short_boxes.has_producer(op.result):
- value_guards = self.getvalue(op.result).make_guards(op.result)
+ if guards_needed and self.short_boxes.has_producer(op):
+ value_guards = self.getvalue(op).make_guards(op)
else:
value_guards = []
self.short.append(op)
- self.short_seen[op.result] = None
+ self.short_seen[op] = None
if emit and self.short_inliner:
newop = self.short_inliner.inline_op(op)
self.optimizer.send_extra_operation(newop)
@@ -577,21 +578,22 @@
debug_stop('jit-log-virtualstate')
return False
- def _inline_short_preamble(self, short_preamble, inliner, patchguardop,
+ def _inline_short_preamble(self, short_preamble, memo, patchguardop,
assumed_classes):
i = 1
# XXX this is intentiontal :-(. short_preamble can change during the
# loop in some cases
while i < len(short_preamble):
shop = short_preamble[i]
- newop = inliner.inline_op(shop)
+ newop = shop.clone(memo)
+ newop.is_source_op = True
if newop.is_guard():
if not patchguardop:
raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
- descr = patchguardop.getdescr().clone_if_mutable()
+ descr = patchguardop.getdescr().clone_if_mutable(memo)
newop.setdescr(descr)
self.optimizer.send_extra_operation(newop)
- if shop.result in assumed_classes:
+ if shop in assumed_classes:
classbox = self.getvalue(newop.result).get_constant_class(self.optimizer.cpu)
if not classbox or not classbox.same_constant(assumed_classes[shop.result]):
raise InvalidLoop('The class of an opaque pointer before the jump ' +
@@ -617,13 +619,13 @@
self.inputarg_setup_ops = inputarg_setup_ops
self.exported_values = exported_values
- def dump(self):
+ def dump(self, metainterp_sd):
debug_start("jit-exported-state")
- logops = LogOperations()
+ logops = LogOperations(metainterp_sd, False)
debug_print(" inputarg setup")
- logops._log_operations(self.inputarg_setup_ops)
+ logops._log_operations([], self.inputarg_setup_ops)
debug_print(" short boxes")
self.short_boxes.dump(logops)
debug_print(" exported values")
- self.exported_values.dump(logops)
+ #self.exported_values.dump(logops)
debug_stop("jit-exported-state")
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
@@ -591,32 +591,40 @@
self.potential_ops = {}
self.alternatives = {}
self.synthetic = {}
- self.memo = Memo()
self.optimizer = optimizer
self.available_boxes = available_boxes
self.assumed_classes = {}
- if surviving_boxes is not None:
- for box in surviving_boxes:
- self.potential_ops[box] = None
- optimizer.produce_potential_short_preamble_ops(self)
+ assert surviving_boxes is not None
+ for box in surviving_boxes:
+ self.potential_ops[box] = None
+ optimizer.produce_potential_short_preamble_ops(self)
- self.short_boxes = {}
- self.short_boxes_in_production = {}
+ self.short_boxes = {}
+ self.short_boxes_in_production = {}
- for op in self.potential_ops.keys():
- try:
- self.produce_short_preamble_op(op)
- except BoxNotProducable:
- pass
+ for op in self.potential_ops.keys():
+ try:
+ self.produce_short_preamble_op(op)
+ except BoxNotProducable:
+ pass
- self.short_boxes_in_production = None # Not needed anymore
- else:
- self.short_boxes = {}
+ self.short_boxes_in_production = None # Not needed anymore
+ #else:
+ # self.short_boxes = {}
+
+ def dump(self, logops):
+ for op, resop in self.short_boxes.iteritems():
+ if isinstance(op, AbstractInputArg):
+ assert resop is None
+ debug_print(logops.repr_of_arg(op))
+ else:
+ debug_print("%s:%s"% (logops.repr_of_resop(op),
+ logops.repr_of_resop(resop)))
def prioritized_alternatives(self, box):
if box not in self.alternatives:
- return [box]
+ return [self.potential_ops[box]]
alts = self.alternatives[box]
hi, lo = 0, len(alts) - 1
while hi < lo:
@@ -631,11 +639,13 @@
return alts
def add_to_short(self, box, op):
- if op:
- op = op.clone(self.memo)
- op.is_source_op = True
+ #if op:
+ # op = op.clone(self.memo)
+ # op.is_source_op = True
if box in self.short_boxes:
+ xxx
if op is None:
+ xxxx
oldop = self.short_boxes[box].clone()
oldres = oldop.result
newbox = oldop.result = oldres.clonebox()
@@ -643,6 +653,7 @@
self.short_boxes[box] = None
self.short_boxes[newbox] = oldop
else:
+ xxxx
newop = op.clone()
newbox = newop.result = op.result.clonebox()
self.short_boxes[newop.result] = newop
@@ -655,11 +666,11 @@
def produce_short_preamble_op(self, op):
if op in self.short_boxes:
return
- if isinstance(op, Const) or isinstance(op, AbstractInputArg):
+ if isinstance(op, Const):
return
if op in self.short_boxes_in_production:
raise BoxNotProducable
- if self.availible_boxes is not None and op not in self.available_boxes:
+ if self.available_boxes is not None and op not in self.available_boxes:
raise BoxNotProducable
self.short_boxes_in_production[op] = None
@@ -689,7 +700,7 @@
if classbox:
self.assumed_classes[op] = classbox
if op not in self.potential_ops:
- self.potential_ops[op] = None
+ self.potential_ops[op] = op
else:
if op not in self.alternatives:
self.alternatives[op] = [op]
More information about the pypy-commit
mailing list