jit/metainterp/test/test_warmspot.py::TestLLWarmspot::()::test_loop_header
self = <rpython.jit.metainterp.test.test_warmspot.TestLLWarmspot instance at 0x7f3a7b55f140>
def test_loop_header(self):
# artificial test: we enter into the JIT only when can_enter_jit()
# is seen, but we close a loop in the JIT much more quickly
# because of loop_header().
mydriver = JitDriver(reds = ['n', 'm'], greens = [])
def f(m):
n = 0
while True:
mydriver.jit_merge_point(n=n, m=m)
if n > m:
m -= 1
if m < 0:
return n
n = 0
mydriver.can_enter_jit(n=n, m=m)
else:
n += 1
mydriver.loop_header()
assert f(15) == 1
res = self.meta_interp(f, [15], backendopt=True)
assert res == 1
> self.check_resops(int_add=2) # I get 13 without the loop_header()
jit/metainterp/test/test_warmspot.py:189:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
jit/metainterp/test/support.py:199: in check_resops
get_stats().check_resops(expected=expected, **check)
jit/metainterp/history.py:969: in check_resops
return self._check_insns(insns, expected, check)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <rpython.jit.metainterp.history.Stats object at 0x7f3a7b51cbd0>
insns = {'debug_merge_point': 5, 'guard_false': 3, 'guard_true': 1, 'int_add': 3, ...}
expected = None, check = {'int_add': 2}
def _check_insns(self, insns, expected, check):
if expected is not None:
insns.pop('debug_merge_point', None)
insns.pop('enter_portal_frame', None)
insns.pop('leave_portal_frame', None)
insns.pop('label', None)
assert insns == expected
for insn, expected_count in check.items():
getattr(rop, insn.upper()) # fails if 'rop.INSN' does not exist
found = insns.get(insn, 0)
assert found == expected_count, (
> "found %d %r, expected %d" % (found, insn, expected_count))
E AssertionError: found 3 'int_add', expected 2
jit/metainterp/history.py:982: AssertionError
---------- Captured stdout call ----------
bh: goto_if_not_int_gt [13, 12, 43, 21] -> 21
bh: int_sub [12, 1] -> 11
bh: live [26] -> 28
bh: goto_if_not_int_lt [11, 0, 35, 33] -> 35
bh: loop_header [0]
bh: int_copy [0] -> 0
bh: goto [0] -> 0
bh: live [1] -> 3
bh: jit_merge_point [<BHInterp <JitCode 'f'>>, 0, [], [], [], [0, 11], [], []] -> ContinueRunningNormally!
bh: goto_if_not_int_gt [1, 0, 43, 21] -> 21
bh: int_sub [0, 1] -> -1
bh: live [26] -> 28
bh: goto_if_not_int_lt [-1, 0, 35, 33] -> 33
bh: int_return [<BHInterp <JitCode 'f'>>, 1] -> LeaveFrame!
~~~ return value: 1
---------- Captured stderr call ----------
[rtyper] -=- specialized 8 blocks -=-
[rtyper] -=- specialized 4 more blocks -=-
[rtyper] -=- specialized 2 more blocks -=-
[rtyper] -=- specialized 7 more blocks -=-
[rtyper] -=- specialized 6 more blocks -=-
[rtyper] -=- specialized 17 more blocks -=-
[rtyper] -=- specialized 2 more blocks -=-
[backendopt:inlining] phase with threshold factor: 32.4
[backendopt:inlining] heuristic: rpython.translator.backendopt.inline.inlining_heuristic
[backendopt:inlining] inlined 1 callsites.
[backendopt:malloc] starting malloc removal
[backendopt:malloc] removed 0 simple mallocs in total
[backendopt:mergeifblocks] starting to merge if blocks
[rtyper] -=- specialized 3 more blocks -=-
[jitcodewriter:info] making JitCodes...
[jitcodewriter:info] There are 1 JitCode instances.
[jitcodewriter:info] There are 3 -live- ops. Size of liveness is 4 bytes
[jitcodewriter] compute_bitstrings:
[jitcodewriter] 0 effectinfos:
[jitcodewriter] 0 descrs for arrays
[jitcodewriter] 0 descrs for fields
[jitcodewriter] 0 descrs for interiorfields
[c5fd550f558da80] {jit-tracing
JIT starting (llgraph)
(jitdriver: no get_printable_location)
(jitdriver: no get_printable_location)
[c5fd550f562d900] {jit-trace-done
trace length: 38
number operations: 8
total snapshots: 2
snapshot data: 24
snapshot array data: 14
bigint consts: 0 0
float consts: 0 0
ref consts: 0 0 1
descrs: 1
[c5fd550f5642500] jit-trace-done}
[c5fd550f5663a00] {jit-log-noopt
# Traced loop or bridge with 7 ops
[i0, i1]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i2 = int_gt(i0, i1)
guard_false(i2)
i4 = int_add(i0, 1)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
guard_future_condition()
jump(i4, i1, descr=<Loop-1>)
[c5fd550f5693800] jit-log-noopt}
[c5fd550f569c680] {jit-optimize
[c5fd550f56b0100] {jit-log-intbounds
[i0, i1]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i2 = int_gt(i0, i1)
guard_false(i2, descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f3a7b477f10>) [i0, i1]
i4 = int_add(i0, 1)
# i4 -> (?) IntBound.unbounded()
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
[c5fd550f580ea00] jit-log-intbounds}
[c5fd550f5855b00] {jit-log-exported-state
[i5, i6]
INP(i5 = int_add(i7, 1/ci))
INP(i6)
[c5fd550f5861c00] jit-log-exported-state}
[c5fd550f5867200] jit-optimize}
[c5fd550f5878180] {jit-optimize
[c5fd550f58dc900] {jit-log-intbounds
[i0, i1]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i4 = int_gt(i2, i3)
guard_false(i4, descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f3a7b477ed0>) [i2, i3]
i6 = int_add(i2, 1)
# i6 -> (?) IntBound.unbounded()
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
[c5fd550f5a2f500] jit-log-intbounds}
jump(i6, i3, descr=TargetToken(139889153137872))
[c5fd550f5a95d80] jit-optimize}
[c5fd550f5a9c900] {jit-log-short-preamble
[]
label(i8, i9)
jump()
[c5fd550f5aa7100] jit-log-short-preamble}
[c5fd550f5abb900] {jit-backend
[c5fd550f5ac7e80] {jit-log-compiling-loop
[i7, i6]
label(i7, i6, descr=TargetToken(139889153113424))
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i10 = int_gt(i7, i6)
guard_false(i10, descr=<Guard0x7f3a7b477f10>) [i7, i6]
i5 = int_add(i7, 1)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
label(i5, i6, descr=TargetToken(139889153137872))
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i12 = int_gt(i5, i6)
guard_false(i12, descr=<Guard0x7f3a7b477ed0>) [i5, i6]
i14 = int_add(i5, 1)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
jump(i14, i6, descr=TargetToken(139889153137872))
[c5fd550f5aeeb80] jit-log-compiling-loop}
[c5fd550f5afc400] {jit-mem-looptoken-alloc
allocating Loop # 1
[c5fd550f5b02400] jit-mem-looptoken-alloc}
[c5fd550f5b16a00] jit-backend}
compiled new loop
[c5fd550f5b1cd80] {jit-log-opt-loop
# Loop 1 ((jitdriver: no get_printable_location)) : loop with 13 ops
[i0, i1]
label(i0, i1, descr=TargetToken(139889153113424))
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i2 = int_gt(i0, i1)
guard_false(i2, descr=<Guard0x7f3a7b477f10>) [i0, i1]
i4 = int_add(i0, 1)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
label(i4, i1, descr=TargetToken(139889153137872))
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i5 = int_gt(i4, i1)
guard_false(i5, descr=<Guard0x7f3a7b477ed0>) [i4, i1]
i7 = int_add(i4, 1)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
jump(i7, i1, descr=TargetToken(139889153137872))
[c5fd550f5b49c80] jit-log-opt-loop}
ContinueRunningNormally
[c5fd550f5c23900] jit-tracing}
[c5fd550f5d3f600] {jit-tracing
(jitdriver: no get_printable_location)
[c5fd550f5e21b00] {jit-trace-done
trace length: 51
number operations: 11
total snapshots: 3
snapshot data: 36
snapshot array data: 20
bigint consts: 0 0
float consts: 0 0
ref consts: 0 0 1
descrs: 2
[c5fd550f5e36700] jit-trace-done}
[c5fd550f5e48800] {jit-log-noopt
# Traced loop or bridge with 9 ops
[i0, i1]
i2 = int_gt(i0, i1)
guard_true(i2)
i4 = int_sub(i1, 1)
i6 = int_lt(i4, 0)
guard_false(i6)
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
i8 = same_as_i(0)
guard_future_condition()
jump(i8, i4, descr=<Loop1>)
[c5fd550f5e7d780] jit-log-noopt}
[c5fd550f5e86880] {jit-optimize
[c5fd550f5ec7580] {jit-log-intbounds
[i0, i1]
i2 = int_gt(i0, i1)
guard_true(i2, descr=<rpython.jit.metainterp.compile.ResumeGuardDescr object at 0x7f3a7b48f510>) [i0, i1]
# i1: (? <= MAXINT - 1) IntBound(MININT, MAXINT - 1)
i4 = int_add(i1, -1)
i6 = int_lt(i4, 0)
guard_false(i6, descr=<rpython.jit.metainterp.compile.ResumeGuardCopiedDescr object at 0x7f3a7b477850>) [i0, i1]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
[c5fd550f60e3000] jit-log-intbounds}
# i4: (0 <= 0b0?...?) IntBound.nonnegative()
jump(0, i4, descr=TargetToken(139889153137872))
[c5fd550f615eb00] jit-optimize}
[c5fd550f616b200] {jit-backend
[c5fd550f6170800] {jit-log-compiling-bridge
[i9, i10]
i11 = int_gt(i9, i10)
guard_true(i11, descr=<Guard0x7f3a7b48f510>) [i9, i10]
i13 = int_add(i10, -1)
i15 = int_lt(i13, 0)
guard_false(i15, descr=<Guard0x7f3a7b477850>) [i9, i10]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
jump(0, i13, descr=TargetToken(139889153137872))
[c5fd550f618b380] jit-log-compiling-bridge}
[c5fd550f6199600] {jit-mem-looptoken-alloc
allocating Bridge # 1 of Loop # 1
[c5fd550f61a0980] jit-mem-looptoken-alloc}
[c5fd550f61afa00] jit-backend}
compiled new bridge
[c5fd550f61b6300] {jit-log-opt-bridge
# bridge out of Guard 0x7f3a7b477ed0 with 7 ops
[i9, i10]
i11 = int_gt(i9, i10)
guard_true(i11, descr=<Guard0x7f3a7b48f510>) [i9, i10]
i13 = int_add(i10, -1)
i15 = int_lt(i13, 0)
guard_false(i15, descr=<Guard0x7f3a7b477850>) [i9, i10]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
jump(0, i13, descr=TargetToken(139889153137872))
[c5fd550f61d1480] jit-log-opt-bridge}
[c5fd550f61d5f00] {jit-log-opt-bridge
# bridge out of Guard 0x7f3a7b477ed0 with 7 ops
[i9, i10]
i11 = int_gt(i9, i10)
guard_true(i11, descr=<Guard0x7f3a7b48f510>) [i9, i10]
i13 = int_add(i10, -1)
i15 = int_lt(i13, 0)
guard_false(i15, descr=<Guard0x7f3a7b477850>) [i9, i10]
debug_merge_point(0, 0, '(jitdriver: no get_printable_location)')
jump(0, i13, descr=TargetToken(139889153137872))
[c5fd550f61f0700] jit-log-opt-bridge}
DoneWithThisFrameInt
[c5fd550f6475100] jit-tracing}
builder: rpython-linux-x86-64 build #918+
test: jit/metainterp/test/test_warmspot.py::TestLLWarmspot::()::test_loop_header