[pypy-commit] pypy jit-multilabel: refactor a bit and make sure import_state import_state sets things up properly even if there is nothing to import
hakanardo
noreply at buildbot.pypy.org
Sat Dec 17 20:32:23 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-multilabel
Changeset: r50631:4014ad4062c5
Date: 2011-12-17 17:47 +0100
http://bitbucket.org/pypy/pypy/changeset/4014ad4062c5/
Log: refactor a bit and make sure import_state import_state sets things
up properly even if there is nothing to import
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
@@ -91,38 +91,57 @@
self.optimizer.propagate_all_forward(clear=False)
if not jumpop:
- return
+ return
+
if self.jump_to_already_compiled_trace(jumpop):
# Found a compiled trace to jump to
- if self.did_import:
-
+ if self.short:
+ # Construct our short preamble
self.close_bridge(start_label)
- self.finilize_short_preamble(start_label)
return
cell_token = jumpop.getdescr()
assert isinstance(cell_token, JitCellToken)
stop_label = ResOperation(rop.LABEL, jumpop.getarglist(), None, TargetToken(cell_token))
- if not self.did_import: # Enforce the previous behaviour of always peeling exactly one iteration (for now)
- self.optimizer.flush()
- KillHugeIntBounds(self.optimizer).apply()
+ if self.did_import and self.jump_to_start_label(start_label, stop_label):
+ # Initial label matches, jump to it
+ jumpop = ResOperation(rop.JUMP, stop_label.getarglist(), None,
+ descr=start_label.getdescr())
+ if self.short:
+ # Construct our short preamble
+ self.close_loop(start_label, jumpop)
+ else:
+ self.optimizer.send_extra_operation(jumpop)
+ return
- loop.operations = self.optimizer.get_newoperations()
- self.export_state(stop_label)
- loop.operations.append(stop_label)
- else:
- assert stop_label
- assert start_label
- stop_target = stop_label.getdescr()
- start_target = start_label.getdescr()
- assert isinstance(stop_target, TargetToken)
- assert isinstance(start_target, TargetToken)
- assert stop_target.targeting_jitcell_token is start_target.targeting_jitcell_token
- jumpop = ResOperation(rop.JUMP, stop_label.getarglist(), None, descr=start_label.getdescr())
+ # Found nothing to jump to, emit a label instead
+ self.optimizer.flush()
+ KillHugeIntBounds(self.optimizer).apply()
- self.close_loop(jumpop)
- self.finilize_short_preamble(start_label)
+ loop.operations = self.optimizer.get_newoperations()
+ self.export_state(stop_label)
+ loop.operations.append(stop_label)
+
+ def jump_to_start_label(self, start_label, stop_label):
+ if not start_label or not stop_label:
+ return False
+
+ stop_target = stop_label.getdescr()
+ start_target = start_label.getdescr()
+ assert isinstance(stop_target, TargetToken)
+ assert isinstance(start_target, TargetToken)
+ if stop_target.targeting_jitcell_token is not start_target.targeting_jitcell_token:
+ return False
+
+ return True
+
+ #args = stop_label.getarglist()
+ #modifier = VirtualStateAdder(self.optimizer)
+ #virtual_state = modifier.get_virtual_state(args)
+ #if self.initial_virtual_state.generalization_of(virtual_state):
+ # return True
+
def export_state(self, targetop):
original_jump_args = targetop.getarglist()
@@ -171,18 +190,24 @@
def import_state(self, targetop):
self.did_import = False
- if not targetop:
+ if not targetop: # Trace did not start with a label
self.inputargs = self.optimizer.loop.inputargs
- # FIXME: Set up some sort of empty state with no virtuals?
+ self.short = None
+ self.initial_virtual_state = None
return
+
self.inputargs = targetop.getarglist()
-
target_token = targetop.getdescr()
assert isinstance(target_token, TargetToken)
exported_state = target_token.exported_state
if not exported_state:
- # FIXME: Set up some sort of empty state with no virtuals
+ # No state exported, construct one without virtuals
+ self.short = None
+ modifier = VirtualStateAdder(self.optimizer)
+ virtual_state = modifier.get_virtual_state(self.inputargs)
+ self.initial_virtual_state = virtual_state
return
+
self.did_import = True
self.short = target_token.short_preamble[:]
@@ -243,8 +268,9 @@
i += 1
newoperations = self.optimizer.get_newoperations()
self.short.append(ResOperation(rop.JUMP, short_jumpargs, None, descr=start_label.getdescr()))
-
- def close_loop(self, jumpop):
+ self.finilize_short_preamble(start_label)
+
+ def close_loop(self, start_label, jumpop):
virtual_state = self.initial_virtual_state
short_inputargs = self.short[0].getarglist()
inputargs = self.inputargs
@@ -329,6 +355,8 @@
assert isinstance(target_token, TargetToken)
target_token.targeting_jitcell_token.retraced_count = sys.maxint
+ self.finilize_short_preamble(start_label)
+
def finilize_short_preamble(self, start_label):
short = self.short
assert short[-1].getopnum() == rop.JUMP
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -580,6 +580,10 @@
except BoxNotProducable:
pass
+ self.short_boxes_in_production = None # Not needed anymore
+ else:
+ self.short_boxes = {}
+
def prioritized_alternatives(self, box):
if box not in self.alternatives:
return [self.potential_ops[box]]
More information about the pypy-commit
mailing list