Example #1
0
    def export_state(self, targetop):
        original_jump_args = targetop.getarglist()
        jump_args = [self.getvalue(a).get_key_box() for a in original_jump_args]

        assert self.optimizer.loop.resume_at_jump_descr
        resume_at_jump_descr = self.optimizer.loop.resume_at_jump_descr.clone_if_mutable()
        assert isinstance(resume_at_jump_descr, ResumeGuardDescr)
        resume_at_jump_descr.rd_snapshot = self.fix_snapshot(jump_args, resume_at_jump_descr.rd_snapshot)

        modifier = VirtualStateAdder(self.optimizer)
        virtual_state = modifier.get_virtual_state(jump_args)

        values = [self.getvalue(arg) for arg in jump_args]
        inputargs = virtual_state.make_inputargs(values, self.optimizer)
        short_inputargs = virtual_state.make_inputargs(values, self.optimizer, keyboxes=True)

        if self.boxes_created_this_iteration is not None:
            for box in self.inputargs:
                self.boxes_created_this_iteration[box] = None

        short_boxes = ShortBoxes(self.optimizer, inputargs,
                                 self.boxes_created_this_iteration)

        self.optimizer.clear_newoperations()
        for i in range(len(original_jump_args)):
            if values[i].is_virtual():
                values[i].force_box(self.optimizer)
            if original_jump_args[i] is not jump_args[i]:
                op = ResOperation(rop.SAME_AS, [jump_args[i]], original_jump_args[i])
                self.optimizer.emit_operation(op)
        inputarg_setup_ops = self.optimizer.get_newoperations()

        target_token = targetop.getdescr()
        assert isinstance(target_token, TargetToken)
        targetop.initarglist(inputargs)
        target_token.virtual_state = virtual_state
        target_token.short_preamble = [ResOperation(rop.LABEL, short_inputargs, None)]
        target_token.resume_at_jump_descr = resume_at_jump_descr

        exported_values = {}
        for box in inputargs:
            exported_values[box] = self.optimizer.getvalue(box)
        for op in short_boxes.operations():
            if op and op.result:
                box = op.result
                exported_values[box] = self.optimizer.getvalue(box)

        target_token.exported_state = ExportedState(short_boxes, inputarg_setup_ops,
                                                    exported_values)
Example #2
0
 def test_short_box_duplication_direct(self):
     class Optimizer(FakeOptimizer):
         def produce_potential_short_preamble_ops(_self, sb):
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [self.p1], self.i1))
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [self.p2], self.i1))
     sb = ShortBoxes(Optimizer(), [self.p1, self.p2])
     assert len(sb.short_boxes) == 4
     assert self.i1 in sb.short_boxes
     assert sum([op.result is self.i1 for op in sb.short_boxes.values() if op]) == 1
Example #3
0
 def test_dont_duplicate_potential_boxes(self):
     class Optimizer(FakeOptimizer):
         def produce_potential_short_preamble_ops(_self, sb):
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [self.p1], self.i1))
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [BoxPtr()], self.i1))
             sb.add_potential(ResOperation(rop.INT_NEG, [self.i1], self.i2))
             sb.add_potential(ResOperation(rop.INT_ADD, [ConstInt(7), self.i2],
                                           self.i3))
     sb = ShortBoxes(Optimizer(), [self.p1, self.p2])
     assert len(sb.short_boxes) == 5
