/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
Python | 5123 lines | 5095 code | 19 blank | 9 comment | 9 complexity | c906bec769f7eedc2479b4c3a8ca342c MD5 | raw file
Possible License(s): Apache-2.0
Large files files are truncated, but you can click here to view the full file
- import py
- from rpython.rlib.objectmodel import instantiate
- from rpython.jit.metainterp.optimizeopt.test.test_util import (
- LLtypeMixin, BaseTest, FakeMetaInterpStaticData, convert_old_style_to_targets)
- from rpython.jit.metainterp.history import TargetToken, JitCellToken
- from rpython.jit.metainterp.test.test_compile import FakeLogger
- import rpython.jit.metainterp.optimizeopt.optimizer as optimizeopt
- import rpython.jit.metainterp.optimizeopt.virtualize as virtualize
- from rpython.jit.metainterp.optimize import InvalidLoop
- from rpython.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt, get_const_ptr_for_string
- from rpython.jit.metainterp import executor, compile, resume, history
- from rpython.jit.metainterp.resoperation import rop, opname, ResOperation
- from rpython.rlib.rarithmetic import LONG_BIT
- def test_store_final_boxes_in_guard():
- from rpython.jit.metainterp.compile import ResumeGuardDescr
- from rpython.jit.metainterp.resume import tag, TAGBOX
- b0 = BoxInt()
- b1 = BoxInt()
- opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
- None)
- fdescr = ResumeGuardDescr()
- op = ResOperation(rop.GUARD_TRUE, ['dummy'], None, descr=fdescr)
- # setup rd data
- fi0 = resume.FrameInfo(None, "code0", 11)
- fdescr.rd_frame_info_list = resume.FrameInfo(fi0, "code1", 33)
- snapshot0 = resume.Snapshot(None, [b0])
- fdescr.rd_snapshot = resume.Snapshot(snapshot0, [b1])
- #
- opt.store_final_boxes_in_guard(op)
- if op.getfailargs() == [b0, b1]:
- assert list(fdescr.rd_numb.nums) == [tag(1, TAGBOX)]
- assert list(fdescr.rd_numb.prev.nums) == [tag(0, TAGBOX)]
- else:
- assert op.getfailargs() == [b1, b0]
- assert list(fdescr.rd_numb.nums) == [tag(0, TAGBOX)]
- assert list(fdescr.rd_numb.prev.nums) == [tag(1, TAGBOX)]
- assert fdescr.rd_virtuals is None
- assert fdescr.rd_consts == []
- def test_sharing_field_lists_of_virtual():
- class FakeOptimizer(object):
- class optimizer(object):
- class cpu(object):
- pass
- opt = FakeOptimizer()
- virt1 = virtualize.AbstractVirtualStructValue(opt, None)
- lst1 = virt1._get_field_descr_list()
- assert lst1 == []
- lst2 = virt1._get_field_descr_list()
- assert lst1 is lst2
- virt1.setfield(LLtypeMixin.valuedescr, optimizeopt.OptValue(None))
- lst3 = virt1._get_field_descr_list()
- assert lst3 == [LLtypeMixin.valuedescr]
- lst4 = virt1._get_field_descr_list()
- assert lst3 is lst4
- virt2 = virtualize.AbstractVirtualStructValue(opt, None)
- lst5 = virt2._get_field_descr_list()
- assert lst5 is lst1
- virt2.setfield(LLtypeMixin.valuedescr, optimizeopt.OptValue(None))
- lst6 = virt1._get_field_descr_list()
- assert lst6 is lst3
- def test_reuse_vinfo():
- class FakeVInfo(object):
- def set_content(self, fieldnums):
- self.fieldnums = fieldnums
- def equals(self, fieldnums):
- return self.fieldnums == fieldnums
- class FakeVirtualValue(virtualize.AbstractVirtualValue):
- def _make_virtual(self, *args):
- return FakeVInfo()
- v1 = FakeVirtualValue(None, None)
- vinfo1 = v1.make_virtual_info(None, [1, 2, 4])
- vinfo2 = v1.make_virtual_info(None, [1, 2, 4])
- assert vinfo1 is vinfo2
- vinfo3 = v1.make_virtual_info(None, [1, 2, 6])
- assert vinfo3 is not vinfo2
- vinfo4 = v1.make_virtual_info(None, [1, 2, 6])
- assert vinfo3 is vinfo4
- def test_descrlist_dict():
- from rpython.jit.metainterp.optimizeopt import util as optimizeutil
- h1 = optimizeutil.descrlist_hash([])
- h2 = optimizeutil.descrlist_hash([LLtypeMixin.valuedescr])
- h3 = optimizeutil.descrlist_hash(
- [LLtypeMixin.valuedescr, LLtypeMixin.nextdescr])
- assert h1 != h2
- assert h2 != h3
- assert optimizeutil.descrlist_eq([], [])
- assert not optimizeutil.descrlist_eq([], [LLtypeMixin.valuedescr])
- assert optimizeutil.descrlist_eq([LLtypeMixin.valuedescr],
- [LLtypeMixin.valuedescr])
- assert not optimizeutil.descrlist_eq([LLtypeMixin.valuedescr],
- [LLtypeMixin.nextdescr])
- assert optimizeutil.descrlist_eq([LLtypeMixin.valuedescr, LLtypeMixin.nextdescr],
- [LLtypeMixin.valuedescr, LLtypeMixin.nextdescr])
- assert not optimizeutil.descrlist_eq([LLtypeMixin.nextdescr, LLtypeMixin.valuedescr],
- [LLtypeMixin.valuedescr, LLtypeMixin.nextdescr])
- # descrlist_eq should compare by identity of the descrs, not by the result
- # of sort_key
- class FakeDescr(object):
- def sort_key(self):
- return 1
- assert not optimizeutil.descrlist_eq([FakeDescr()], [FakeDescr()])
- # ____________________________________________________________
- class BaseTestBasic(BaseTest):
- enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap"
- def optimize_loop(self, ops, optops, call_pure_results=None):
- loop = self.parse(ops)
- token = JitCellToken()
- loop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=TargetToken(token))] + \
- loop.operations
- if loop.operations[-1].getopnum() == rop.JUMP:
- loop.operations[-1].setdescr(token)
- expected = convert_old_style_to_targets(self.parse(optops), jump=True)
- self._do_optimize_loop(loop, call_pure_results)
- print '\n'.join([str(o) for o in loop.operations])
- self.assert_equal(loop, expected)
- def setup_method(self, meth=None):
- class FailDescr(compile.ResumeGuardDescr):
- oparse = None
- def _oparser_uses_descr_of_guard(self, oparse, fail_args):
- # typically called 3 times: once when parsing 'ops',
- # once when parsing 'preamble', once when parsing 'expected'.
- self.oparse = oparse
- self.rd_frame_info_list, self.rd_snapshot = snapshot(fail_args)
- def _clone_if_mutable(self):
- assert self is fdescr
- return fdescr2
- def __repr__(self):
- if self is fdescr:
- return 'fdescr'
- if self is fdescr2:
- return 'fdescr2'
- return compile.ResumeGuardDescr.__repr__(self)
- #
- def snapshot(fail_args, got=[]):
- if not got: # only the first time, i.e. when parsing 'ops'
- rd_frame_info_list = resume.FrameInfo(None, "code", 11)
- rd_snapshot = resume.Snapshot(None, fail_args)
- got.append(rd_frame_info_list)
- got.append(rd_snapshot)
- return got
- #
- fdescr = instantiate(FailDescr)
- self.namespace['fdescr'] = fdescr
- fdescr2 = instantiate(FailDescr)
- self.namespace['fdescr2'] = fdescr2
- def teardown_method(self, meth):
- self.namespace.pop('fdescr', None)
- self.namespace.pop('fdescr2', None)
- class BaseTestOptimizeBasic(BaseTestBasic):
- def test_simple(self):
- ops = """
- [i]
- i0 = int_sub(i, 1)
- guard_value(i0, 0) [i0]
- jump(i)
- """
- expected = """
- [i]
- i0 = int_sub(i, 1)
- guard_value(i0, 0) [i0]
- jump(1)
- """
- self.optimize_loop(ops, expected)
- 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_remove_guard_class_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- expected = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_class_2(self):
- ops = """
- [i0]
- p0 = new_with_vtable(ConstClass(node_vtable))
- escape(p0)
- guard_class(p0, ConstClass(node_vtable)) []
- jump(i0)
- """
- expected = """
- [i0]
- p0 = new_with_vtable(ConstClass(node_vtable))
- escape(p0)
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_class_constant(self):
- ops = """
- [i0]
- p0 = same_as(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)
- """
- expected = """
- [i0]
- i1 = int_lt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- 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)
- """
- expected = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- 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)
- """
- expected = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- 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)
- """
- expected = """
- [i0]
- i1 = int_gt(i0, 0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_remove_consecutive_guard_value_constfold(self):
- ops = """
- []
- i0 = escape()
- guard_value(i0, 0) []
- i1 = int_add(i0, 1)
- guard_value(i1, 1) []
- i2 = int_add(i1, 2)
- escape(i2)
- jump()
- """
- expected = """
- []
- i0 = escape()
- guard_value(i0, 0) []
- escape(3)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_value_if_constant(self):
- ops = """
- [p1]
- guard_value(p1, ConstPtr(myptr)) []
- jump(ConstPtr(myptr))
- """
- expected = """
- []
- jump()
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Constant(myptr)', expected)
- def test_ooisnull_oononnull_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- guard_nonnull(p0) []
- jump(p0)
- """
- expected = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- 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)
- """
- expected = """
- [i0]
- i1 = int_is_true(i0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_int_is_true_is_zero(self):
- py.test.skip("XXX implement me")
- ops = """
- [i0]
- i1 = int_is_true(i0)
- guard_true(i1) []
- i2 = int_is_zero(i0)
- guard_false(i2) []
- jump(i0)
- """
- expected = """
- [i0]
- i1 = int_is_true(i0)
- guard_true(i1) []
- jump(i0)
- """
- self.optimize_loop(ops, expected)
- def test_int_is_zero_int_is_true(self):
- ops = """
- [i0]
- i1 = int_is_zero(i0)
- guard_true(i1) []
- i2 = int_is_true(i0)
- guard_false(i2) []
- jump(i0)
- """
- expected = """
- [i0]
- i1 = int_is_zero(i0)
- guard_true(i1) []
- jump(0)
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_oononnull_2(self):
- ops = """
- [p0]
- guard_nonnull(p0) []
- guard_nonnull(p0) []
- jump(p0)
- """
- expected = """
- [p0]
- guard_nonnull(p0) []
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_on_null_ptr_1(self):
- ops = """
- []
- p0 = escape()
- guard_isnull(p0) []
- guard_isnull(p0) []
- jump()
- """
- expected = """
- []
- p0 = escape()
- guard_isnull(p0) []
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_ooisnull_oononnull_via_virtual(self):
- ops = """
- [p0]
- pv = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(pv, p0, descr=valuedescr)
- guard_nonnull(p0) []
- p1 = getfield_gc(pv, descr=valuedescr)
- guard_nonnull(p1) []
- jump(p0)
- """
- expected = """
- [p0]
- guard_nonnull(p0) []
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- def test_oois_1(self):
- ops = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i0 = instance_ptr_ne(p0, NULL)
- guard_true(i0) []
- i1 = instance_ptr_eq(p0, NULL)
- guard_false(i1) []
- i2 = instance_ptr_ne(NULL, p0)
- guard_true(i0) []
- i3 = instance_ptr_eq(NULL, p0)
- guard_false(i1) []
- jump(p0)
- """
- expected = """
- [p0]
- guard_class(p0, ConstClass(node_vtable)) []
- jump(p0)
- """
- self.optimize_loop(ops, expected)
- 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(i0) []
- i3 = ptr_eq(NULL, p0)
- guard_false(i1) []
- guard_nonnull(p0) []
- jump(p0)
- """
- expected = """
- [p0]
- setfield_gc(p0, 5, descr=valuedescr)
- jump(p0)
- """
- 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()
- 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)
- """
- expected = """
- [i]
- i1 = int_lt(i, 3)
- guard_true(i1) [i]
- jump(i)
- """
- self.optimize_loop(ops, expected)
- def test_guard_value_to_guard_false(self):
- ops = """
- [i]
- i1 = int_is_true(i)
- guard_value(i1, 0) [i]
- jump(i)
- """
- expected = """
- [i]
- i1 = int_is_true(i)
- guard_false(i1) [i]
- jump(i)
- """
- self.optimize_loop(ops, expected)
- def test_guard_value_on_nonbool(self):
- ops = """
- [i]
- i1 = int_add(i, 3)
- guard_value(i1, 0) [i]
- jump(i)
- """
- expected = """
- [i]
- i1 = int_add(i, 3)
- guard_value(i1, 0) [i]
- jump(-3)
- """
- self.optimize_loop(ops, expected)
- 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)
- """
- expected = """
- [i0, i1]
- i2 = int_gt(i0, i1)
- guard_false(i2) [i0, i1]
- jump(i0, i1)
- """
- self.optimize_loop(ops, expected)
- def test_p123_simple(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i1, p1, p2)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, ops)
- def test_p123_nested(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc(p3, descr=valuedescr)
- escape(i3)
- p1 = new_with_vtable(ConstClass(node_vtable))
- p1sub = new_with_vtable(ConstClass(node_vtable2))
- setfield_gc(p1sub, i1, descr=valuedescr)
- setfield_gc(p1, 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.
- self.optimize_loop(ops, ops)
- def test_p123_anti_nested(self):
- ops = """
- [i1, p2, p3]
- p3sub = getfield_gc(p3, descr=nextdescr)
- i3 = getfield_gc(p3sub, descr=valuedescr)
- escape(i3)
- p1 = new_with_vtable(ConstClass(node_vtable))
- p2sub = new_with_vtable(ConstClass(node_vtable2))
- 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.
- self.optimize_loop(ops, ops)
- # ----------
- def test_keep_guard_no_exception(self):
- ops = """
- [i1]
- i2 = call(i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- jump(i2)
- """
- self.optimize_loop(ops, ops)
- def test_keep_guard_no_exception_with_call_pure_that_is_not_folded(self):
- ops = """
- [i1]
- i2 = call_pure(123456, i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- jump(i2)
- """
- expected = """
- [i1]
- i2 = call(123456, i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- jump(i2)
- """
- self.optimize_loop(ops, expected)
- def test_remove_guard_no_exception_with_call_pure_on_constant_args(self):
- arg_consts = [ConstInt(i) for i in (123456, 81)]
- call_pure_results = {tuple(arg_consts): ConstInt(5)}
- ops = """
- [i1]
- i3 = same_as(81)
- i2 = call_pure(123456, i3, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- jump(i2)
- """
- expected = """
- [i1]
- jump(5)
- """
- self.optimize_loop(ops, expected, call_pure_results)
- def test_remove_guard_no_exception_with_duplicated_call_pure(self):
- ops = """
- [i1]
- i2 = call_pure(123456, i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- i3 = call_pure(123456, i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2, i3]
- jump(i3)
- """
- expected = """
- [i1]
- i2 = call(123456, i1, descr=nonwritedescr)
- guard_no_exception() [i1, i2]
- jump(i2)
- """
- self.optimize_loop(ops, expected)
- # ----------
- def test_call_loopinvariant(self):
- ops = """
- [i1]
- i2 = call_loopinvariant(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i2, 1) []
- i3 = call_loopinvariant(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i3, 1) []
- i4 = call_loopinvariant(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i4, 1) []
- jump(i1)
- """
- expected = """
- [i1]
- i2 = call(1, i1, descr=nonwritedescr)
- guard_no_exception() []
- guard_value(i2, 1) []
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- # ----------
- def test_virtual_1(self):
- ops = """
- [i, p0]
- i0 = getfield_gc(p0, descr=valuedescr)
- i1 = int_add(i0, i)
- setfield_gc(p0, i1, descr=valuedescr)
- jump(i, p0)
- """
- expected = """
- [i, i2]
- i1 = int_add(i2, i)
- jump(i, i1)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, Virtual(node_vtable, valuedescr=Not)',
- expected)
- def test_virtual_float(self):
- ops = """
- [f, p0]
- f0 = getfield_gc(p0, descr=floatdescr)
- f1 = float_add(f0, f)
- setfield_gc(p0, f1, descr=floatdescr)
- jump(f, p0)
- """
- expected = """
- [f, f2]
- f1 = float_add(f2, f)
- jump(f, f1)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, Virtual(node_vtable, floatdescr=Not)',
- expected)
- def test_virtual_2(self):
- ops = """
- [i, p0]
- i0 = getfield_gc(p0, descr=valuedescr)
- i1 = int_add(i0, i)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i, p1)
- """
- expected = """
- [i, i2]
- i1 = int_add(i2, i)
- jump(i, i1)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, Virtual(node_vtable, valuedescr=Not)',
- expected)
- 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 = """
- [p2]
- # all constant-folded :-)
- jump(p2)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, '''Virtual(node_vtable),
- Virtual(node_vtable),
- Not''',
- expected)
- #
- # 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, expected2)
- def test_virtual_default_field(self):
- ops = """
- [p0]
- i0 = getfield_gc(p0, descr=valuedescr)
- guard_value(i0, 0) []
- p1 = new_with_vtable(ConstClass(node_vtable))
- # the field 'value' has its default value of 0
- jump(p1)
- """
- expected = """
- [i]
- guard_value(i, 0) []
- jump(0)
- """
- # the 'expected' is sub-optimal, but it should be done by another later
- # optimization step. See test_find_nodes_default_field() for why.
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Virtual(node_vtable, valuedescr=Not)',
- expected)
- def test_virtual_3(self):
- ops = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- i0 = getfield_gc(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(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i2, descr=valuedescr)
- jump(i3, p1)
- """
- expected = """
- [i0, i1]
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- jump(i3, i2)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, Virtual(node_vtable, valuedescr=Not)',
- expected)
- def test_virtual_5(self):
- ops = """
- [i0, p0]
- guard_class(p0, ConstClass(node_vtable)) []
- i1 = getfield_gc(p0, descr=valuedescr)
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- p2 = new_with_vtable(ConstClass(node_vtable2))
- setfield_gc(p2, i1, descr=valuedescr)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i2, descr=valuedescr)
- setfield_gc(p1, p2, descr=nextdescr)
- jump(i3, p1)
- """
- expected = """
- [i0, i1, i1bis]
- i2 = int_sub(i1, 1)
- i3 = int_add(i0, i1)
- jump(i3, i2, i1)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops,
- '''Not, Virtual(node_vtable,
- valuedescr=Not,
- nextdescr=Virtual(node_vtable2,
- valuedescr=Not))''',
- expected)
- def test_virtual_constant_isnull(self):
- ops = """
- [i0]
- p0 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p0, NULL, descr=nextdescr)
- p2 = getfield_gc(p0, descr=nextdescr)
- i1 = ptr_eq(p2, NULL)
- jump(i1)
- """
- expected = """
- [i0]
- jump(1)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_constant_isnonnull(self):
- ops = """
- [i0]
- p0 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p0, ConstPtr(myptr), descr=nextdescr)
- p2 = getfield_gc(p0, descr=nextdescr)
- i1 = ptr_eq(p2, NULL)
- jump(i1)
- """
- expected = """
- [i0]
- jump(0)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_array_of_struct(self):
- ops = """
- [f0, f1, f2, f3]
- p0 = new_array(2, descr=complexarraydescr)
- setinteriorfield_gc(p0, 0, f1, descr=compleximagdescr)
- setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
- setinteriorfield_gc(p0, 1, f3, descr=compleximagdescr)
- setinteriorfield_gc(p0, 1, f2, descr=complexrealdescr)
- f4 = getinteriorfield_gc(p0, 0, descr=complexrealdescr)
- f5 = getinteriorfield_gc(p0, 1, descr=complexrealdescr)
- f6 = float_mul(f4, f5)
- f7 = getinteriorfield_gc(p0, 0, descr=compleximagdescr)
- f8 = getinteriorfield_gc(p0, 1, descr=compleximagdescr)
- f9 = float_mul(f7, f8)
- f10 = float_add(f6, f9)
- finish(f10)
- """
- expected = """
- [f0, f1, f2, f3]
- f4 = float_mul(f0, f2)
- f5 = float_mul(f1, f3)
- f6 = float_add(f4, f5)
- finish(f6)
- """
- self.optimize_loop(ops, expected)
- def test_virtual_array_of_struct_forced(self):
- ops = """
- [f0, f1]
- p0 = new_array(1, descr=complexarraydescr)
- setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
- setinteriorfield_gc(p0, 0, f1, descr=compleximagdescr)
- f2 = getinteriorfield_gc(p0, 0, descr=complexrealdescr)
- f3 = getinteriorfield_gc(p0, 0, descr=compleximagdescr)
- f4 = float_mul(f2, f3)
- i0 = escape(f4, p0)
- finish(i0)
- """
- expected = """
- [f0, f1]
- f2 = float_mul(f0, f1)
- p0 = new_array(1, descr=complexarraydescr)
- setinteriorfield_gc(p0, 0, f1, descr=compleximagdescr)
- setinteriorfield_gc(p0, 0, f0, descr=complexrealdescr)
- i0 = escape(f2, p0)
- finish(i0)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_1(self):
- ops = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- i0 = getfield_gc(p1, descr=valuedescr)
- i1 = int_add(i0, 1)
- escape(p1)
- escape(p1)
- jump(i1)
- """
- expected = """
- [i]
- i1 = int_add(i, 1)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- escape(p1)
- escape(p1)
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_2(self):
- ops = """
- [i, p0]
- i0 = getfield_gc(p0, descr=valuedescr)
- escape(p0)
- i1 = int_add(i0, i)
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i1, descr=valuedescr)
- jump(i, p1)
- """
- expected = ops
- self.optimize_loop(ops, expected)
- def test_nonvirtual_later(self):
- ops = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc(p1, descr=valuedescr)
- escape(p1)
- i2 = getfield_gc(p1, descr=valuedescr)
- i3 = int_add(i1, i2)
- jump(i3)
- """
- expected = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- escape(p1)
- i2 = getfield_gc(p1, descr=valuedescr)
- i3 = int_add(i, i2)
- jump(i3)
- """
- self.optimize_loop(ops, expected)
- def test_nonvirtual_dont_write_null_fields_on_force(self):
- ops = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc(p1, descr=valuedescr)
- setfield_gc(p1, 0, descr=valuedescr)
- escape(p1)
- i2 = getfield_gc(p1, descr=valuedescr)
- jump(i2)
- """
- expected = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- escape(p1)
- i2 = getfield_gc(p1, descr=valuedescr)
- jump(i2)
- """
- self.optimize_loop(ops, expected)
- def test_getfield_gc_pure_1(self):
- ops = """
- [i]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i, descr=valuedescr)
- i1 = getfield_gc_pure(p1, descr=valuedescr)
- jump(i1)
- """
- expected = """
- [i]
- jump(i)
- """
- self.optimize_loop(ops, expected)
- def test_getfield_gc_pure_2(self):
- ops = """
- [i]
- i1 = getfield_gc_pure(ConstPtr(myptr), descr=valuedescr)
- jump(i1)
- """
- expected = """
- [i]
- jump(5)
- """
- self.node.value = 5
- self.optimize_loop(ops, expected)
- def test_getfield_gc_nonpure_2(self):
- ops = """
- [i]
- i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- jump(i1)
- """
- expected = ops
- 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(p1, 1, descr=arraydescr)
- jump(i2)
- """
- expected = """
- [i1]
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- 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(p1, 1, descr=arraydescr)
- jump(i2)
- """
- expected = """
- [i1]
- jump(0)
- """
- self.optimize_loop(ops, expected)
- 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(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_dont_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(p1)
- jump(i1)
- """
- expected = """
- [i1]
- p1 = new_array(5, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- escape(p1)
- jump(i1)
- """
- self.optimize_loop(ops, expected)
- def test_varray_2(self):
- ops = """
- [i0, p1]
- i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
- i2 = getarrayitem_gc(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)
- """
- expected = """
- [i0, i1, i2]
- i3 = int_sub(i1, i2)
- guard_value(i3, 15) []
- jump(i0, 20, i0)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, VArray(arraydescr, Not, Not)', expected)
- def test_p123_array(self):
- ops = """
- [i1, p2, p3]
- i3 = getarrayitem_gc(p3, 0, descr=arraydescr)
- escape(i3)
- p1 = new_array(1, descr=arraydescr)
- setarrayitem_gc(p1, 0, i1, descr=arraydescr)
- jump(i1, p1, p2)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, ops)
- def test_varray_forced_1(self):
- ops = """
- []
- p2 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p2, 3, descr=valuedescr)
- i1 = getfield_gc(p2, descr=valuedescr) # i1 = const 3
- p1 = new_array(i1, descr=arraydescr)
- escape(p1)
- i2 = arraylen_gc(p1)
- escape(i2)
- jump()
- """
- expected = """
- []
- p1 = new_array(3, descr=arraydescr)
- escape(p1)
- i2 = arraylen_gc(p1)
- escape(i2)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_vstruct_1(self):
- ops = """
- [i1, p2]
- i2 = getfield_gc(p2, descr=adescr)
- escape(i2)
- p3 = new(descr=ssize)
- setfield_gc(p3, i1, descr=adescr)
- jump(i1, p3)
- """
- expected = """
- [i1, i2]
- escape(i2)
- jump(i1, i1)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Not, VStruct(ssize, adescr=Not)', expected)
- def test_p123_vstruct(self):
- ops = """
- [i1, p2, p3]
- i3 = getfield_gc(p3, descr=adescr)
- escape(i3)
- p1 = new(descr=ssize)
- setfield_gc(p1, i1, descr=adescr)
- jump(i1, p1, p2)
- """
- # We cannot track virtuals that survive for more than two iterations.
- self.optimize_loop(ops, ops)
- def test_duplicate_getfield_1(self):
- ops = """
- [p1, p2]
- i1 = getfield_gc(p1, descr=valuedescr)
- i2 = getfield_gc(p2, descr=valuedescr)
- i3 = getfield_gc(p1, descr=valuedescr)
- i4 = getfield_gc(p2, descr=valuedescr)
- escape(i1)
- escape(i2)
- escape(i3)
- escape(i4)
- jump(p1, p2)
- """
- expected = """
- [p1, p2]
- i1 = getfield_gc(p1, descr=valuedescr)
- i2 = getfield_gc(p2, descr=valuedescr)
- escape(i1)
- escape(i2)
- escape(i1)
- escape(i2)
- jump(p1, p2)
- """
- self.optimize_loop(ops, expected)
- def test_getfield_after_setfield(self):
- ops = """
- [p1, i1]
- setfield_gc(p1, i1, descr=valuedescr)
- i2 = getfield_gc(p1, descr=valuedescr)
- escape(i2)
- jump(p1, i1)
- """
- expected = """
- [p1, i1]
- setfield_gc(p1, i1, descr=valuedescr)
- escape(i1)
- jump(p1, i1)
- """
- self.optimize_loop(ops, expected)
- def test_setfield_of_different_type_does_not_clear(self):
- ops = """
- [p1, p2, i1]
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p2, p1, descr=nextdescr)
- i2 = getfield_gc(p1, descr=valuedescr)
- escape(i2)
- jump(p1, p2, i1)
- """
- expected = """
- [p1, p2, i1]
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p2, p1, descr=nextdescr)
- escape(i1)
- jump(p1, p2, i1)
- """
- self.optimize_loop(ops, expected)
- def test_setfield_of_same_type_clears(self):
- ops = """
- [p1, p2, i1, i2]
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p2, i2, descr=valuedescr)
- i3 = getfield_gc(p1, descr=valuedescr)
- escape(i3)
- jump(p1, p2, i1, i3)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_getfield_mergepoint_has_no_side_effects(self):
- ops = """
- [p1]
- i1 = getfield_gc(p1, descr=valuedescr)
- debug_merge_point(15, 0)
- i2 = getfield_gc(p1, descr=valuedescr)
- escape(i1)
- escape(i2)
- jump(p1)
- """
- expected = """
- [p1]
- i1 = getfield_gc(p1, descr=valuedescr)
- debug_merge_point(15, 0)
- escape(i1)
- escape(i1)
- jump(p1)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getfield_ovf_op_does_not_clear(self):
- ops = """
- [p1]
- i1 = getfield_gc(p1, descr=valuedescr)
- i2 = int_add_ovf(i1, 14)
- guard_no_overflow() []
- i3 = getfield_gc(p1, descr=valuedescr)
- escape(i2)
- escape(i3)
- jump(p1)
- """
- expected = """
- [p1]
- i1 = getfield_gc(p1, descr=valuedescr)
- i2 = int_add_ovf(i1, 14)
- guard_no_overflow() []
- escape(i2)
- escape(i1)
- jump(p1)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getfield_setarrayitem_does_not_clear(self):
- ops = """
- [p1, p2]
- i1 = getfield_gc(p1, descr=valuedescr)
- setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
- i3 = getfield_gc(p1, descr=valuedescr)
- escape(i1)
- escape(i3)
- jump(p1, p2)
- """
- expected = """
- [p1, p2]
- i1 = getfield_gc(p1, descr=valuedescr)
- setarrayitem_gc(p2, 0, p1, descr=arraydescr2)
- escape(i1)
- escape(i1)
- jump(p1, p2)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getfield_constant(self):
- ops = """
- []
- i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- escape(i1)
- escape(i2)
- jump()
- """
- expected = """
- []
- i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- escape(i1)
- escape(i1)
- jump()
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getfield_guard_value_const(self):
- ops = """
- [p1]
- guard_value(p1, ConstPtr(myptr)) []
- i1 = getfield_gc(p1, descr=valuedescr)
- i2 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- escape(i1)
- escape(i2)
- jump(p1)
- """
- expected = """
- []
- i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
- escape(i1)
- escape(i1)
- jump()
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Constant(myptr)', expected)
- def test_duplicate_getfield_sideeffects_1(self):
- ops = """
- [p1]
- i1 = getfield_gc(p1, descr=valuedescr)
- escape()
- i2 = getfield_gc(p1, descr=valuedescr)
- escape(i1)
- escape(i2)
- jump(p1)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_getfield_sideeffects_2(self):
- ops = """
- [p1, i1]
- setfield_gc(p1, i1, descr=valuedescr)
- escape()
- i2 = getfield_gc(p1, descr=valuedescr)
- escape(i2)
- jump(p1, i1)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_1(self):
- ops = """
- [p1, i1, i2]
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2)
- """
- expected = """
- [p1, i1, i2]
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_2(self):
- ops = """
- [p1, i1, i3]
- setfield_gc(p1, i1, descr=valuedescr)
- i2 = getfield_gc(p1, descr=valuedescr)
- setfield_gc(p1, i3, descr=valuedescr)
- escape(i2)
- jump(p1, i1, i3)
- """
- expected = """
- [p1, i1, i3]
- setfield_gc(p1, i3, descr=valuedescr)
- escape(i1)
- jump(p1, i1, i3)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_3(self):
- ops = """
- [p1, p2, i1, i3]
- setfield_gc(p1, i1, descr=valuedescr)
- i2 = getfield_gc(p2, descr=valuedescr)
- setfield_gc(p1, i3, descr=valuedescr)
- escape(i2)
- jump(p1, p2, i1, i3)
- """
- # potential aliasing of p1 and p2 means that we cannot kill the
- # the setfield_gc
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_4(self):
- ops = """
- [p1, i1, i2, p3]
- setfield_gc(p1, i1, descr=valuedescr)
- #
- # some operations on which the above setfield_gc cannot have effect
- i3 = getarrayitem_gc_pure(p3, 1, descr=arraydescr)
- i4 = getarrayitem_gc(p3, i3, descr=arraydescr)
- i5 = int_add(i3, i4)
- setarrayitem_gc(p3, 0, i5, descr=arraydescr)
- setfield_gc(p1, i4, descr=nextdescr)
- #
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2, p3)
- """
- expected = """
- [p1, i1, i2, p3]
- #
- i3 = getarrayitem_gc_pure(p3, 1, descr=arraydescr)
- i4 = getarrayitem_gc(p3, i3, descr=arraydescr)
- i5 = int_add(i3, i4)
- #
- setfield_gc(p1, i2, descr=valuedescr)
- setarrayitem_gc(p3, 0, i5, descr=arraydescr)
- setfield_gc(p1, i4, descr=nextdescr)
- jump(p1, i1, i2, p3)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_5(self):
- ops = """
- [p0, i1]
- p1 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p0, p1, descr=nextdescr)
- setfield_raw(i1, i1, descr=valuedescr) # random op with side-effects
- p2 = getfield_gc(p0, descr=nextdescr)
- i2 = getfield_gc(p2, descr=valuedescr)
- setfield_gc(p0, NULL, descr=nextdescr)
- escape(i2)
- jump(p0, i1)
- """
- expected = """
- [p0, i1]
- setfield_raw(i1, i1, descr=valuedescr)
- setfield_gc(p0, NULL, descr=nextdescr)
- escape(i1)
- jump(p0, i1)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_sideeffects_1(self):
- ops = """
- [p1, i1, i2]
- setfield_gc(p1, i1, descr=valuedescr)
- escape()
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_residual_guard_1(self):
- ops = """
- [p1, i1, i2, i3]
- setfield_gc(p1, i1, descr=valuedescr)
- guard_true(i3) []
- i4 = int_neg(i2)
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2, i4)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_residual_guard_2(self):
- # the difference with the previous test is that the field value is
- # a virtual, which we try hard to keep virtual
- ops = """
- [p1, i2, i3]
- p2 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p1, p2, descr=nextdescr)
- guard_true(i3) []
- i4 = int_neg(i2)
- setfield_gc(p1, NULL, descr=nextdescr)
- jump(p1, i2, i4)
- """
- expected = """
- [p1, i2, i3]
- guard_true(i3) [p1]
- i4 = int_neg(i2)
- setfield_gc(p1, NULL, descr=nextdescr)
- jump(p1, i2, i4)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_residual_guard_3(self):
- ops = """
- [p1, i2, i3]
- p2 = new_with_vtable(ConstClass(node_vtable))
- setfield_gc(p2, i2, descr=valuedescr)
- setfield_gc(p1, p2, descr=nextdescr)
- guard_true(i3) []
- i4 = int_neg(i2)
- setfield_gc(p1, NULL, descr=nextdescr)
- jump(p1, i2, i4)
- """
- expected = """
- [p1, i2, i3]
- guard_true(i3) [i2, p1]
- i4 = int_neg(i2)
- setfield_gc(p1, NULL, descr=nextdescr)
- jump(p1, i2, i4)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_setfield_residual_guard_4(self):
- # test that the setfield_gc does not end up between int_eq and
- # the following guard_true
- ops = """
- [p1, i1, i2, i3]
- setfield_gc(p1, i1, descr=valuedescr)
- i5 = int_eq(i3, 5)
- guard_true(i5) []
- i4 = int_neg(i2)
- setfield_gc(p1, i2, descr=valuedescr)
- jump(p1, i1, i2, i4)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_aliasing(self):
- # a case where aliasing issues (and not enough cleverness) mean
- # that we fail to remove any setfield_gc
- ops = """
- [p1, p2, i1, i2, i3]
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(p2, i2, descr=valuedescr)
- setfield_gc(p1, i3, descr=valuedescr)
- jump(p1, p2, i1, i2, i3)
- """
- self.optimize_loop(ops, ops)
- def test_duplicate_setfield_guard_value_const(self):
- ops = """
- [p1, i1, i2]
- guard_value(p1, ConstPtr(myptr)) []
- setfield_gc(p1, i1, descr=valuedescr)
- setfield_gc(ConstPtr(myptr), i2, descr=valuedescr)
- jump(p1, i1, i2)
- """
- expected = """
- [i1, i2]
- setfield_gc(ConstPtr(myptr), i2, descr=valuedescr)
- jump(i1, i2)
- """
- py.test.skip("XXX")
- self.optimize_loop(ops, 'Constant(myptr), Not, Not', expected)
- def test_duplicate_getarrayitem_1(self):
- ops = """
- [p1]
- p2 = getarrayitem_gc(p1, 0, descr=arraydescr2)
- p3 = getarrayitem_gc(p1, 1, descr=arraydescr2)
- p4 = getarrayitem_gc(p1, 0, descr=arraydescr2)
- p5 = getarrayitem_gc(p1, 1, descr=arraydescr2)
- escape(p2)
- escape(p3)
- escape(p4)
- escape(p5)
- jump(p1)
- """
- expected = """
- [p1]
- p2 = getarrayitem_gc(p1, 0, descr=arraydescr2)
- p3 = getarrayitem_gc(p1, 1, descr=arraydescr2)
- escape(p2)
- escape(p3)
- escape(p2)
- escape(p3)
- jump(p1)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getarrayitem_after_setarrayitem_1(self):
- ops = """
- [p1, p2]
- setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
- p3 = getarrayitem_gc(p1, 0, descr=arraydescr2)
- escape(p3)
- jump(p1, p3)
- """
- expected = """
- [p1, p2]
- setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
- escape(p2)
- jump(p1, p2)
- """
- self.optimize_loop(ops, expected)
- def test_duplicate_getarrayitem_after_setarrayitem_2(self):
- py.test.skip("setarrayitem with variable index")
- ops = """
- [p1, p2, p3, i1]
- setarrayitem_gc(p1, 0, p2, descr=arraydescr2)
- setarrayitem_gc(p1, i1, p3, descr=arraydesc…
Large files files are truncated, but you can click here to view the full file