/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
Python | 9385 lines | 9382 code | 2 blank | 1 comment | 6 complexity | b4c3685e7aa08298a029ba818824dc06 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
Large files files are truncated, but you can click here to view the full file
- import py, sys
- from rpython.rlib.objectmodel import instantiate
- from rpython.rlib.rarithmetic import intmask
- from rpython.rtyper.lltypesystem import lltype
- from rpython.jit.metainterp import compile, resume
- from rpython.jit.metainterp.history import AbstractDescr, ConstInt, TreeLoop
- from rpython.jit.metainterp.optimize import InvalidLoop
- from rpython.jit.metainterp.optimizeopt import build_opt_chain
- from rpython.jit.metainterp.optimizeopt.test.test_util import (
- LLtypeMixin, BaseTest, convert_old_style_to_targets)
- from rpython.jit.metainterp.optimizeopt.test.test_optimizebasic import \
- FakeMetaInterpStaticData
- from rpython.jit.metainterp.resoperation import rop, opname, oparity,\
- InputArgInt
- def test_build_opt_chain():
- def check(chain, expected_names):
- names = [opt.__class__.__name__ for opt in chain]
- assert names == expected_names
- #
- metainterp_sd = FakeMetaInterpStaticData(None)
- chain, _ = build_opt_chain(metainterp_sd, "")
- check(chain, ["OptSimplify"])
- #
- chain, _ = build_opt_chain(metainterp_sd, "")
- check(chain, ["OptSimplify"])
- #
- chain, _ = build_opt_chain(metainterp_sd, "")
- check(chain, ["OptSimplify"])
- #
- chain, _ = build_opt_chain(metainterp_sd, "heap:intbounds")
- check(chain, ["OptIntBounds", "OptHeap", "OptSimplify"])
- #
- chain, unroll = build_opt_chain(metainterp_sd, "unroll")
- check(chain, ["OptSimplify"])
- assert unroll
- #
- chain, _ = build_opt_chain(metainterp_sd, "aaa:bbb")
- check(chain, ["OptSimplify"])
- # ____________________________________________________________
- class BaseTestWithUnroll(BaseTest):
- enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll"
- def optimize_loop(self, ops, expected, expected_preamble=None,
- call_pure_results=None, expected_short=None,
- jump_values=None):
- loop = self.parse(ops)
- if expected != "crash!":
- expected = self.parse(expected)
- if expected_preamble:
- expected_preamble = self.parse(expected_preamble)
- if expected_short:
- # the short preamble doesn't have fail descrs, they are patched in when it is used
- expected_short = self.parse(expected_short, want_fail_descr=False)
- info = self.unroll_and_optimize(loop, call_pure_results, jump_values)
- preamble = info.preamble
- preamble.check_consistency(check_descr=False)
- #
- print
- print "Preamble:"
- if preamble.operations:
- print '\n'.join([str(o) for o in preamble.operations])
- else:
- print 'Failed!'
- print
- print "Loop:"
- print '\n'.join([str(o) for o in loop.operations])
- print
- if expected_short:
- print "Short Preamble:"
- short = info.short_preamble
- print '\n'.join([str(o) for o in short])
- print
- assert expected != "crash!", "should have raised an exception"
- loop.check_consistency(check_descr=False)
- self.assert_equal(loop, convert_old_style_to_targets(expected, jump=True))
- assert loop.operations[0].getdescr() == loop.operations[-1].getdescr()
- if expected_preamble:
- self.assert_equal(preamble, convert_old_style_to_targets(expected_preamble, jump=False),
- text_right='expected preamble')
- if expected_short:
- short_preamble = TreeLoop('short preamble')
- assert short[0].getopnum() == rop.LABEL
- short_preamble.inputargs = short[0].getarglist()
- short_preamble.operations = short
- self.assert_equal(short_preamble, convert_old_style_to_targets(expected_short, jump=True),
- text_right='expected short preamble')
- #assert short[-1].getdescr() == loop.operations[0].getdescr()
- # XXX not sure what to do about that one
- return loop
- def raises(self, e, fn, *args):
- return py.test.raises(e, fn, *args).value
- class OptimizeOptTest(BaseTestWithUnroll):
- def test_simple(self):
- ops = """
- []
- f = escape_f()
- f0 = float_sub(f, 1.0)
- guard_value(f0, 0.0) [f0]
- escape_n(f)
- jump()
- """
- self.optimize_loop(ops, ops)
- def test_constant_propagate(self):
- ops = """
- []
- i0 = int_add(2, 3)
- i1 = int_is_true(i0)
- guard_true(i1) []
- i2 = int_is_zero(i1)
- guard_false(i2) []
- guard_value(i0, 5) []
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_constant_propagate_ovf(self):
- ops = """
- []
- i0 = int_add_ovf(2, 3)
- guard_no_overflow() []
- i1 = int_is_true(i0)
- guard_true(i1) []
- i2 = int_is_zero(i1)
- guard_false(i2) []
- guard_value(i0, 5) []
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_constfold_all(self):
- from rpython.jit.metainterp.executor import _execute_arglist
- import random
- for opnum in range(rop.INT_ADD, rop.SAME_AS_I+1):
- try:
- op = opname[opnum]
- except KeyError:
- continue
- if 'FLOAT' in op:
- continue
- if 'VEC' in op:
- continue
- args = []
- for _ in range(oparity[opnum]):
- args.append(random.randrange(1, 20))
- if opnum == rop.INT_SIGNEXT:
- # 2nd arg is number of bytes to extend from ---
- # must not be too random
- args[-1] = random.choice([1, 2] if sys.maxint < 2**32 else
- [1, 2, 4])
- ops = """
- []
- i1 = %s(%s)
- escape_n(i1)
- jump()
- """ % (op.lower(), ', '.join(map(str, args)))
- argboxes = [InputArgInt(a) for a in args]
- expected_value = _execute_arglist(self.cpu, None, opnum, argboxes)
- expected = """
- []
- escape_n(%d)
- jump()
- """ % expected_value
- self.optimize_loop(ops, expected)
- def test_reverse_of_cast_1(self):
- ops = """
- [i0]
- p0 = cast_int_to_ptr(i0)
- i1 = cast_ptr_to_int(p0)
- jump(i1)
- """
- expected = """
- [i0]
- jump(i0)
- """
- short = """
- [i2]
- p3 = cast_int_to_ptr(i2)
- jump()
- """
- self.optimize_loop(ops, expected, expected_short=short)
- def test_reverse_of_cast_2(self):
- ops = """
- [p0]
- i1 = cast_ptr_to_int(p0)
- p1 = cast_int_to_ptr(i1)
- jump(p1)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- # ----------
- def test_remove_guard_class_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, expected_preamble=preamble)
- def test_remove_guard_class_2(self):
- ops = """
- [i0]
- p0 = new_with_vtable(descr=nodesize)
- escape_n(p0)
- guard_class(p0, ConstClass(node_vtable)) []
- jump(i0)
- """
- expected = """
- [i0]
- p0 = new_with_vtable(descr=nodesize)
- escape_n(p0)
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_class_constant(self):
- ops = """
- [i0]
- p0 = same_as_r(ConstPtr(myptr))
- guard_class(p0, ConstClass(node_vtable)) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_constant_boolrewrite_lt(self):
- ops = """
- [i0]
- i1 = int_lt(i0, 0)
- guard_true(i1) []
- i2 = int_ge(i0, 0)
- guard_false(i2) []
- jump(i0)
- """
- preamble = """
- [i0]
- i1 = int_lt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- self.optimize_loop(ops, expected, expected_preamble=preamble)
- def test_constant_boolrewrite_gt(self):
- ops = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- i2 = int_le(i0, 0)
- guard_false(i2) []
- jump(i0)
- """
- preamble = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- self.optimize_loop(ops, expected, expected_preamble=preamble)
- def test_constant_boolrewrite_reflex(self):
- ops = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- i2 = int_lt(0, i0)
- guard_true(i2) []
- jump(i0)
- """
- preamble = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- self.optimize_loop(ops, expected, expected_preamble=preamble)
- def test_constant_boolrewrite_reflex_invers(self):
- ops = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- i2 = int_ge(0, i0)
- guard_false(i2) []
- jump(i0)
- """
- preamble = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- self.optimize_loop(ops, expected, expected_preamble=preamble)
- def test_remove_consecutive_guard_value_constfold(self):
- ops = """
- []
- i0 = escape_i()
- guard_value(i0, 0) []
- i1 = int_add(i0, 1)
- guard_value(i1, 1) []
- i2 = int_add(i1, 2)
- escape_n(i2)
- jump()
- """
- expected = """
- []
- i0 = escape_i()
- guard_value(i0, 0) []
- escape_n(3)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_value_if_constant(self):
- ops = """
- [p1]
- guard_value(p1, ConstPtr(myptr)) []
- jump(p1)
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_oononnull_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- guard_nonnull(p0) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_guard_nonnull_class_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- guard_nonnull(p0) []
- guard_nonnull_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_guard_nonnull_class_2(self):
- ops = """
- [p0]
- guard_nonnull_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_nonnull_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_int_is_true_1(self):
- ops = """
- [i0]
- i1 = int_is_true(i0)
- guard_true(i1) []
- i2 = int_is_true(i0)
- guard_true(i2) []
- jump(i0)
- """
- preamble = """
- [i0]
- i1 = int_is_true(i0)
- guard_true(i1) []
- jump(i0)
- """
- expected = """
- [i0]
- jump(i0)
- """
- short = """
- [i0]
- i1 = int_is_true(i0)
- guard_value(i1, 1) []
- jump()
- """
- self.optimize_loop(ops, expected, preamble, expected_short=short)
- def test_bound_int_is_true(self):
- ops = """
- [i0]
- i1 = int_add(i0, 1)
- i2 = int_gt(i1, 0)
- guard_true(i2) []
- i3 = int_is_true(i1)
- guard_true(i3) []
- jump(i1)
- """
- expected = """
- [i0]
- i1 = int_add(i0, 1)
- i2 = int_gt(i1, 0)
- guard_true(i2) []
- jump(i1)
- """
- self.optimize_loop(ops, expected, expected)
- def test_int_is_true_is_zero(self):
- py.test.skip("in-progress")
- ops = """
- [i0]
- i1 = int_add(i0, 1)
- i2 = int_is_true(i1)
- guard_true(i2) []
- i3 = int_is_zero(i1)
- guard_false(i3) []
- jump(i1)
- """
- expected = """
- [i0]
- i1 = int_add(i0, 1)
- i2 = int_is_true(i1)
- guard_true(i2) []
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_oononnull_2(self):
- ops = """
- [p0]
- guard_nonnull(p0) []
- guard_nonnull(p0) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_nonnull(p0) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_ooisnull_on_null_ptr_1(self):
- ops = """
- []
- p0 = escape_r()
- guard_isnull(p0) []
- guard_isnull(p0) []
- jump()
- """
- expected = """
- []
- p0 = escape_r()
- guard_isnull(p0) []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_oononnull_via_virtual(self):
- ops = """
- [p0]
- pv = new_with_vtable(descr=nodesize)
- setfield_gc(pv, p0, descr=valuedescr)
- guard_nonnull(p0) []
- p1 = getfield_gc_r(pv, descr=valuedescr)
- guard_nonnull(p1) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_nonnull(p0) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_oois_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i0 = ptr_ne(p0, NULL)
- guard_true(i0) []
- i1 = ptr_eq(p0, NULL)
- guard_false(i1) []
- i2 = ptr_ne(NULL, p0)
- guard_true(i0) []
- i3 = ptr_eq(NULL, p0)
- guard_false(i1) []
- jump(p0)
- """
- preamble = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_nonnull_1(self):
- ops = """
- [p0]
- setfield_gc(p0, 5, descr=valuedescr) # forces p0 != NULL
- i0 = ptr_ne(p0, NULL)
- guard_true(i0) []
- i1 = ptr_eq(p0, NULL)
- guard_false(i1) []
- i2 = ptr_ne(NULL, p0)
- guard_true(i2) []
- i3 = ptr_eq(NULL, p0)
- guard_false(i3) []
- guard_nonnull(p0) []
- jump(p0)
- """
- preamble = """
- [p0]
- setfield_gc(p0, 5, descr=valuedescr)
- jump(p0)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_nonnull_2(self):
- ops = """
- []
- p0 = new_array(5, descr=arraydescr) # forces p0 != NULL
- i0 = ptr_ne(p0, NULL)
- guard_true(i0) []
- i1 = ptr_eq(p0, NULL)
- guard_false(i1) []
- i2 = ptr_ne(NULL, p0)
- guard_true(i2) []
- i3 = ptr_eq(NULL, p0)
- guard_false(i3) []
- guard_nonnull(p0) []
- escape_r(p0)
- jump()
- """
- expected = """
- []
- p0 = new_array(5, descr=arraydescr)
- escape_r(p0)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_const_guard_value(self):
- ops = """
- []
- i = int_add(5, 3)
- guard_value(i, 8) []
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_constptr_guard_value(self):
- ops = """
- []
- p1 = escape_r()
- guard_value(p1, ConstPtr(myptr)) []
- jump()
- """
- self.optimize_loop(ops, ops)
- def test_guard_value_to_guard_true(self):
- ops = """
- [i]
- i1 = int_lt(i, 3)
- guard_value(i1, 1) [i]
- jump(i)
- """
- preamble = """
- [i]
- i1 = int_lt(i, 3)
- guard_true(i1) [i]
- jump(i)
- """
- expected = """
- [i]
- jump(i)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_guard_value_to_guard_false(self):
- ops = """
- [i]
- i1 = int_is_true(i)
- guard_value(i1, 0) [i]
- jump(i)
- """
- preamble = """
- [i]
- i1 = int_is_true(i)
- guard_false(i1) [i]
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected, preamble)
- def test_guard_value_on_nonbool(self):
- ops = """
- [i]
- i1 = int_add(i, 3)
- guard_value(i1, 0) [i]
- jump(i)
- """
- preamble = """
- [i]
- i1 = int_add(i, 3)
- guard_value(i1, 0) [i]
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected, preamble)
- def test_int_is_true_of_bool(self):
- ops = """
- [i0, i1]
- i2 = int_gt(i0, i1)
- i3 = int_is_true(i2)
- i4 = int_is_true(i3)
- guard_value(i4, 0) [i0, i1]
- jump(i0, i1)
- """
- preamble = """
- [i0, i1]
- i2 = int_gt(i0, i1)
- guard_false(i2) [i0, i1]
- jump(i0, i1)
- """
- expected = """
- [i0, i1]
- jump(i0, i1)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_compare_with_itself(self):
- ops = """
- []
- i0 = escape_i()
- i1 = int_lt(i0, i0)
- guard_false(i1) []
- i2 = int_le(i0, i0)
- guard_true(i2) []
- i3 = int_eq(i0, i0)
- guard_true(i3) []
- i4 = int_ne(i0, i0)
- guard_false(i4) []
- i5 = int_gt(i0, i0)
- guard_false(i5) []
- i6 = int_ge(i0, i0)
- guard_true(i6) []
- jump()
- """
- expected = """
- []
- i0 = escape_i()
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_compare_with_itself_uint(self):
- py.test.skip("implement me")
- ops = """
- []
- i0 = escape_i()
- i7 = uint_lt(i0, i0)
- guard_false(i7) []
- i8 = uint_le(i0, i0)
- guard_true(i8) []
- i9 = uint_gt(i0, i0)
- guard_false(i9) []
- i10 = uint_ge(i0, i0)
- guard_true(i10) []
- jump()
- """
- expected = """
- []
- i0 = escape_i()
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_p123_simple(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=valuedescr)
- escape_n(i3)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i1, p1, p2)
- """
- preamble = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=valuedescr)
- escape_n(i3)
- jump(i1, p2)
- """
- expected = """
- [i1, p2]
- i3 = getfield_gc_i(p2, descr=valuedescr)
- escape_n(i3)
- p3 = new_with_vtable(descr=nodesize)
- setfield_gc(p3, i1, descr=valuedescr)
- jump(i1, p3)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.nodefulladdr, None])
- def test_p123_nested(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=valuedescr)
- escape_n(i3)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i1, descr=valuedescr)
- p1sub = new_with_vtable(descr=nodesize2)
- setfield_gc(p1sub, i1, descr=valuedescr)
- setfield_gc(p1, p1sub, descr=nextdescr)
- jump(i1, p1, p2)
- """
- # The same as test_p123_simple, but with a virtual containing another
- # virtual.
- preamble = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=valuedescr)
- escape_n(i3)
- jump(i1, p2)
- """
- expected = """
- [i1, p2]
- i3 = getfield_gc_i(p2, descr=valuedescr)
- escape_n(i3)
- p4 = new_with_vtable(descr=nodesize)
- p1sub = new_with_vtable(descr=nodesize2)
- setfield_gc(p1sub, i1, descr=valuedescr)
- setfield_gc(p4, i1, descr=valuedescr)
- setfield_gc(p4, p1sub, descr=nextdescr)
- jump(i1, p4)
- """
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.nodefulladdr, self.nodefulladdr])
- def test_p123_anti_nested(self):
- ops = """
- [i1, p2, p3]
- p3sub = getfield_gc_r(p3, descr=nextdescr)
- i3 = getfield_gc_i(p3sub, descr=valuedescr)
- escape_n(i3)
- p1 = new_with_vtable(descr=nodesize)
- p2sub = new_with_vtable(descr=nodesize2)
- setfield_gc(p2sub, i1, descr=valuedescr)
- setfield_gc(p2, p2sub, descr=nextdescr)
- jump(i1, p1, p2)
- """
- # The same as test_p123_simple, but in the end the "old" p2 contains
- # a "young" virtual p2sub. Make sure it is all forced.
- preamble = """
- [i1, p2, p3]
- p3sub = getfield_gc_r(p3, descr=nextdescr)
- i3 = getfield_gc_i(p3sub, descr=valuedescr)
- escape_n(i3)
- p2sub = new_with_vtable(descr=nodesize2)
- setfield_gc(p2sub, i1, descr=valuedescr)
- setfield_gc(p2, p2sub, descr=nextdescr)
- jump(i1, p2, p2sub)
- """
- expected = """
- [i1, p2, p10]
- i3 = getfield_gc_i(p10, descr=valuedescr)
- escape_n(i3)
- p1 = new_with_vtable(descr=nodesize)
- p3sub = new_with_vtable(descr=nodesize2)
- setfield_gc(p3sub, i1, descr=valuedescr)
- setfield_gc(p1, p3sub, descr=nextdescr)
- jump(i1, p1, p3sub)
- """
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.nodefulladdr, self.nodefulladdr])
- def test_dont_delay_setfields(self):
- ops = """
- [p1, p2]
- i1 = getfield_gc_i(p1, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i2b = int_is_true(i2)
- guard_true(i2b) []
- setfield_gc(p2, i2, descr=valuedescr)
- p3 = new_with_vtable(descr=nodesize)
- jump(p2, p3)
- """
- short = """
- [p1, p2]
- guard_nonnull(p1) []
- guard_is_object(p1) []
- guard_subclass(p1, ConstClass(node_vtable)) []
- i1 = getfield_gc_i(p1, descr=valuedescr)
- jump(i1)
- """
- preamble = """
- [p1, p2]
- i1 = getfield_gc_i(p1, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i2b = int_is_true(i2)
- guard_true(i2b) []
- setfield_gc(p2, i2, descr=valuedescr)
- jump(p2, i2)
- """
- expected = """
- [p2, i1]
- i2 = int_sub(i1, 1)
- i2b = int_is_true(i2)
- guard_true(i2b) []
- p3 = new_with_vtable(descr=nodesize)
- setfield_gc(p3, i2, descr=valuedescr)
- jump(p3, i2)
- """
- self.optimize_loop(ops, expected, preamble, expected_short=short,
- jump_values=[None, self.nodefulladdr])
- # ----------
- def test_fold_guard_no_exception(self):
- ops = """
- [i]
- guard_no_exception() []
- i1 = int_add(i, 3)
- i2 = call_i(i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- i3 = call_i(i2, descr=nonwritedescr)
- jump(i1) # the exception is considered lost when we loop back
- """
- preamble = """
- [i]
- guard_no_exception() [] # occurs at the start of bridges, so keep it
- i1 = int_add(i, 3)
- i2 = call_i(i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- i3 = call_i(i2, descr=nonwritedescr)
- jump(i1)
- """
- expected = """
- [i]
- guard_no_exception() [] # occurs at the start of bridges, so keep it
- i1 = int_add(i, 3)
- i2 = call_i(i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- i3 = call_i(i2, descr=nonwritedescr)
- jump(i1)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_bug_guard_no_exception(self):
- ops = """
- []
- i0 = call_i(123, descr=nonwritedescr)
- p0 = call_r(0, "xy", descr=s2u_descr) # string -> unicode
- guard_no_exception() []
- escape_n(p0)
- jump()
- """
- expected = """
- []
- i0 = call_i(123, descr=nonwritedescr)
- escape_n(u"xy")
- jump()
- """
- self.optimize_loop(ops, expected)
- # ----------
- def test_call_loopinvariant(self):
- ops = """
- [i1]
- i2 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i2, 1) []
- i3 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i3, 1) []
- i4 = call_loopinvariant_i(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i4, 1) []
- jump(i1)
- """
- preamble = """
- [i1]
- i2 = call_i(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i2, 1) []
- jump(i1)
- """
- expected = """
- [i1]
- jump(i1)
- """
- self.optimize_loop(ops, expected, preamble)
- # ----------
- def test_virtual_1(self):
- ops = """
- [i, p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- i1 = int_add(i0, i)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i, p1)
- """
- preamble = """
- [i, p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- i1 = int_add(i0, i)
- jump(i, i1)
- """
- expected = """
- [i, i2]
- i1 = int_add(i2, i)
- jump(i, i1)
- """
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.nodefulladdr])
- def test_virtual_float(self):
- ops = """
- [f, p0]
- f0 = getfield_gc_f(p0, descr=floatdescr)
- f1 = float_add(f0, f)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, f1, descr=floatdescr)
- jump(f, p1)
- """
- preamble = """
- [f, p0]
- f2 = getfield_gc_f(p0, descr=floatdescr)
- f1 = float_add(f2, f)
- jump(f, f1)
- """
- expected = """
- [f, f2]
- f1 = float_add(f2, f)
- jump(f, f1)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_oois(self):
- ops = """
- [p0, p1, p2]
- guard_nonnull(p0) []
- i3 = ptr_ne(p0, NULL)
- guard_true(i3) []
- i4 = ptr_eq(p0, NULL)
- guard_false(i4) []
- i5 = ptr_ne(NULL, p0)
- guard_true(i5) []
- i6 = ptr_eq(NULL, p0)
- guard_false(i6) []
- i7 = ptr_ne(p0, p1)
- guard_true(i7) []
- i8 = ptr_eq(p0, p1)
- guard_false(i8) []
- i9 = ptr_ne(p0, p2)
- guard_true(i9) []
- i10 = ptr_eq(p0, p2)
- guard_false(i10) []
- i11 = ptr_ne(p2, p1)
- guard_true(i11) []
- i12 = ptr_eq(p2, p1)
- guard_false(i12) []
- jump(p0, p1, p2)
- """
- expected = """
- [p0, p1, p2]
- # all constant-folded :-)
- jump(p0, p1, p2)
- """
- #
- # to be complete, we also check the no-opt case where most comparisons
- # are not removed. The exact set of comparisons removed depends on
- # the details of the algorithm...
- expected2 = """
- [p0, p1, p2]
- guard_nonnull(p0) []
- i7 = ptr_ne(p0, p1)
- guard_true(i7) []
- i9 = ptr_ne(p0, p2)
- guard_true(i9) []
- i11 = ptr_ne(p2, p1)
- guard_true(i11) []
- jump(p0, p1, p2)
- """
- self.optimize_loop(ops, expected, expected2)
- def test_virtual_default_field(self):
- ops = """
- [p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- guard_value(i0, 0) []
- p1 = new_with_vtable(descr=nodesize)
- # the field 'value' has its default value of 0
- jump(p1)
- """
- preamble = """
- [p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- guard_value(i0, 0) []
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_3(self):
- ops = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- i0 = getfield_gc_i(p1, descr=valuedescr)
- i1 = int_add(i0, 1)
- jump(i1)
- """
- expected = """
- [i]
- i1 = int_add(i, 1)
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_4(self):
- ops = """
- [i0, p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i2, descr=valuedescr)
- jump(i3, p1)
- """
- preamble = """
- [i0, p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- jump(i3, i2)
- """
- expected = """
- [i0, i1]
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- jump(i3, i2)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_5(self):
- ops = """
- [i0, p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- p2 = new_with_vtable(descr=nodesize2)
- setfield_gc(p2, i1, descr=valuedescr)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i2, descr=valuedescr)
- setfield_gc(p1, p2, descr=nextdescr)
- jump(i3, p1)
- """
- preamble = """
- [i0, p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i1 = getfield_gc_i(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- jump(i3, i2, i1)
- """
- expected = """
- [i0, i1bis, i1]
- i2 = int_sub(i1bis, 1)
- i3 = int_add(i0, i1bis)
- jump(i3, i2, i1bis)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_recursive(self):
- ops = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
- p1 = new_with_vtable(descr=nodesize2)
- p2 = new_with_vtable(descr=nodesize2)
- setfield_gc(p2, p1, descr=nextdescr)
- setfield_gc(p1, p2, descr=nextdescr)
- i1 = int_add(i0, 1)
- setfield_gc(p2, i1, descr=valuedescr)
- jump(p1)
- """
- preamble = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
- i3 = int_add(i0, 1)
- jump(i3)
- """
- expected = """
- [i0]
- i1 = int_add(i0, 1)
- jump(i1)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_recursive_forced(self):
- ops = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
- p1 = new_with_vtable(descr=nodesize2)
- p2 = new_with_vtable(descr=nodesize2)
- setfield_gc(p2, p1, descr=nextdescr)
- setfield_gc(p1, p2, descr=nextdescr)
- i1 = int_add(i0, 1)
- setfield_gc(p2, i1, descr=valuedescr)
- setfield_gc(p0, p1, descr=nextdescr)
- jump(p1)
- """
- preamble = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
- i1 = int_add(i0, 1)
- p1 = new_with_vtable(descr=nodesize2)
- p2 = new_with_vtable(descr=nodesize2)
- setfield_gc(p2, i1, descr=valuedescr)
- setfield_gc(p2, p1, descr=nextdescr)
- setfield_gc(p1, p2, descr=nextdescr)
- setfield_gc(p0, p1, descr=nextdescr)
- jump(p1)
- """
- loop = """
- [p0]
- p41 = getfield_gc_r(p0, descr=nextdescr)
- i0 = getfield_gc_i(p41, descr=valuedescr)
- i1 = int_add(i0, 1)
- p1 = new_with_vtable(descr=nodesize2)
- p2 = new_with_vtable(descr=nodesize2)
- setfield_gc(p2, i1, descr=valuedescr)
- setfield_gc(p2, p1, descr=nextdescr)
- setfield_gc(p0, p1, descr=nextdescr)
- setfield_gc(p1, p2, descr=nextdescr)
- jump(p1)
- """
- self.optimize_loop(ops, loop, preamble)
- def test_virtual_constant_isnull(self):
- ops = """
- [i0]
- p0 = new_with_vtable(descr=nodesize)
- setfield_gc(p0, NULL, descr=nextdescr)
- p2 = getfield_gc_r(p0, descr=nextdescr)
- i1 = ptr_eq(p2, NULL)
- jump(i1)
- """
- preamble = """
- [i0]
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected, preamble)
- def test_virtual_constant_isnonnull(self):
- ops = """
- [i0]
- p0 = new_with_vtable(descr=nodesize)
- setfield_gc(p0, ConstPtr(myptr), descr=nextdescr)
- p2 = getfield_gc_r(p0, descr=nextdescr)
- i1 = ptr_eq(p2, NULL)
- jump(i1)
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_virtual_field_forced_by_lazy_setfield(self):
- ops = """
- [i0, p1, p3]
- i28 = int_add(i0, 1)
- p30 = new_with_vtable(descr=nodesize)
- setfield_gc(p30, i28, descr=valuedescr)
- setfield_gc(p3, p30, descr=nextdescr)
- p45 = getfield_gc_r(p3, descr=nextdescr)
- i29 = int_add(i28, 1)
- jump(i29, p45, p3)
- """
- preamble = """
- [i0, p1, p3]
- i28 = int_add(i0, 1)
- i29 = int_add(i28, 1)
- p30 = new_with_vtable(descr=nodesize)
- setfield_gc(p30, i28, descr=valuedescr)
- setfield_gc(p3, p30, descr=nextdescr)
- #p46 = same_as(p30) # This same_as should be killed by backend
- jump(i29, p30, p3)
- """
- expected = """
- [i0, p1, p3]
- i28 = int_add(i0, 1)
- i29 = int_add(i28, 1)
- p30 = new_with_vtable(descr=nodesize)
- setfield_gc(p30, i28, descr=valuedescr)
- setfield_gc(p3, p30, descr=nextdescr)
- jump(i29, p30, p3)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_nonvirtual_1(self):
- ops = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- i0 = getfield_gc_i(p1, descr=valuedescr)
- i1 = int_add(i0, 1)
- escape_n(p1)
- escape_n(p1)
- jump(i1)
- """
- expected = """
- [i]
- i1 = int_add(i, 1)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- escape_n(p1)
- escape_n(p1)
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_2(self):
- ops = """
- [i, p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- escape_n(p0)
- i1 = int_add(i0, i)
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i, p1)
- """
- preamble = """
- [i, p0]
- i0 = getfield_gc_i(p0, descr=valuedescr)
- escape_n(p0)
- i1 = int_add(i0, i)
- jump(i, i1)
- """
- expected = """
- [i, i1]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i1, descr=valuedescr)
- escape_n(p1)
- i2 = int_add(i1, i)
- jump(i, i2)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_nonvirtual_later(self):
- ops = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc_i(p1, descr=valuedescr)
- escape_n(p1)
- i2 = getfield_gc_i(p1, descr=valuedescr)
- i3 = int_add(i1, i2)
- jump(i3)
- """
- expected = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- escape_n(p1)
- i2 = getfield_gc_i(p1, descr=valuedescr)
- i3 = int_add(i, i2)
- jump(i3)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_write_null_fields_on_force(self):
- ops = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc_i(p1, descr=valuedescr)
- setfield_gc(p1, 0, descr=valuedescr)
- escape_n(p1)
- i2 = getfield_gc_i(p1, descr=valuedescr)
- jump(i2)
- """
- expected = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, 0, descr=valuedescr)
- escape_n(p1)
- i2 = getfield_gc_i(p1, descr=valuedescr)
- jump(i2)
- """
- self.optimize_loop(ops, expected)
- def test_pure_getfield_gc_1(self):
- ops = """
- [i]
- p1 = new_with_vtable(descr=nodesize)
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc_i(p1, descr=valuedescr)
- jump(i1)
- """
- expected = """
- [i]
- jump(i)
- """
- self.optimize_loop(ops, expected)
- def test_pure_getfield_gc_2(self):
- ops = """
- [i]
- i1 = getfield_gc_i(ConstPtr(myptr3), descr=valuedescr3)
- jump(i1)
- """
- expected = """
- []
- jump()
- """
- self.node.value = 5
- self.optimize_loop(ops, expected)
- def test_pure_getfield_gc_3(self):
- ops = """
- []
- p1 = escape_r()
- p2 = getfield_gc_r(p1, descr=nextdescr3)
- escape_n(p2)
- p3 = getfield_gc_r(p1, descr=nextdescr3)
- escape_n(p3)
- jump()
- """
- expected = """
- []
- p1 = escape_r()
- p2 = getfield_gc_r(p1, descr=nextdescr3)
- escape_n(p2)
- escape_n(p2)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_getfield_gc_nonpure_2(self):
- ops = """
- [i]
- i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
- call_n(i1, descr=nonwritedescr)
- jump(i)
- """
- preamble = """
- [i]
- i1 = getfield_gc_i(ConstPtr(myptr), descr=valuedescr)
- call_n(i1, descr=nonwritedescr)
- jump(i, i1)
- """
- expected = """
- [i, i1]
- call_n(i1, descr=nonwritedescr)
- jump(i, i1)
- """
- self.optimize_loop(ops, expected, preamble)
- def test_varray_boxed1(self):
- ops = """
- [p0, p8]
- p11 = getfield_gc_r(p0, descr=otherdescr)
- guard_nonnull(p11) [p0, p8]
- guard_class(p11, ConstClass(node_vtable2)) [p0, p8]
- p14 = getfield_gc_r(p11, descr=otherdescr)
- guard_isnull(p14) [p0, p8]
- p18 = getfield_gc_r(ConstPtr(myptr), descr=otherdescr)
- guard_isnull(p18) [p0, p8]
- p31 = new(descr=ssize)
- setfield_gc(p31, 0, descr=adescr)
- p33 = new_array(0, descr=arraydescr)
- setfield_gc(p31, p33, descr=bdescr)
- p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=nexttupledescr)
- jump(p0, p35)
- """
- expected = """
- [p0, p1]
- jump(p0, p1)
- """
- self.optimize_loop(ops, expected)
- def test_varray_boxed_simplified(self):
- ops = """
- [p0, p8]
- p18 = getfield_gc_r(ConstPtr(myptr), descr=otherdescr)
- guard_isnull(p18) [p0, p8]
- p31 = new(descr=ssize)
- p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=nexttupledescr)
- jump(p0, p35)
- """
- expected = """
- [p0]
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- def test_varray_boxed_noconst(self):
- ops = """
- [p0, p8, p18, p19]
- guard_isnull(p18) [p0, p8]
- p31 = new(descr=ssize)
- p35 = new_with_vtable(descr=nodesize)
- setfield_gc(p35, p31, descr=nexttupledescr)
- jump(p0, p35, p19, p18)
- """
- expected = """
- [p0, p19]
- guard_isnull(p19) [p0]
- jump(p0, NULL)
- """
- self.optimize_loop(ops, expected)
- def test_varray_1(self):
- ops = """
- [i1]
- p1 = new_array(3, descr=arraydescr)
- i3 = arraylen_gc(p1, descr=arraydescr)
- guard_value(i3, 3) []
- setarrayitem_gc(p1, 1, i1, descr=arraydescr)
- setarrayitem_gc(p1, 0, 25, descr=arraydescr)
- i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
- jump(i2)
- """
- expected = """
- [i1]
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_varray_clear_unroll_bug(self):
- ops = """
- [p0]
- i0 = getarrayitem_gc_i(p0, 0, descr=arraydescr)
- i1 = getarrayitem_gc_i(p0, 1, descr=arraydescr)
- i2 = getarrayitem_gc_i(p0, 2, descr=arraydescr)
- i3 = int_add(i0, i1)
- i4 = int_add(i3, i2)
- p1 = new_array_clear(3, descr=arraydescr)
- setarrayitem_gc(p1, 1, i4, descr=arraydescr)
- setarrayitem_gc(p1, 0, 25, descr=arraydescr)
- jump(p1)
- """
- expected = """
- [i1]
- i2 = int_add(25, i1)
- jump(i2)
- """
- jump_values = [self.arrayref]
- self.optimize_loop(ops, expected, jump_values=jump_values)
- def test_varray_alloc_and_set(self):
- ops = """
- [i1]
- p1 = new_array(2, descr=arraydescr)
- setarrayitem_gc(p1, 0, 25, descr=arraydescr)
- i2 = getarrayitem_gc_i(p1, 0, descr=arraydescr)
- jump(i2)
- """
- preamble = """
- [i1]
- jump()
- """
- expected = """
- []
- jump()
- """
- self.optimize_loop(ops, expected, preamble)
- def test_varray_float(self):
- ops = """
- [f1]
- p1 = new_array(3, descr=floatarraydescr)
- i3 = arraylen_gc(p1, descr=floatarraydescr)
- guard_value(i3, 3) []
- setarrayitem_gc(p1, 1, f1, descr=floatarraydescr)
- setarrayitem_gc(p1, 0, 3.5, descr=floatarraydescr)
- f2 = getarrayitem_gc_f(p1, 1, descr=floatarraydescr)
- jump(f2)
- """
- expected = """
- [f1]
- jump(f1)
- """
- self.optimize_loop(ops, expected)
- def test_array_non_optimized(self):
- ops = """
- [i1, p0]
- setarrayitem_gc(p0, 0, i1, descr=arraydescr)
- guard_nonnull(p0) []
- p1 = new_array(i1, descr=arraydescr)
- jump(i1, p1)
- """
- expected = """
- [i1, p0]
- p1 = new_array(i1, descr=arraydescr)
- setarrayitem_gc(p0, 0, i1, descr=arraydescr)
- jump(i1, p1)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_array_write_null_fields_on_force(self):
- ops = """
- [i1]
- p1 = new_array(5, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- setarrayitem_gc(p1, 1, 0, descr=arraydescr)
- escape_n(p1)
- jump(i1)
- """
- expected = """
- [i1]
- p1 = new_array(5, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- setarrayitem_gc(p1, 1, 0, descr=arraydescr)
- escape_n(p1)
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_varray_2(self):
- ops = """
- [i0, p1]
- i1 = getarrayitem_gc_i(p1, 0, descr=arraydescr)
- i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
- i3 = int_sub(i1, i2)
- guard_value(i3, 15) []
- p2 = new_array(2, descr=arraydescr)
- setarrayitem_gc(p2, 1, i0, descr=arraydescr)
- setarrayitem_gc(p2, 0, 20, descr=arraydescr)
- jump(i0, p2)
- """
- preamble = """
- [i0, p1]
- i1 = getarrayitem_gc_i(p1, 0, descr=arraydescr)
- i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr)
- i3 = int_sub(i1, i2)
- guard_value(i3, 15) []
- jump(i0)
- """
- expected = """
- [i0]
- i3 = int_sub(20, i0)
- guard_value(i3, 15) []
- jump(5)
- """
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.arrayref])
- def test_p123_array(self):
- ops = """
- [i1, p2, p3]
- i3 = getarrayitem_gc_i(p3, 0, descr=arraydescr)
- escape_n(i3)
- p1 = new_array(1, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- jump(i1, p1, p2)
- """
- preamble = """
- [i1, p2, p3]
- i3 = getarrayitem_gc_i(p3, 0, descr=arraydescr)
- escape_n(i3)
- jump(i1, p2)
- """
- expected = """
- [i1, p2]
- i3 = getarrayitem_gc_i(p2, 0, descr=arraydescr)
- escape_n(i3)
- p1 = new_array(1, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- jump(i1, p1)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.arrayref, None])
- def test_varray_forced_1(self):
- ops = """
- []
- p2 = new_with_vtable(descr=nodesize)
- setfield_gc(p2, 3, descr=valuedescr)
- i1 = getfield_gc_i(p2, descr=valuedescr) # i1 = const 3
- p1 = new_array(i1, descr=arraydescr)
- escape_n(p1)
- i2 = arraylen_gc(p1)
- escape_n(i2)
- jump()
- """
- expected = """
- []
- p1 = new_array(3, descr=arraydescr)
- escape_n(p1)
- escape_n(3)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_vstruct_1(self):
- ops = """
- [i1, p2]
- i2 = getfield_gc_i(p2, descr=adescr)
- escape_n(i2)
- p3 = new(descr=ssize)
- setfield_gc(p3, i1, descr=adescr)
- jump(i1, p3)
- """
- preamble = """
- [i1, p2]
- i2 = getfield_gc_i(p2, descr=adescr)
- escape_n(i2)
- jump(i1)
- """
- expected = """
- [i1]
- escape_n(i1)
- jump(i1)
- """
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.tupleaddr])
- def test_p123_vstruct(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=adescr)
- escape_n(i3)
- p1 = new(descr=ssize)
- setfield_gc(p1, i1, descr=adescr)
- jump(i1, p1, p2)
- """
- preamble = """
- [i1, p2, p3]
- i3 = getfield_gc_i(p3, descr=adescr)
- escape_n(i3)
- jump(i1, p2)
- """
- expected = """
- [i1, p2]
- i3 = getfield_gc_i(p2, descr=adescr)
- escape_n(i3)
- p1 = new(descr=ssize)
- setfield_gc(p1, i1, descr=adescr)
- jump(i1, p1)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, expected, preamble,
- jump_values=[None, self.tupleaddr, None])
- def test_virtual_raw_malloc_basic(self):
- ops = """
- [i1]
- i2 = call_i('malloc', 10, descr=raw_malloc_descr)
- guard_no_exception() []
- setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
- i3 = getarrayitem_raw_i(i2, 0, descr=rawarraydescr)
- call_n('free', i2, descr=raw_free_descr)
- jump(i3)
- """
- expected = """
- [i1]
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_raw_malloc_const(self):
- ops = """
- [i1]
- i5 = int_mul(10, 1)
- i2 = call_i('malloc', i5, descr=raw_malloc_descr)
- guard_no_exception() []
- setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
- i3 = getarrayitem_raw_i(i2, 0, descr=rawarraydescr)
- call_n('free', i2, descr=raw_free_descr)
- jump(i3)
- """
- expected = """
- [i1]
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_raw_malloc_force(self):
- ops = """
- [i1]
- i2 = call_i('malloc', 20, descr=raw_malloc_descr)
- guard_no_exception() []
- setarrayitem_…
Large files files are truncated, but you can click here to view the full file