File: test_min_max.py

package info (click to toggle)
pypy3 7.3.19%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • 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 (89 lines) | stat: -rw-r--r-- 2,980 bytes parent folder | download | duplicates (4)
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
from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC


class TestMinMax(BaseTestPyPyC):
    def test_min_max(self):
        def main():
            i=0
            sa=0
            while i < 300:
                sa+=min(max(i, 3000), 4000)
                i+=1
            return sa
        log = self.run(main, [])
        assert log.result == 300*3000
        loop, = log.loops_by_filename(self.filepath)
        assert loop.match("""
            i7 = int_lt(i4, 300)
            guard_true(i7, descr=...)
            guard_not_invalidated(descr=...)
            i9 = int_add_ovf(i5, 3000)
            guard_no_overflow(descr=...)
            i11 = int_add(i4, 1)
            --TICK--
            jump(..., descr=...)
        """)

    def test_silly_max(self):
        def main():
            i = 13
            sa = 0
            while i < 30000:
                lst = list(range(i % 1000 + 2))
                sa += max(*lst)  # ID: callmax
                i += 1
            return sa
        log = self.run(main, [])
        assert log.result == main()
        loop, = log.loops_by_filename(self.filepath)
        assert loop.match_by_id('callmax', """
            ...
            p76 = call_may_force_r(_, _, _, _, descr=...)
            ...
        """)
        
        #----- the following logic used to check the content of the assembly
        #----- generated for the loop in max(), but now we no longer produce
        #----- any custom assembly in this case.  It used to say
        #----- 'call_assembler_r' above, and now it says 'call_may_force_r'.
        #loop2 = log.loops[0]
        #loop2.match('''
        #...
        #label(..., descr=...)
        #...
        #label(..., descr=...)
        #guard_not_invalidated?
        #i17 = int_ge(i11, i7)
        #guard_false(i17, descr=...)
        #p18 = getarrayitem_gc_r(p5, i11, descr=...)
        #i19 = int_add(i11, 1)
        #setfield_gc(p2, i19, descr=...)
        #guard_nonnull_class(p18, ConstClass(W_IntObject), descr=...)
        #i20 = getfield_gc_i(p18, descr=...)
        #i21 = int_gt(i20, i14)
        #guard_true(i21, descr=...)
        #jump(..., descr=...)
        #''')
        ## XXX could be "guard_class(p18)" instead; we lost somewhere
        ## the information that it cannot be null.

    def test_iter_max(self):
        def main():
            i = 2
            sa = 0
            while i < 300:
                lst = range(i)
                sa += max(lst) # ID: max
                i += 1
            return sa
        log = self.run(main, [])
        assert log.result == main()
        loop, = log.loops_by_filename(self.filepath)
        # We dont want too many guards, but a residual call to min_max_loop
        guards = [n for n in log.opnames(loop.ops_by_id("max")) if n.startswith('guard')]
        assert len(guards) < 20
        assert loop.match("""
            ...
            p76 = call_assembler_r(..., descr=...)
            ...
        """)