Example #1
0
 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
Example #2
0
    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
Example #3
0
 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
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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
Example #7
0
 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
Example #8
0
 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
Example #9
0
 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