コード例 #1
0
    def import_state(self, targetargs, exported_state):
        # the mapping between input args (from old label) and what we need
        # to actually emit. Update the info
        assert (len(exported_state.next_iteration_args) ==
                len(targetargs))
        self._check_no_forwarding([targetargs])
        exported_state._check_no_forwarding()
        for i, target in enumerate(exported_state.next_iteration_args):
            source = targetargs[i]
            assert source is not target
            source.set_forwarded(target)
            info = exported_state.exported_infos.get(target, None)
            if info is not None:
                self.optimizer.setinfo_from_preamble(source, info,
                                            exported_state.exported_infos)
        # import the optimizer state, starting from boxes that can be produced
        # by short preamble
        label_args = exported_state.virtual_state.make_inputargs(
            targetargs, self.optimizer)

        self.short_preamble_producer = ShortPreambleBuilder(
            label_args, exported_state.short_boxes,
            exported_state.short_inputargs, exported_state.exported_infos,
            self.optimizer)

        for produced_op in exported_state.short_boxes:
            produced_op.produce_op(self, exported_state.exported_infos)

        return label_args
コード例 #2
0
ファイル: test_unroll.py プロジェクト: soIu/rpython
 def test_setfield_forced_virtual(self):
     loop = """
     [p1, p2]
     i1 = getfield_gc_i(p1, descr=valuedescr)
     setfield_gc(p2, i1, descr=valuedescr)
     p3 = new_with_vtable(descr=nodesize)
     jump(p2, p3)
     """
     es, loop, preamble = self.optimize(loop)
     sb = ShortPreambleBuilder(loop.inputargs, es.short_boxes,
                               es.short_inputargs, es.exported_infos)
     short_boxes = [
         box for box in es.short_boxes
         if not isinstance(box.short_op, ShortInputArg)
     ]
     op = short_boxes[0].short_op.res
     pop = sb.use_box(op, short_boxes[0].preamble_op, FakeOptimizer())
     sb.add_preamble_op(PreambleOp(op, pop, False))
     exp_short = """
     [p0, p1]
     guard_nonnull(p0) []
     guard_subclass(p0, ConstClass(node_vtable)) []
     i1 = getfield_gc_i(p0, descr=valuedescr)
     jump(i1)
     """
     self.compare_short(sb.build_short_preamble(), exp_short)
コード例 #3
0
ファイル: test_unroll.py プロジェクト: soIu/rpython
 def test_short_boxes_heapcache(self):
     loop = """
     [p0, i1]
     i0 = getfield_gc_i(p0, descr=valuedescr)
     jump(p0, i1)
     """
     es, loop, preamble = self.optimize(loop)
     op = preamble.operations[0]
     short_boxes = [
         box for box in es.short_boxes
         if not isinstance(box.short_op, ShortInputArg)
     ]
     assert len(short_boxes) == 1
     assert short_boxes[0].short_op.res is op
     sb = ShortPreambleBuilder(loop.inputargs, es.short_boxes,
                               es.short_inputargs, es.exported_infos,
                               FakeOptimizer())
     op = preamble.operations[0]
     short_op = sb.use_box(op, short_boxes[0].preamble_op, FakeOptimizer())
     sb.add_preamble_op(PreambleOp(op, short_op, False))
     exp_short = """
     [p0, i1]
     guard_nonnull(p0) []
     guard_subclass(p0, ConstClass(node_vtable)) []
     i0 = getfield_gc_i(p0, descr=valuedescr)
     jump(i0)
     """
     self.compare_short(sb.build_short_preamble(), exp_short)
コード例 #4
0
ファイル: test_unroll.py プロジェクト: soIu/rpython
 def test_simple(self):
     loop = """
     [i0]
     i1 = int_add(i0, 1)
     guard_value(i1, 1) []
     jump(i1)
     """
     es, loop, preamble = self.optimize(loop)
     vs = es.virtual_state
     assert isinstance(vs.state[0], NotVirtualStateInfo)
     # the virtual state is constant, so we don't need to have it in
     # inputargs
     assert vs.make_inputargs([1], FakeOptimizer()) == []
     assert vs.state[0].level == LEVEL_CONSTANT
     # we have exported values for i1, which happens to be an inputarg
     sb = ShortPreambleBuilder([], es.short_boxes, es.short_inputargs,
                               es.exported_infos)
     sp = sb.build_short_preamble()
     exp = """
     []
     jump()
     """
     self.compare_short(sp, exp)