Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r48432:f5825eff38c3 Date: 2011-10-25 15:41 +0200 http://bitbucket.org/pypy/pypy/changeset/f5825eff38c3/
Log: merge default diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py --- a/pypy/jit/backend/x86/assembler.py +++ b/pypy/jit/backend/x86/assembler.py @@ -1276,8 +1276,8 @@ genop_int_ne = _cmpop("NE", "NE") genop_int_gt = _cmpop("G", "L") genop_int_ge = _cmpop("GE", "LE") - genop_ptr_eq = genop_int_eq - genop_ptr_ne = genop_int_ne + genop_ptr_eq = genop_instance_ptr_eq = genop_int_eq + genop_ptr_ne = genop_instance_ptr_ne = genop_int_ne genop_float_lt = _cmpop_float('B', 'A') genop_float_le = _cmpop_float('BE', 'AE') @@ -1297,8 +1297,8 @@ genop_guard_int_ne = _cmpop_guard("NE", "NE", "E", "E") genop_guard_int_gt = _cmpop_guard("G", "L", "LE", "GE") genop_guard_int_ge = _cmpop_guard("GE", "LE", "L", "G") - genop_guard_ptr_eq = genop_guard_int_eq - genop_guard_ptr_ne = genop_guard_int_ne + genop_guard_ptr_eq = genop_guard_instance_ptr_eq = genop_guard_int_eq + genop_guard_ptr_ne = genop_guard_instance_ptr_ne = genop_guard_int_ne genop_guard_uint_gt = _cmpop_guard("A", "B", "BE", "AE") genop_guard_uint_lt = _cmpop_guard("B", "A", "AE", "BE") diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py --- a/pypy/jit/backend/x86/regalloc.py +++ b/pypy/jit/backend/x86/regalloc.py @@ -651,8 +651,8 @@ consider_uint_lt = _consider_compop consider_uint_le = _consider_compop consider_uint_ge = _consider_compop - consider_ptr_eq = _consider_compop - consider_ptr_ne = _consider_compop + consider_ptr_eq = consider_instance_ptr_eq = _consider_compop + consider_ptr_ne = consider_instance_ptr_ne = _consider_compop def _consider_float_op(self, op): loc1 = self.xrm.loc(op.getarg(1)) diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py --- a/pypy/jit/codewriter/jtransform.py +++ b/pypy/jit/codewriter/jtransform.py @@ -800,6 +800,9 @@ def _is_gc(self, v): return getattr(getattr(v.concretetype, "TO", None), "_gckind", "?") == 'gc' + def _is_rclass_instance(self, v): + return lltype._castdepth(v.concretetype.TO, rclass.OBJECT) >= 0 + def _rewrite_cmp_ptrs(self, op): if self._is_gc(op.args[0]): return op @@ -817,11 +820,21 @@ return self._rewrite_equality(op, 'int_is_true') def rewrite_op_ptr_eq(self, op): - op1 = self._rewrite_equality(op, 'ptr_iszero') + prefix = '' + if self._is_rclass_instance(op.args[0]): + assert self._is_rclass_instance(op.args[1]) + op = SpaceOperation('instance_ptr_eq', op.args, op.result) + prefix = 'instance_' + op1 = self._rewrite_equality(op, prefix + 'ptr_iszero') return self._rewrite_cmp_ptrs(op1) def rewrite_op_ptr_ne(self, op): - op1 = self._rewrite_equality(op, 'ptr_nonzero') + prefix = '' + if self._is_rclass_instance(op.args[0]): + assert self._is_rclass_instance(op.args[1]) + op = SpaceOperation('instance_ptr_ne', op.args, op.result) + prefix = 'instance_' + op1 = self._rewrite_equality(op, prefix + 'ptr_nonzero') return self._rewrite_cmp_ptrs(op1) rewrite_op_ptr_iszero = _rewrite_cmp_ptrs diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py --- a/pypy/jit/codewriter/test/test_jtransform.py +++ b/pypy/jit/codewriter/test/test_jtransform.py @@ -576,10 +576,10 @@ assert op1.args == [v2] def test_ptr_eq(): - v1 = varoftype(rclass.OBJECTPTR) - v2 = varoftype(rclass.OBJECTPTR) + v1 = varoftype(lltype.Ptr(rstr.STR)) + v2 = varoftype(lltype.Ptr(rstr.STR)) v3 = varoftype(lltype.Bool) - c0 = const(lltype.nullptr(rclass.OBJECT)) + c0 = const(lltype.nullptr(rstr.STR)) # for opname, reducedname in [('ptr_eq', 'ptr_iszero'), ('ptr_ne', 'ptr_nonzero')]: @@ -598,6 +598,31 @@ assert op1.opname == reducedname assert op1.args == [v2] +def test_instance_ptr_eq(): + v1 = varoftype(rclass.OBJECTPTR) + v2 = varoftype(rclass.OBJECTPTR) + v3 = varoftype(lltype.Bool) + c0 = const(lltype.nullptr(rclass.OBJECT)) + + for opname, newopname, reducedname in [ + ('ptr_eq', 'instance_ptr_eq', 'instance_ptr_iszero'), + ('ptr_ne', 'instance_ptr_ne', 'instance_ptr_nonzero') + ]: + op = SpaceOperation(opname, [v1, v2], v3) + op1 = Transformer().rewrite_operation(op) + assert op1.opname == newopname + assert op1.args == [v1, v2] + + op = SpaceOperation(opname, [v1, c0], v3) + op1 = Transformer().rewrite_operation(op) + assert op1.opname == reducedname + assert op1.args == [v1] + + op = SpaceOperation(opname, [c0, v1], v3) + op1 = Transformer().rewrite_operation(op) + assert op1.opname == reducedname + assert op1.args == [v1] + def test_nongc_ptr_eq(): v1 = varoftype(rclass.NONGCOBJECTPTR) v2 = varoftype(rclass.NONGCOBJECTPTR) diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py --- a/pypy/jit/metainterp/blackhole.py +++ b/pypy/jit/metainterp/blackhole.py @@ -499,6 +499,12 @@ @arguments("r", returns="i") def bhimpl_ptr_nonzero(a): return bool(a) + @arguments("r", "r", returns="i") + def bhimpl_instance_ptr_eq(a, b): + return a == b + @arguments("r", "r", returns="i") + def bhimpl_instance_ptr_ne(a, b): + return a != b @arguments("r", returns="r") def bhimpl_cast_opaque_ptr(a): return a diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py --- a/pypy/jit/metainterp/optimizeopt/rewrite.py +++ b/pypy/jit/metainterp/optimizeopt/rewrite.py @@ -337,7 +337,7 @@ def optimize_INT_IS_ZERO(self, op): self._optimize_nullness(op, op.getarg(0), False) - def _optimize_oois_ooisnot(self, op, expect_isnot): + def _optimize_oois_ooisnot(self, op, expect_isnot, instance): value0 = self.getvalue(op.getarg(0)) value1 = self.getvalue(op.getarg(1)) if value0.is_virtual(): @@ -355,21 +355,28 @@ elif value0 is value1: self.make_constant_int(op.result, not expect_isnot) else: - cls0 = value0.get_constant_class(self.optimizer.cpu) - if cls0 is not None: - cls1 = value1.get_constant_class(self.optimizer.cpu) - if cls1 is not None and not cls0.same_constant(cls1): - # cannot be the same object, as we know that their - # class is different - self.make_constant_int(op.result, expect_isnot) - return + if instance: + cls0 = value0.get_constant_class(self.optimizer.cpu) + if cls0 is not None: + cls1 = value1.get_constant_class(self.optimizer.cpu) + if cls1 is not None and not cls0.same_constant(cls1): + # cannot be the same object, as we know that their + # class is different + self.make_constant_int(op.result, expect_isnot) + return self.emit_operation(op) + def optimize_PTR_EQ(self, op): + self._optimize_oois_ooisnot(op, False, False) + def optimize_PTR_NE(self, op): - self._optimize_oois_ooisnot(op, True) + self._optimize_oois_ooisnot(op, True, False) - def optimize_PTR_EQ(self, op): - self._optimize_oois_ooisnot(op, False) + def optimize_INSTANCE_PTR_EQ(self, op): + self._optimize_oois_ooisnot(op, False, True) + + def optimize_INSTANCE_PTR_NE(self, op): + self._optimize_oois_ooisnot(op, True, True) ## def optimize_INSTANCEOF(self, op): ## value = self.getvalue(op.args[0]) diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -508,13 +508,13 @@ ops = """ [p0] guard_class(p0, ConstClass(node_vtable)) [] - i0 = ptr_ne(p0, NULL) + i0 = instance_ptr_ne(p0, NULL) guard_true(i0) [] - i1 = ptr_eq(p0, NULL) + i1 = instance_ptr_eq(p0, NULL) guard_false(i1) [] - i2 = ptr_ne(NULL, p0) + i2 = instance_ptr_ne(NULL, p0) guard_true(i0) [] - i3 = ptr_eq(NULL, p0) + i3 = instance_ptr_eq(NULL, p0) guard_false(i1) [] jump(p0) """ @@ -2026,7 +2026,7 @@ ops = """ [p1] guard_class(p1, ConstClass(node_vtable2)) [] - i = ptr_ne(ConstPtr(myptr), p1) + i = instance_ptr_ne(ConstPtr(myptr), p1) guard_true(i) [] jump(p1) """ diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -2683,7 +2683,7 @@ ops = """ [p1] guard_class(p1, ConstClass(node_vtable2)) [] - i = ptr_ne(ConstPtr(myptr), p1) + i = instance_ptr_ne(ConstPtr(myptr), p1) guard_true(i) [] jump(p1) """ @@ -3331,7 +3331,7 @@ jump(p1, i1, i2, i6) ''' self.optimize_loop(ops, expected, preamble) - + # ---------- @@ -7280,7 +7280,7 @@ ops = """ [p1, p2] setarrayitem_gc(p1, 2, 10, descr=arraydescr) - setarrayitem_gc(p2, 3, 13, descr=arraydescr) + setarrayitem_gc(p2, 3, 13, descr=arraydescr) call(0, p1, p2, 0, 0, 10, descr=arraycopydescr) jump(p1, p2) """ diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -165,7 +165,7 @@ if not we_are_translated(): for b in registers[count:]: assert not oldbox.same_box(b) - + def make_result_of_lastop(self, resultbox): got_type = resultbox.type @@ -199,7 +199,7 @@ 'float_add', 'float_sub', 'float_mul', 'float_truediv', 'float_lt', 'float_le', 'float_eq', 'float_ne', 'float_gt', 'float_ge', - 'ptr_eq', 'ptr_ne', + 'ptr_eq', 'ptr_ne', 'instance_ptr_eq', 'instance_ptr_ne', ]: exec py.code.Source(''' @arguments("box", "box") @@ -604,7 +604,7 @@ opimpl_setinteriorfield_gc_i = _opimpl_setinteriorfield_gc_any opimpl_setinteriorfield_gc_f = _opimpl_setinteriorfield_gc_any opimpl_setinteriorfield_gc_r = _opimpl_setinteriorfield_gc_any - + @arguments("box", "descr") def _opimpl_getfield_raw_any(self, box, fielddescr): diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py --- a/pypy/jit/metainterp/resoperation.py +++ b/pypy/jit/metainterp/resoperation.py @@ -437,6 +437,8 @@ # 'PTR_EQ/2b', 'PTR_NE/2b', + 'INSTANCE_PTR_EQ/2b', + 'INSTANCE_PTR_NE/2b', 'CAST_OPAQUE_PTR/1b', # 'ARRAYLEN_GC/1d', diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py --- a/pypy/jit/metainterp/test/test_ajit.py +++ b/pypy/jit/metainterp/test/test_ajit.py @@ -3436,7 +3436,7 @@ res = self.meta_interp(f, [16]) assert res == f(16) - def test_ptr_eq_str_constants(self): + def test_ptr_eq(self): myjitdriver = JitDriver(greens = [], reds = ["n", "x"]) class A(object): def __init__(self, v): @@ -3452,6 +3452,42 @@ res = self.meta_interp(f, [10, 1]) assert res == 0 + def test_instance_ptr_eq(self): + myjitdriver = JitDriver(greens = [], reds = ["n", "i", "a1", "a2"]) + class A(object): + pass + def f(n): + a1 = A() + a2 = A() + i = 0 + while n > 0: + myjitdriver.jit_merge_point(n=n, i=i, a1=a1, a2=a2) + if n % 2: + a = a2 + else: + a = a1 + i += a is a1 + n -= 1 + return i + res = self.meta_interp(f, [10]) + assert res == f(10) + def f(n): + a1 = A() + a2 = A() + i = 0 + while n > 0: + myjitdriver.jit_merge_point(n=n, i=i, a1=a1, a2=a2) + if n % 2: + a = a2 + else: + a = a1 + if a is a2: + i += 1 + n -= 1 + return i + res = self.meta_interp(f, [10]) + assert res == f(10) + def test_virtual_array_of_structs(self): myjitdriver = JitDriver(greens = [], reds=["n", "d"]) def f(n): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit