File: test_optimizebridge.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 212,236 kB
  • sloc: python: 2,098,316; ansic: 540,565; sh: 21,462; asm: 14,419; cpp: 4,451; makefile: 4,209; objc: 761; xml: 530; exp: 499; javascript: 314; pascal: 244; lisp: 45; csh: 12; awk: 4
file content (120 lines) | stat: -rw-r--r-- 4,584 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from rpython.jit.metainterp.optimizeopt.test.test_util import (
    BaseTest, convert_old_style_to_targets, FakeJitDriverStaticData)
from rpython.jit.metainterp import compile
from rpython.jit.tool import oparser
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.metainterp.history import TargetToken

class TestOptimizeBridge(BaseTest):
    enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"

    def optimize(self, ops, bridge_ops, expected, expected_loop=None,
                 inline_short_preamble=True, jump_values=None,
                 bridge_values=None):
        loop = self.parse(ops)
        info = self.unroll_and_optimize(loop, None, jump_values=jump_values)
        jitcell_token = compile.make_jitcell_token(None)
        mid_label_descr = TargetToken(jitcell_token)
        mid_label_descr.short_preamble = info.short_preamble
        mid_label_descr.virtual_state = info.virtual_state
        start_label_descr = TargetToken(jitcell_token)
        jitcell_token.target_tokens = [mid_label_descr, start_label_descr]
        loop.operations[0].setdescr(mid_label_descr)
        loop.operations[-1].setdescr(mid_label_descr)
        info.preamble.operations[0].setdescr(start_label_descr)
        guards = [op for op in loop.operations if op.is_guard()]
        assert len(guards) == 1, "more than one guard in the loop"
        bridge = self.parse(bridge_ops)
        bridge.operations[-1].setdescr(jitcell_token)
        self.add_guard_future_condition(bridge)
        trace = oparser.convert_loop_to_trace(bridge, self.metainterp_sd)
        data = compile.BridgeCompileData(
            trace,
            self.convert_values(bridge.operations[-1].getarglist(), bridge_values),
            None, enable_opts=self.enable_opts,
            inline_short_preamble=inline_short_preamble)
        jitdriver_sd = FakeJitDriverStaticData()
        bridge_info, ops = data.optimize_trace(self.metainterp_sd, jitdriver_sd, {})
        loop.check_consistency(check_descr=False)
        info.preamble.check_consistency(check_descr=False)
        bridge.operations = ([ResOperation(rop.LABEL, bridge_info.inputargs)] +
                             ops)
        bridge.inputargs = bridge_info.inputargs
        bridge.check_consistency(check_descr=False)
        expected = self.parse(expected)
        self.assert_equal(bridge, convert_old_style_to_targets(expected,
                                                               jump=True))
        jump_bridge = bridge.operations[-1]
        jump_d = jump_bridge.getdescr()
        jump_args = jump_bridge.getarglist()
        if loop.operations[0].getdescr() is jump_d:
            # jump to loop
            label_args = loop.operations[0].getarglist()
        else:
            assert info.preamble.operations[0].getdescr() is jump_d
            label_args = info.preamble.operations[0].getarglist()
        assert len(jump_args) == len(label_args)
        for a, b in zip(jump_args, label_args):
            assert a.type == b.type

    def test_simple(self):
        loop = """
        [i0]
        i1 = int_add(i0, 1)
        i2 = int_is_true(i1)
        guard_true(i2) [i1, i2]
        jump(i1)
        """
        bridge = """
        [i0, i1]
        jump(i1)
        """
        expected = """
        [i0, i1]
        jump(i1)
        """
        self.optimize(loop, bridge, expected)

    def test_minimal_short_preamble(self):
        loop = """
        [i0, i1, i3]
        i2 = int_add(i0, 1)
        i4 = int_add(i3, i2)
        i5 = int_is_true(i4)
        guard_true(i5) [i2, i4, i5]
        jump(i0, i1, i4)
        """
        bridge = """
        [i0, i1, i2]
        jump(i0, i1, i2)
        """
        expected = """
        [i0, i1, i2]
        i3 = int_add(i0, 1)
        jump(i0, i1, i2, i3)
        """
        self.optimize(loop, bridge, expected)

    def test_virtual_state_in_bridge(self):
        loop = """
        [i0, p1]
        p0 = new_with_vtable(descr=simpledescr)
        setfield_gc(p0, i0, descr=simplevalue)
        i3 = int_is_true(i0)
        guard_true(i3) [p0]
        i1 = int_add(i0, 1)
        jump(i1, p0)
        """
        bridge = """
        [p0]
        p1 = new_with_vtable(descr=simpledescr)
        setfield_gc(p1, 3, descr=simplevalue)
        jump(1, p1)
        """
        expected = """
        [p0]
        jump(1, 3)
        """
        self.optimize(loop, bridge, expected,
                      jump_values=[None, self.simpleaddr],
                      bridge_values=[None, self.simpleaddr])