Example #4
0
    def export_state(self, targetop):
        original_jump_args = targetop.getarglist()
        jump_args = [self.getvalue(a).get_key_box() for a in original_jump_args]

        virtual_state = self.get_virtual_state(jump_args)

        values = [self.getvalue(arg) for arg in jump_args]
        inputargs = virtual_state.make_inputargs(values, self.optimizer)
        short_inputargs = virtual_state.make_inputargs(values, self.optimizer, keyboxes=True)

        if self.boxes_created_this_iteration is not None:
            for box in self.inputargs:
                self.boxes_created_this_iteration[box] = None

        short_boxes = ShortBoxes(self.optimizer, inputargs,
                                 self.boxes_created_this_iteration)

        self.optimizer.clear_newoperations()
        for i in range(len(original_jump_args)):
            srcbox = jump_args[i]
            if values[i].is_virtual():
                srcbox = values[i].force_box(self.optimizer)
            if original_jump_args[i] is not srcbox:
                op = ResOperation(rop.SAME_AS, [srcbox], original_jump_args[i])
                self.optimizer.emit_operation(op)
        inputarg_setup_ops = self.optimizer.get_newoperations()

        target_token = targetop.getdescr()
        assert isinstance(target_token, TargetToken)
        targetop.initarglist(inputargs)
        target_token.virtual_state = virtual_state
        target_token.short_preamble = [ResOperation(rop.LABEL, short_inputargs, None)]

        exported_values = {}
        for box in inputargs:
            exported_values[box] = self.optimizer.getvalue(box)
        for op in short_boxes.operations():
            if op and op.result:
                box = op.result
                exported_values[box] = self.optimizer.getvalue(box)

        target_token.exported_state = ExportedState(short_boxes, inputarg_setup_ops,
                                                    exported_values)
Example #5
0
    def export_state(self, targetop):
        original_jump_args = targetop.getarglist()
        jump_args = [self.getvalue(a).get_key_box() for a in original_jump_args]

        virtual_state = self.get_virtual_state(jump_args)

        values = [self.getvalue(arg) for arg in jump_args]
        inputargs = virtual_state.make_inputargs(values, self.optimizer)
        short_inputargs = virtual_state.make_inputargs(values, self.optimizer, keyboxes=True)

        if self.boxes_created_this_iteration is not None:
            for box in self.inputargs:
                self.boxes_created_this_iteration[box] = None

        short_boxes = ShortBoxes(self.optimizer, inputargs)

        self.optimizer.clear_newoperations()
        for i in range(len(original_jump_args)):
            srcbox = jump_args[i]
            if values[i].is_virtual():
                srcbox = values[i].force_box(self.optimizer)
            if original_jump_args[i] is not srcbox:
                op = ResOperation(rop.SAME_AS, [srcbox], original_jump_args[i])
                self.optimizer.emit_operation(op)
        inputarg_setup_ops = self.optimizer.get_newoperations()

        target_token = targetop.getdescr()
        assert isinstance(target_token, TargetToken)
        targetop.initarglist(inputargs)
        target_token.virtual_state = virtual_state
        target_token.short_preamble = [ResOperation(rop.LABEL, short_inputargs, None)]

        exported_values = {}
        for box in inputargs:
            exported_values[box] = self.optimizer.getvalue(box)
        for op in short_boxes.operations():
            if op and op.result:
                box = op.result
                exported_values[box] = self.optimizer.getvalue(box)

        return ExportedState(short_boxes, inputarg_setup_ops, exported_values)
Example #6
0
 def test_prioritize1(self):
     class Optimizer(FakeOptimizer):
         def produce_potential_short_preamble_ops(_self, sb):
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [self.p1], self.i1))
             sb.add_potential(ResOperation(rop.GETFIELD_GC, [self.p2], self.i1))
             sb.add_potential(ResOperation(rop.INT_NEG, [self.i1], self.i2))
     sb = ShortBoxes(Optimizer(), [self.p1, self.p2])
     assert len(sb.short_boxes.values()) == 5
     int_neg = [op for op in sb.short_boxes.values()
                if op and op.getopnum() == rop.INT_NEG]
     assert len(int_neg) == 1
     int_neg = int_neg[0]
     getfield = [op for op in sb.short_boxes.values()
                 if op and op.result == int_neg.getarg(0)]
     assert len(getfield) == 1
     assert getfield[0].getarg(0) in [self.p1, self.p2]