Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78948:88cc46ecee6b
Date: 2015-08-12 19:04 +0200
http://bitbucket.org/pypy/pypy/changeset/88cc46ecee6b/
Log: kill dead code
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
@@ -159,98 +159,6 @@
op.set_forwarded(None)
return res
- def random_garbage(self):
- # WTF is the rest of this function
- if not jumpop:
- return
-
- cell_token = jumpop.getdescr()
- assert isinstance(cell_token, JitCellToken)
- stop_label = ResOperation(rop.LABEL, jumpop.getarglist(),
TargetToken(cell_token))
-
- if jumpop.getopnum() == rop.JUMP:
- if self.jump_to_already_compiled_trace(jumpop, patchguardop):
- # Found a compiled trace to jump to
- if self.short:
- # Construct our short preamble
- assert start_label
- self.close_bridge(start_label)
- return
-
- if start_label and self.jump_to_start_label(start_label,
stop_label):
- # Initial label matches, jump to it
- 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
- # 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:
- limit =
self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.retrace_limit
- if cell_token.retraced_count < limit:
- cell_token.retraced_count += 1
- debug_print('Retracing (%d/%d)' %
(cell_token.retraced_count, limit))
- else:
- debug_print("Retrace count reached, jumping to preamble")
- assert cell_token.target_tokens[0].virtual_state is None
- jumpop = jumpop.clone()
- jumpop.setdescr(cell_token.target_tokens[0])
- self.optimizer.send_extra_operation(jumpop)
- return
-
- # Found nothing to jump to, emit a label instead
-
- if self.short:
- # Construct our short preamble
- assert start_label
- self.close_bridge(start_label)
-
- self.optimizer.flush()
-
- loop.operations = self.optimizer.get_newoperations()
- if export_state:
- jd_sd = self.optimizer.jitdriver_sd
- try:
- threshold = jd_sd.warmstate.disable_unrolling_threshold
- except AttributeError: # tests only
- threshold = sys.maxint
- if len(loop.operations) > threshold:
- if loop.operations[0].getopnum() == rop.LABEL:
- # abandoning unrolling, too long
- new_descr = stop_label.getdescr()
- if loop.operations[0].getopnum() == rop.LABEL:
- new_descr = loop.operations[0].getdescr()
- stop_label = stop_label.copy_and_change(rop.JUMP,
- descr=new_descr)
- self.optimizer.send_extra_operation(stop_label)
- loop.operations = self.optimizer.get_newoperations()
- return None
- final_state = self.export_state(start_label, stop_label)
- else:
- final_state = None
- loop.operations.append(stop_label)
- return final_state
-
- 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)
- return stop_target.targeting_jitcell_token is
start_target.targeting_jitcell_token
-
def export_state(self, start_label, end_label, renamed_inputargs):
original_label_args = end_label.getarglist()
end_args = [self.get_box_replacement(a) for a in original_label_args]
@@ -278,56 +186,9 @@
short_boxes, renamed_inputargs,
short_inputargs)
-
- inputargs = virtual_state.make_inputargs(jump_args, self.optimizer)
- short_inputargs = virtual_state.make_inputargs(jump_args,
- self.optimizer, keyboxes=True)
-
- #proven_constants = []
- #for i in range(len(original_jump_args)):
- # srcbox = jump_args[i]
- ## if srcbox is not original_jump_args[i]:
- # if srcbox.type == 'r':
- # info = self.optimizer.getptrinfo(srcbox)
- # if info and info.is_virtual():
- # xxx
- # if original_jump_args[i] is not srcbox and srcbox.is_constant():
- # 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)
-
- # 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 = original_jump_args
- #inputarg_setup_ops = self.optimizer.get_newoperations()
-
- target_token.short_preamble = [ResOperation(rop.LABEL,
short_inputargs, None)]
-
- #exported_values = {}
- #for box in inputargs:
- # exported_values[box] = self.optimizer.getinfo(box)
- #for op in short_boxes.operations():
- # if op and op.type != 'v':
- # exported_values[op] = self.optimizer.getinfo(op)
-
- return ExportedState([], [])
-
def import_state(self, targetop, exported_state):
# the mapping between input args (from old label) and what we need
# to actually emit. Update the info
- #self.ops_to_import = {}
- virtual_state = exported_state.virtual_state
for source, target in exported_state.inputarg_mapping:
if source is not target:
source.set_forwarded(target)
@@ -343,254 +204,6 @@
for produced_op in exported_state.short_boxes:
produced_op.produce_op(self, exported_state.exported_infos)
- return
- self.inputargs = targetop.getarglist()
- target_token = targetop.getdescr()
- assert isinstance(target_token, TargetToken)
- if not exported_state:
- # No state exported, construct one without virtuals
- self.short = None
- virtual_state = self.get_virtual_state(self.inputargs)
- self.initial_virtual_state = virtual_state
- return
-
- self.short = [] # target_token.short_preamble[:]
- #self.short_seen = {}
- self.initial_virtual_state = target_token.virtual_state
-
- #inpargs = self.initial_virtual_state.make_inputargs(
- # exported_state.orig_inputargs, self.optimizer)
- #for i, arg in enumerate(inpargs):
- # if arg is not self.inputargs[i]:
- # arg.set_forwarded(self.inputargs[i])
- #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.state:
- # box.set_forwarded(const)
-
- # Setup the state of the new optimizer by emiting the
- # short operations and discarding the result
- #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 source, target in exported_state.inputarg_mapping:
- source.set_forwarded(target)
-
- for op, preamble_op in exported_state.short_boxes.iteritems():
- if preamble_op.is_always_pure():
- self.pure(op.getopnum(), PreambleOp(op, None))
- else:
- xxx
- 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]
- continue
- value = self.optimizer.getvalue(op)
- if not value.is_virtual() and not value.is_constant():
- imp = ValueImporter(self, preamble_value, op)
- self.optimizer.importable_values[value] = imp
- newvalue = self.optimizer.getvalue(op)
- newresult = newvalue.get_key_box()
- # note that emitting here SAME_AS should not happen, but
- # in case it does, we would prefer to be suboptimal in asm
- # to a fatal RPython exception.
- # XXX investigate what is it
- xxxx
- if source_op is not op and \
- not self.short_boxes.has_producer(newresult) and \
- not newvalue.is_constant():
- xxx
- opnum = OpHelpers.same_as_for_type(op.type)
- op = ResOperation(opnum, [op])
- self.optimizer._newoperations.append(op)
- #if self.optimizer.loop.logops:
- # debug_print(' Falling back to add extra: ' +
- #
self.optimizer.loop.logops.repr_of_resop(op))
-
- #self.optimizer.flush()
- #self.optimizer.emitting_dissabled = False
-
- def close_bridge(self, start_label):
- inputargs = self.inputargs
- short_jumpargs = inputargs[:]
-
- # We dont need to inline the short preamble we are creating as we are
conneting
- # the bridge to a different trace with a different short preamble
- self.memo = None
-
- newoperations = self.optimizer.get_newoperations()
- self.boxes_created_this_iteration = {}
- i = 0
- while i < len(newoperations):
- self._import_op(newoperations[i], inputargs, short_jumpargs, [])
- i += 1
- newoperations = self.optimizer.get_newoperations()
- self.short.append(ResOperation(rop.JUMP, short_jumpargs, None,
descr=start_label.getdescr()))
- self.finalize_short_preamble(start_label)
-
- def close_loop(self, start_label, jumpop, patchguardop):
- virtual_state = self.initial_virtual_state
- short_inputargs = self.short[0].getarglist()
- inputargs = self.inputargs
- short_jumpargs = inputargs[:]
-
- # Construct jumpargs from the virtual state
- original_jumpargs = jumpop.getarglist()[:]
- jump_boxes = [self.get_box_replacement(arg) for arg in
- jumpop.getarglist()]
- try:
- 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 ' +
- 'VirtualState at the beginning of the peeled ' +
- 'loop')
- jumpop.initarglist(jumpargs)
-
- # Inline the short preamble at the end of the loop
- jmp_to_short_args = virtual_state.make_inputargs(jump_boxes,
- self.optimizer,
- keyboxes=True)
- assert len(short_inputargs) == len(jmp_to_short_args)
- args = {}
- for i in range(len(short_inputargs)):
- if short_inputargs[i] in args:
- if args[short_inputargs[i]] != jmp_to_short_args[i]:
- raise InvalidLoop('The short preamble wants the ' +
- 'same box passed to multiple of its ' +
- 'inputargs, but the jump at the ' +
- 'end of this bridge does not do that.')
-
- args[short_inputargs[i]] = jmp_to_short_args[i]
- self.memo = Memo(short_inputargs, jmp_to_short_args)
- self._inline_short_preamble(self.short, self.memo,
- patchguardop,
- self.short_boxes.assumed_classes)
-
- # Import boxes produced in the preamble but used in the loop
- newoperations = self.optimizer.get_newoperations()
- self.boxes_created_this_iteration = {}
- i = j = 0
- while i < len(newoperations) or j < len(jumpargs):
- if i == len(newoperations):
- while j < len(jumpargs):
- a = jumpargs[j]
- #if self.optimizer.loop.logops:
- # debug_print('J: ' +
self.optimizer.loop.logops.repr_of_arg(a))
- self.import_box(a, inputargs, short_jumpargs, jumpargs)
- j += 1
- else:
- self._import_op(newoperations[i], inputargs, short_jumpargs,
jumpargs)
- i += 1
- newoperations = self.optimizer.get_newoperations()
-
- jumpop.initarglist(jumpargs)
- self.optimizer.send_extra_operation(jumpop)
- self.short.append(ResOperation(rop.JUMP, short_jumpargs,
descr=jumpop.getdescr()))
-
- # Verify that the virtual state at the end of the loop is one
- # that is compatible with the virtual state at the start of the loop
- final_virtual_state = self.get_virtual_state(original_jumpargs)
- #debug_start('jit-log-virtualstate')
- #virtual_state.debug_print('Closed loop with ')
- bad = {}
- if not virtual_state.generalization_of(final_virtual_state, bad,
- cpu=self.optimizer.cpu):
- # We ended up with a virtual state that is not compatible
- # and we are thus unable to jump to the start of the loop
- #final_virtual_state.debug_print("Bad virtual state at end of
loop, ",
- # bad)
- #debug_stop('jit-log-virtualstate')
- raise InvalidLoop('The virtual state at the end of the peeled ' +
- 'loop is not compatible with the virtual ' +
- 'state at the start of the loop which makes ' +
- 'it impossible to close the loop')
-
- #debug_stop('jit-log-virtualstate')
-
- maxguards =
self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards
- if self.optimizer.emitted_guards > maxguards:
- target_token = jumpop.getdescr()
- assert isinstance(target_token, TargetToken)
- target_token.targeting_jitcell_token.retraced_count = sys.maxint
-
- self.finalize_short_preamble(start_label)
-
- def finalize_short_preamble(self, start_label):
- short = self.short
- assert short[-1].getopnum() == rop.JUMP
- target_token = start_label.getdescr()
- assert isinstance(target_token, TargetToken)
- # Turn guards into conditional jumps to the preamble
- #for i in range(len(short)):
- # op = short[i]
- # if op.is_guard():
- #op = op.clone(self.memo)
- #op.is_source_op = True
- # op.setfailargs(None)
- # op.setdescr(None) # will be set to a proper descr when the
preamble is used
- # short[i] = op
-
- # Clone ops and boxes to get private versions and
- return
- short_inputargs = short[0].getarglist()
- boxmap = {}
- newargs = [None] * len(short_inputargs)
- for i in range(len(short_inputargs)):
- a = short_inputargs[i]
- if a in boxmap:
- newargs[i] = boxmap[a]
- else:
- newargs[i] = a.clone_input_arg()
- boxmap[a] = newargs[i]
- #memo = Memo(short_inputargs, newargs)
- #target_token.assumed_classes = {}
- for i in range(len(short)):
- op = short[i]
- newop = op.clone(memo)
- if newop.is_guard():
- newop.setfailargs(None)
- newop.setdescr(None)
- if op in self.short_boxes.assumed_classes:
- target_token.assumed_classes[newop] =
self.short_boxes.assumed_classes[op]
- short[i] = newop
-
- # Forget the values to allow them to be freed
- for box in short[0].getarglist():
- box.forget_value()
- for op in short:
- op.forget_value()
- target_token.short_preamble = self.short
-
- def ensure_short_op_emitted(self, op, optimizer, seen):
- if op is None:
- return
- if op.type != 'v' and op in seen:
- return
- for a in op.getarglist():
- if not isinstance(a, Const) and not isinstance(a,
AbstractInputArg) and a not in seen:
- self.ensure_short_op_emitted(self.short_boxes.producer(a),
optimizer,
- seen)
-
- #if self.optimizer.loop.logops:
- # debug_print(' Emitting short op: ' +
- # self.optimizer.loop.logops.repr_of_resop(op))
-
- optimizer.send_extra_operation(op)
- seen[op] = None
- if op.is_ovf():
- guard = ResOperation(rop.GUARD_NO_OVERFLOW, [])
- optimizer.send_extra_operation(guard)
- if self.is_call_pure_with_exception(op): # only for MemoryError
- guard = ResOperation(rop.GUARD_NO_EXCEPTION, [], None)
- optimizer.send_extra_operation(guard)
-
def is_call_pure_with_exception(self, op):
if op.is_call_pure():
effectinfo = op.getdescr().get_extra_info()
@@ -603,177 +216,6 @@
return effectinfo.extraeffect !=
effectinfo.EF_ELIDABLE_CANNOT_RAISE
return False
- def add_op_to_short(self, op, emit=True, guards_needed=False):
- if op is None:
- return None
- if op is not None and op in self.short_seen:
- if emit and self.memo:
- return self.memo.get(op, op)
- else:
- return None
-
- for a in op.getarglist():
- if not isinstance(a, Const) and a not in self.short_seen:
- self.add_op_to_short(self.short_boxes.producer(a), emit,
guards_needed)
- 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):
- value_guards = self.getvalue(op).make_guards(op)
- else:
- value_guards = []
-
- self.short.append(op)
- self.short_seen[op] = None
- if emit and self.short_inliner:
- newop = self.short_inliner.inline_op(op)
- self.optimizer.send_extra_operation(newop)
- else:
- newop = None
-
- if op.is_ovf():
- # FIXME: ensure that GUARD_OVERFLOW:ed ops not end up here
- guard = ResOperation(rop.GUARD_NO_OVERFLOW, [], None)
- self.add_op_to_short(guard, emit, guards_needed)
- if self.is_call_pure_with_exception(op): # only for MemoryError
- guard = ResOperation(rop.GUARD_NO_EXCEPTION, [], None)
- self.add_op_to_short(guard, emit, guards_needed)
- for guard in value_guards:
- self.add_op_to_short(guard, emit, guards_needed)
-
- if newop:
- return newop.result
- return None
-
- def import_box(self, box, inputargs, short_jumpargs, jumpargs):
- if isinstance(box, Const) or box in inputargs:
- return
- if box in self.boxes_created_this_iteration:
- return
-
- short_op = self.short_boxes.producer(box)
- newresult = self.add_op_to_short(short_op)
-
- short_jumpargs.append(short_op)
- inputargs.append(box)
- box = newresult
- if box in self.optimizer.values:
- box = self.optimizer.values[box].force_box(self.optimizer)
- jumpargs.append(box)
-
-
- def _import_op(self, op, inputargs, short_jumpargs, jumpargs):
- self.boxes_created_this_iteration[op] = None
- args = op.getarglist()
- if op.is_guard():
- args = args + op.getfailargs()
-
- for a in args:
- self.import_box(a, inputargs, short_jumpargs, jumpargs)
-
- def jump_to_already_compiled_trace(self, jumpop, patchguardop):
- jumpop = jumpop.copy_and_change(jumpop.getopnum())
- assert jumpop.getopnum() == rop.JUMP
- cell_token = jumpop.getdescr()
-
- assert isinstance(cell_token, JitCellToken)
- if not cell_token.target_tokens:
- return False
-
- if not self.inline_short_preamble:
- assert cell_token.target_tokens[0].virtual_state is None
- jumpop.setdescr(cell_token.target_tokens[0])
- self.optimizer.send_extra_operation(jumpop)
- return True
-
- args = jumpop.getarglist()
- virtual_state = self.get_virtual_state(args)
- values = [self.getvalue(arg)
- for arg in jumpop.getarglist()]
- debug_start('jit-log-virtualstate')
- virtual_state.debug_print("Looking for ",
metainterp_sd=self.optimizer.metainterp_sd)
-
- for target in cell_token.target_tokens:
- if not target.virtual_state:
- continue
- extra_guards = []
-
- try:
- cpu = self.optimizer.cpu
- state = target.virtual_state.generate_guards(virtual_state,
- values,
- cpu)
-
- extra_guards = state.extra_guards
- if extra_guards:
- debugmsg = 'Guarded to match '
- else:
- debugmsg = 'Matched '
- except VirtualStatesCantMatch, e:
- debugmsg = 'Did not match:\n%s\n' % (e.msg, )
- target.virtual_state.debug_print(debugmsg, e.state.bad,
metainterp_sd=self.optimizer.metainterp_sd)
- continue
-
- assert patchguardop is not None or (extra_guards == [] and
len(target.short_preamble) == 1)
-
- target.virtual_state.debug_print(debugmsg, {})
-
- debug_stop('jit-log-virtualstate')
-
- args = target.virtual_state.make_inputargs(values, self.optimizer,
- keyboxes=True)
- short_inputargs = target.short_preamble[0].getarglist()
- memo = Memo(short_inputargs, args)
-
- for guard in extra_guards:
- if guard.is_guard():
- assert isinstance(patchguardop, GuardResOp)
- assert isinstance(guard, GuardResOp)
- guard.rd_snapshot = patchguardop.rd_snapshot
- guard.rd_frame_info_list = patchguardop.rd_frame_info_list
- guard.setdescr(compile.ResumeAtPositionDescr())
- self.optimizer.send_extra_operation(guard)
-
- try:
- # NB: the short_preamble ends with a jump
- self._inline_short_preamble(target.short_preamble, memo,
- patchguardop,
- target.assumed_classes)
- except InvalidLoop:
- #debug_print("Inlining failed unexpectedly",
- # "jumping to preamble instead")
- assert cell_token.target_tokens[0].virtual_state is None
- jumpop.setdescr(cell_token.target_tokens[0])
- self.optimizer.send_extra_operation(jumpop)
- return True
- debug_stop('jit-log-virtualstate')
- return False
-
- 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 = shop.clone(memo)
- 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")
- assert isinstance(newop, GuardResOp)
- assert isinstance(patchguardop, GuardResOp)
- newop.rd_snapshot = patchguardop.rd_snapshot
- newop.rd_frame_info_list = patchguardop.rd_frame_info_list
- newop.setdescr(compile.ResumeAtPositionDescr())
- self.optimizer.send_extra_operation(newop)
- 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 ' +
- 'does not mach the class ' +
- 'it has at the start of the target loop')
- i += 1
-
class UnrollInfo(LoopInfo):
""" A state after optimizing the peeled loop, contains the following:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit