def store_final_boxes_in_guard(self, op, pendingfields): assert pendingfields is not None if op.getdescr() is not None: descr = op.getdescr() assert isinstance(descr, compile.ResumeGuardDescr) else: descr = compile.invent_fail_descr_for_op(op.getopnum(), self) op.setdescr(descr) assert isinstance(descr, compile.ResumeGuardDescr) assert isinstance(op, GuardResOp) modifier = resume.ResumeDataVirtualAdder(self, descr, op, self.resumedata_memo) try: newboxes = modifier.finish(self, pendingfields) if (newboxes is not None and len(newboxes) > self.metainterp_sd.options.failargs_limit): raise resume.TagOverflow except resume.TagOverflow: raise compile.giveup() # check no duplicates #if not we_are_translated(): seen = {} for box in newboxes: if box is not None: assert box not in seen seen[box] = None descr.store_final_boxes(op, newboxes, self.metainterp_sd) # if op.getopnum() == rop.GUARD_VALUE: op = self._maybe_replace_guard_value(op, descr) return op
def parse_loop(self, ops, add_label=True): loop = self.parse(ops) loop.operations = filter( lambda op: op.getopnum() != rop.DEBUG_MERGE_POINT, loop.operations) token = JitCellToken() if add_label: label = ResOperation(rop.LABEL, loop.inputargs, descr=TargetToken(token)) else: label = loop.operations[0] label.setdescr(TargetToken(token)) jump = loop.operations[-1] loop = VectorLoop(label, loop.operations[0:-1], jump) loop.jump.setdescr(token) class Optimizer(object): metainterp_sd = FakeMetaInterpStaticData(self.cpu) jitdriver_sd = FakeJitDriverStaticData() opt = Optimizer() opt.jitdriver_sd.vec = True for op in loop.operations: if op.is_guard() and not op.getdescr(): descr = invent_fail_descr_for_op(op.getopnum(), opt) op.setdescr(descr) return loop
def store_final_boxes_in_guard(self, op, pendingfields): assert pendingfields is not None if op.getdescr() is not None: descr = op.getdescr() assert isinstance(descr, compile.ResumeGuardDescr) else: descr = compile.invent_fail_descr_for_op(op.getopnum(), self) op.setdescr(descr) assert isinstance(descr, compile.ResumeGuardDescr) assert isinstance(op, GuardResOp) modifier = resume.ResumeDataVirtualAdder(self, descr, op, self.trace, self.resumedata_memo) try: newboxes = modifier.finish(pendingfields) if (newboxes is not None and len(newboxes) > self.metainterp_sd.options.failargs_limit): raise resume.TagOverflow except resume.TagOverflow: raise compile.giveup() # check no duplicates #if not we_are_translated(): seen = {} for box in newboxes: if box is not None: assert box not in seen seen[box] = None descr.store_final_boxes(op, newboxes, self.metainterp_sd) # if op.getopnum() == rop.GUARD_VALUE: op = self._maybe_replace_guard_value(op, descr) return op
def _copy_resume_data_from(self, guard_op, last_guard_op): last_descr = last_guard_op.getdescr() descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self, last_descr) assert isinstance(last_descr, compile.ResumeGuardDescr) if not isinstance(descr, compile.ResumeGuardCopiedDescr): descr.copy_all_attributes_from(last_descr) guard_op.setdescr(descr) guard_op.setfailargs(last_guard_op.getfailargs()) descr.store_hash(self.metainterp_sd) assert isinstance(guard_op, GuardResOp) if guard_op.getopnum() == rop.GUARD_VALUE: guard_op = self._maybe_replace_guard_value(guard_op, descr) return guard_op
def _copy_resume_data_from(self, guard_op, last_guard_op): descr = compile.invent_fail_descr_for_op(guard_op.getopnum(), self, True) last_descr = last_guard_op.getdescr() assert isinstance(last_descr, compile.ResumeGuardDescr) if isinstance(descr, compile.ResumeGuardCopiedDescr): descr.prev = last_descr else: descr.copy_all_attributes_from(last_descr) guard_op.setdescr(descr) guard_op.setfailargs(last_guard_op.getfailargs()) descr.store_hash(self.metainterp_sd) assert isinstance(guard_op, GuardResOp) if guard_op.getopnum() == rop.GUARD_VALUE: guard_op = self._maybe_replace_guard_value(guard_op, descr) return guard_op
def store_final_boxes_in_guard(self, op, pendingfields): assert pendingfields is not None if op.getdescr() is not None: descr = op.getdescr() assert isinstance(descr, compile.ResumeAtPositionDescr) else: descr = compile.invent_fail_descr_for_op(op.getopnum(), self) op.setdescr(descr) assert isinstance(descr, compile.ResumeGuardDescr) assert isinstance(op, GuardResOp) modifier = resume.ResumeDataVirtualAdder(self, descr, op, self.resumedata_memo) try: newboxes = modifier.finish(self, pendingfields) if (newboxes is not None and len(newboxes) > self.metainterp_sd.options.failargs_limit): raise resume.TagOverflow except resume.TagOverflow: raise compile.giveup() # check no duplicates #if not we_are_translated(): seen = {} for box in newboxes: if box is not None: assert box not in seen seen[box] = None descr.store_final_boxes(op, newboxes, self.metainterp_sd) # if op.getopnum() == rop.GUARD_VALUE: if op.getarg(0).type == 'i': b = self.getintbound(op.getarg(0)) if b.is_bool(): # Hack: turn guard_value(bool) into guard_true/guard_false. # This is done after the operation is emitted to let # store_final_boxes_in_guard set the guard_opnum field of # the descr to the original rop.GUARD_VALUE. constvalue = op.getarg(1).getint() if constvalue == 0: opnum = rop.GUARD_FALSE elif constvalue == 1: opnum = rop.GUARD_TRUE else: raise AssertionError("uh?") newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr) return newop # a real GUARD_VALUE. Make it use one counter per value. descr.make_a_counter_per_value(op) return op
def store_final_boxes_in_guard(self, op, pendingfields): assert pendingfields is not None if op.getdescr() is not None: descr = op.getdescr() assert isinstance(descr, compile.ResumeAtPositionDescr) else: descr = compile.invent_fail_descr_for_op(op.getopnum(), self) op.setdescr(descr) assert isinstance(descr, compile.ResumeGuardDescr) assert isinstance(op, GuardResOp) modifier = resume.ResumeDataVirtualAdder(descr, op, self.resumedata_memo) try: newboxes = modifier.finish(self, pendingfields) if len(newboxes) > self.metainterp_sd.options.failargs_limit: raise resume.TagOverflow except resume.TagOverflow: raise compile.giveup() descr.store_final_boxes(op, newboxes, self.metainterp_sd) # if op.getopnum() == rop.GUARD_VALUE: if self.getvalue(op.getarg(0)) in self.bool_boxes: # Hack: turn guard_value(bool) into guard_true/guard_false. # This is done after the operation is emitted to let # store_final_boxes_in_guard set the guard_opnum field of the # descr to the original rop.GUARD_VALUE. constvalue = op.getarg(1).getint() if constvalue == 0: opnum = rop.GUARD_FALSE elif constvalue == 1: opnum = rop.GUARD_TRUE else: raise AssertionError("uh?") newop = ResOperation(opnum, [op.getarg(0)], op.result, descr) newop.setfailargs(op.getfailargs()) return newop else: # a real GUARD_VALUE. Make it use one counter per value. descr.make_a_counter_per_value(op) return op
def parse_loop(self, ops, add_label=True): loop = self.parse(ops, postprocess=self.postprocess) loop.operations = filter(lambda op: op.getopnum() != rop.DEBUG_MERGE_POINT, loop.operations) token = JitCellToken() if add_label: label = ResOperation(rop.LABEL, loop.inputargs, descr=TargetToken(token)) else: label = loop.operations[0] label.setdescr(TargetToken(token)) jump = loop.operations[-1] loop = VectorLoop(label, loop.operations[0:-1], jump) loop.jump.setdescr(token) class Optimizer(object): metainterp_sd = FakeMetaInterpStaticData(self.cpu) jitdriver_sd = FakeJitDriverStaticData() opt = Optimizer() opt.jitdriver_sd.vec = True for op in loop.operations: if op.is_guard() and not op.getdescr(): descr = invent_fail_descr_for_op(op.getopnum(), opt) op.setdescr(descr) return loop