Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult Changeset: r74990:e42a2a263bf7 Date: 2014-12-17 19:29 +0200 http://bitbucket.org/pypy/pypy/changeset/e42a2a263bf7/
Log: progress diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py --- a/rpython/jit/metainterp/logger.py +++ b/rpython/jit/metainterp/logger.py @@ -1,6 +1,6 @@ from rpython.jit.metainterp.history import (ConstInt, BoxInt, ConstFloat, BoxFloat, TargetToken) -from rpython.jit.metainterp.resoperation import rop +from rpython.jit.metainterp.resoperation import rop, AbstractInputArg from rpython.rlib.debug import (have_debug_prints, debug_start, debug_stop, debug_print) from rpython.rlib.objectmodel import we_are_translated, compute_unique_id @@ -132,6 +132,8 @@ return '?' def repr_of_resop(self, op, ops_offset=None): + if isinstance(op, AbstractInputArg): + return self.repr_of_arg(op) if op.getopnum() == rop.DEBUG_MERGE_POINT: jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()] s = jd_sd.warmstate.get_location_str(op.getarglist()[3:]) @@ -196,6 +198,8 @@ offset = ops_offset[None] debug_print("+%d: --end of the loop--" % offset) + def log_loop(self, loop): + self._log_operations(loop.inputargs, loop.operations) def int_could_be_an_address(x): if we_are_translated(): diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -151,7 +151,11 @@ getop.source_op = result if isinstance(result, Const): optimizer.make_constant(getop, result) - shortboxes.add_potential(result, getop, synthetic=True) + getop.is_source_op = True + shortboxes.add_potential(getop, getop, synthetic=True) + else: + getop.source_op = result + shortboxes.add_potential(result, getop, synthetic=True) if op.getopnum() == rop.SETARRAYITEM_GC: result = op.getarg(2) opnum = OpHelpers.getarrayitem_for_descr(op.getdescr()) @@ -159,6 +163,7 @@ op.getdescr()) getop.source_op = result if isinstance(result, Const): + xxx optimizer.make_constant(getop, result) shortboxes.add_potential(result, getop, synthetic=True) elif op.type != 'v': diff --git a/rpython/jit/metainterp/optimizeopt/intutils.py b/rpython/jit/metainterp/optimizeopt/intutils.py --- a/rpython/jit/metainterp/optimizeopt/intutils.py +++ b/rpython/jit/metainterp/optimizeopt/intutils.py @@ -1,7 +1,7 @@ from rpython.rlib.rarithmetic import ovfcheck, LONG_BIT, maxint, is_valid_int from rpython.rlib.objectmodel import we_are_translated from rpython.jit.metainterp.resoperation import rop, ResOperation -from rpython.jit.metainterp.history import BoxInt, ConstInt +from rpython.jit.metainterp.history import ConstInt MAXINT = maxint MININT = -maxint - 1 @@ -238,17 +238,15 @@ def make_guards(self, box, guards): if self.has_lower and self.lower > MININT: bound = self.lower - res = BoxInt() - op = ResOperation(rop.INT_GE, [box, ConstInt(bound)], res) + op = ResOperation(rop.INT_GE, [box, ConstInt(bound)]) guards.append(op) - op = ResOperation(rop.GUARD_TRUE, [res], None) + op = ResOperation(rop.GUARD_TRUE, [op]) guards.append(op) if self.has_upper and self.upper < MAXINT: bound = self.upper - res = BoxInt() - op = ResOperation(rop.INT_LE, [box, ConstInt(bound)], res) + op = ResOperation(rop.INT_LE, [box, ConstInt(bound)]) guards.append(op) - op = ResOperation(rop.GUARD_TRUE, [res], None) + op = ResOperation(rop.GUARD_TRUE, [op]) guards.append(op) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -105,7 +105,7 @@ # 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): + def _clone_if_mutable(self, memo): assert self is fdescr return fdescr2 def __repr__(self): @@ -1809,7 +1809,7 @@ def test_virtual_raw_malloc_force(self): ops = """ [i1] - i2 = call('malloc', 20, descr=raw_malloc_descr) + i2 = call_i('malloc', 20, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i2, 0, i1, descr=rawarraydescr_char) setarrayitem_raw(i2, 2, 456, descr=rawarraydescr_char) @@ -1817,20 +1817,20 @@ setarrayitem_raw(i2, 1, 789, descr=rawarraydescr_float) label('foo') # we expect the buffer to be forced *after* the label escape_n(i2) - call('free', i2, descr=raw_free_descr) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ expected = """ [i1] label('foo') - i2 = call('malloc', 20, descr=raw_malloc_descr) + i2 = call_i('malloc', 20, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear raw_store(i2, 0, i1, descr=rawarraydescr_char) raw_store(i2, 1, 123, descr=rawarraydescr_char) raw_store(i2, 2, 456, descr=rawarraydescr_char) raw_store(i2, 8, 789, descr=rawarraydescr_float) escape_n(i2) - call('free', i2, descr=raw_free_descr) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ self.optimize_loop(ops, expected) @@ -1838,22 +1838,22 @@ def test_virtual_raw_malloc_invalid_write_force(self): ops = """ [i1] - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i2, 0, i1, descr=rawarraydescr) label('foo') # we expect the buffer to be forced *after* the label setarrayitem_raw(i2, 2, 456, descr=rawarraydescr_char) # overlap! - call('free', i2, descr=raw_free_descr) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ expected = """ [i1] label('foo') - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear raw_store(i2, 0, i1, descr=rawarraydescr) setarrayitem_raw(i2, 2, 456, descr=rawarraydescr_char) - call('free', i2, descr=raw_free_descr) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ self.optimize_loop(ops, expected) @@ -1861,22 +1861,22 @@ def test_virtual_raw_malloc_invalid_read_force(self): ops = """ [i1] - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i2, 0, i1, descr=rawarraydescr) label('foo') # we expect the buffer to be forced *after* the label - i3 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char) - call('free', i2, descr=raw_free_descr) + i3 = getarrayitem_raw_i(i2, 0, descr=rawarraydescr_char) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ expected = """ [i1] label('foo') - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear raw_store(i2, 0, i1, descr=rawarraydescr) - i3 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char) - call('free', i2, descr=raw_free_descr) + i3 = getarrayitem_raw_i(i2, 0, descr=rawarraydescr_char) + call_n('free', i2, descr=raw_free_descr) jump(i1) """ self.optimize_loop(ops, expected) @@ -1884,15 +1884,15 @@ def test_virtual_raw_slice(self): ops = """ [i0, i1] - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i2, 0, 42, descr=rawarraydescr_char) i3 = int_add(i2, 1) # get a slice of the original buffer setarrayitem_raw(i3, 0, 4242, descr=rawarraydescr) # write to the slice - i4 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char) + i4 = getarrayitem_raw_i(i2, 0, descr=rawarraydescr_char) i5 = int_add(i2, 1) - i6 = getarrayitem_raw(i5, 0, descr=rawarraydescr) - call('free', i2, descr=raw_free_descr) + i6 = getarrayitem_raw_i(i5, 0, descr=rawarraydescr) + call_n('free', i2, descr=raw_free_descr) jump(i0, i1) """ expected = """ @@ -1904,13 +1904,13 @@ def test_virtual_raw_slice_of_a_raw_slice(self): ops = """ [i0, i1] - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] i3 = int_add(i2, 1) # get a slice of the original buffer i4 = int_add(i3, 1) # get a slice of a slice setarrayitem_raw(i4, 0, i1, descr=rawarraydescr_char) # write to the slice - i5 = getarrayitem_raw(i2, 2, descr=rawarraydescr_char) - call('free', i2, descr=raw_free_descr) + i5 = getarrayitem_raw_i(i2, 2, descr=rawarraydescr_char) + call_n('free', i2, descr=raw_free_descr) jump(i0, i5) """ expected = """ @@ -1922,7 +1922,7 @@ def test_virtual_raw_slice_force(self): ops = """ [i0, i1] - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i2, 0, 42, descr=rawarraydescr_char) i3 = int_add(i2, 1) # get a slice of the original buffer @@ -1935,7 +1935,7 @@ [i0, i1] label('foo') # these ops are generated by VirtualRawBufferValue._really_force - i2 = call('malloc', 10, descr=raw_malloc_descr) + i2 = call_i('malloc', 10, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear raw_store(i2, 0, 42, descr=rawarraydescr_char) raw_store(i2, 5, 4242, descr=rawarraydescr_char) @@ -1949,10 +1949,10 @@ def test_virtual_raw_malloc_virtualstate(self): ops = """ [i0] - i1 = getarrayitem_raw(i0, 0, descr=rawarraydescr) + i1 = getarrayitem_raw_i(i0, 0, descr=rawarraydescr) i2 = int_add(i1, 1) - call('free', i0, descr=raw_free_descr) - i3 = call('malloc', 10, descr=raw_malloc_descr) + call_n('free', i0, descr=raw_free_descr) + i3 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i3, 0, i2, descr=rawarraydescr) label('foo') @@ -1960,11 +1960,11 @@ """ expected = """ [i0] - i1 = getarrayitem_raw(i0, 0, descr=rawarraydescr) + i1 = getarrayitem_raw_i(i0, 0, descr=rawarraydescr) i2 = int_add(i1, 1) - call('free', i0, descr=raw_free_descr) + call_n('free', i0, descr=raw_free_descr) label('foo') - i3 = call('malloc', 10, descr=raw_malloc_descr) + i3 = call_i('malloc', 10, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear raw_store(i3, 0, i2, descr=rawarraydescr) jump(i3) @@ -1974,12 +1974,12 @@ def test_virtual_raw_store_raw_load(self): ops = """ [i1] - i0 = call('malloc', 10, descr=raw_malloc_descr) + i0 = call_i('malloc', 10, descr=raw_malloc_descr) guard_no_exception() [] raw_store(i0, 0, i1, descr=rawarraydescr) - i2 = raw_load(i0, 0, descr=rawarraydescr) + i2 = raw_load_i(i0, 0, descr=rawarraydescr) i3 = int_add(i1, i2) - call('free', i0, descr=raw_free_descr) + call_n('free', i0, descr=raw_free_descr) jump(i3) """ expected = """ @@ -1992,12 +1992,12 @@ def test_virtual_raw_store_getarrayitem_raw(self): ops = """ [f1] - i0 = call('malloc', 16, descr=raw_malloc_descr) + i0 = call_i('malloc', 16, descr=raw_malloc_descr) guard_no_exception() [] raw_store(i0, 8, f1, descr=rawarraydescr_float) - f2 = getarrayitem_raw(i0, 1, descr=rawarraydescr_float) + f2 = getarrayitem_raw_f(i0, 1, descr=rawarraydescr_float) f3 = float_add(f1, f2) - call('free', i0, descr=raw_free_descr) + call_n('free', i0, descr=raw_free_descr) jump(f3) """ expected = """ @@ -2010,12 +2010,12 @@ def test_virtual_setarrayitem_raw_raw_load(self): ops = """ [f1] - i0 = call('malloc', 16, descr=raw_malloc_descr) + i0 = call_i('malloc', 16, descr=raw_malloc_descr) guard_no_exception() [] setarrayitem_raw(i0, 1, f1, descr=rawarraydescr_float) - f2 = raw_load(i0, 8, descr=rawarraydescr_float) + f2 = raw_load_f(i0, 8, descr=rawarraydescr_float) f3 = float_add(f1, f2) - call('free', i0, descr=raw_free_descr) + call_n('free', i0, descr=raw_free_descr) jump(f3) """ expected = """ @@ -2028,7 +2028,7 @@ def test_virtual_raw_buffer_forced_but_slice_not_forced(self): ops = """ [f1] - i0 = call('malloc', 16, descr=raw_malloc_descr) + i0 = call_i('malloc', 16, descr=raw_malloc_descr) guard_no_exception() [] i1 = int_add(i0, 8) escape_n(i0) @@ -2037,7 +2037,7 @@ """ expected = """ [f1] - i0 = call('malloc', 16, descr=raw_malloc_descr) + i0 = call_i('malloc', 16, descr=raw_malloc_descr) #guard_no_exception() [] # XXX should appear escape_n(i0) i1 = int_add(i0, 8) @@ -2263,14 +2263,18 @@ setfield_gc(p1, i2, descr=valuedescr) jump(p1, i1, i2) """ - expected = """ + preamble = """ [p1, i1, i2] setfield_gc(p1, i2, descr=valuedescr) jump(p1, i1, i2) """ + expected = """ + [p1, i1, i2] + jump(p1, i1, i2) + """ # in this case, all setfields are removed, because we can prove # that in the loop it will always have the same value - self.optimize_loop(ops, expected) + self.optimize_loop(ops, expected, preamble) def test_duplicate_setfield_1(self): ops = """ @@ -2326,7 +2330,7 @@ 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) + i3 = getarrayitem_gc_pure_i(p3, 1, descr=arraydescr) i4 = getarrayitem_gc_i(p3, i3, descr=arraydescr) i5 = int_add(i3, i4) setarrayitem_gc(p3, 0, i5, descr=arraydescr) @@ -2339,7 +2343,7 @@ preamble = """ [p1, i1, i2, p3] # - i3 = getarrayitem_gc_pure(p3, 1, descr=arraydescr) + i3 = getarrayitem_gc_pure_i(p3, 1, descr=arraydescr) i4 = getarrayitem_gc_i(p3, i3, descr=arraydescr) i5 = int_add(i3, i4) # @@ -2370,7 +2374,7 @@ 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) + p2 = getfield_gc_r(p0, descr=nextdescr) i2 = getfield_gc_i(p2, descr=valuedescr) setfield_gc(p0, NULL, descr=nextdescr) escape_n(i2) @@ -2410,8 +2414,8 @@ guard_true(i3) [] i4 = int_neg(i2) setfield_gc(p1, i2, descr=valuedescr) - i7 = same_as(i2) # This same_as should be killed by backend - i6 = same_as(i4) + i7 = same_as_i(i2) # This same_as should be killed by backend + i6 = same_as_i(i4) jump(p1, i1, i2, i4, i6) """ expected = """ @@ -2793,10 +2797,10 @@ [p1] guard_nonnull(p1) [] guard_class(p1, ConstClass(node_vtable2)) [] - p2 = getfield_gc(p1, descr=nextdescr) + p2 = getfield_gc_r(p1, descr=nextdescr) guard_nonnull(12) [] guard_class(p2, ConstClass(node_vtable)) [] - p3 = getfield_gc(p1, descr=otherdescr) + p3 = getfield_gc_r(p1, descr=otherdescr) guard_nonnull(12) [] guard_class(p3, ConstClass(node_vtable)) [] setfield_gc(p3, p2, descr=otherdescr) @@ -2811,9 +2815,9 @@ preamble = """ [p1] guard_nonnull_class(p1, ConstClass(node_vtable2)) [] - p2 = getfield_gc(p1, descr=nextdescr) + p2 = getfield_gc_r(p1, descr=nextdescr) guard_class(p2, ConstClass(node_vtable)) [] - p3 = getfield_gc(p1, descr=otherdescr) + p3 = getfield_gc_r(p1, descr=otherdescr) guard_class(p3, ConstClass(node_vtable)) [] p3a = new_with_vtable(ConstClass(node_vtable)) setfield_gc(p3, p2, descr=otherdescr) @@ -2842,10 +2846,10 @@ [p1] guard_nonnull(p1) [] guard_class(p1, ConstClass(node_vtable2)) [] - p2 = getfield_gc(p1, descr=nextdescr) + p2 = getfield_gc_r(p1, descr=nextdescr) guard_nonnull(12) [] guard_class(p2, ConstClass(node_vtable)) [] - p3 = getfield_gc(p1, descr=otherdescr) + p3 = getfield_gc_r(p1, descr=otherdescr) guard_nonnull(12) [] guard_class(p3, ConstClass(node_vtable)) [] p1a = new_with_vtable(ConstClass(node_vtable2)) @@ -2860,9 +2864,9 @@ preamble = """ [p1] guard_nonnull_class(p1, ConstClass(node_vtable2)) [] - p2 = getfield_gc(p1, descr=nextdescr) + p2 = getfield_gc_r(p1, descr=nextdescr) guard_class(p2, ConstClass(node_vtable)) [] - p3 = getfield_gc(p1, descr=otherdescr) + p3 = getfield_gc_r(p1, descr=otherdescr) guard_class(p3, ConstClass(node_vtable)) [] # p1a = new_with_vtable(ConstClass(node_vtable2)) p3a = new_with_vtable(ConstClass(node_vtable)) @@ -2907,11 +2911,11 @@ ops = """ [p0] i0 = escape_i() - i2 = getfield_gc(p0, descr=valuedescr) + i2 = getfield_gc_i(p0, descr=valuedescr) i4 = int_add(i2, 1) setfield_gc(p0, i4, descr=valuedescr) guard_true(i0) [] - i6 = getfield_gc(p0, descr=valuedescr) + i6 = getfield_gc_i(p0, descr=valuedescr) i8 = int_sub(i6, 1) setfield_gc(p0, i8, descr=valuedescr) escape_n() @@ -2920,7 +2924,7 @@ expected = """ [p0] i0 = escape_i() - i2 = getfield_gc(p0, descr=valuedescr) + i2 = getfield_gc_i(p0, descr=valuedescr) i4 = int_add(i2, 1) setfield_gc(p0, i4, descr=valuedescr) guard_true(i0) [] @@ -2954,7 +2958,7 @@ def test_invalid_loop_3(self): ops = """ [p1] - p2 = getfield_gc(p1, descr=nextdescr) + p2 = getfield_gc_r(p1, descr=nextdescr) guard_isnull(p2) [] # p3 = new_with_vtable(ConstClass(node_vtable)) @@ -3092,8 +3096,8 @@ def test_oois_of_itself(self): ops = """ [p0] - p1 = getfield_gc(p0, descr=nextdescr) - p2 = getfield_gc(p0, descr=nextdescr) + p1 = getfield_gc_r(p0, descr=nextdescr) + p2 = getfield_gc_r(p0, descr=nextdescr) i1 = ptr_eq(p1, p2) guard_true(i1) [] i2 = ptr_ne(p1, p2) @@ -3102,7 +3106,7 @@ """ preamble = """ [p0] - p1 = getfield_gc(p0, descr=nextdescr) + p1 = getfield_gc_r(p0, descr=nextdescr) jump(p0) """ expected = """ @@ -3245,8 +3249,8 @@ [p8, p11, i24] p26 = new_with_vtable(ConstClass(node_vtable)) setfield_gc(p26, i24, descr=adescr) - i34 = getfield_gc_pure(p11, descr=valuedescr) - i35 = getfield_gc_pure(p26, descr=adescr) + i34 = getfield_gc_pure_i(p11, descr=valuedescr) + i35 = getfield_gc_pure_i(p26, descr=adescr) i36 = int_add_ovf(i34, i35) guard_no_overflow() [] jump(p8, p11, i35) @@ -3260,21 +3264,21 @@ def test_ovf_guard_in_short_preamble2(self): ops = """ [p8, p11, p12] - p16 = getfield_gc(p8, descr=valuedescr) - i17 = getfield_gc(p8, descr=nextdescr) - i19 = getfield_gc(p16, descr=valuedescr) + p16 = getfield_gc_r(p8, descr=valuedescr) + i17 = getfield_gc_i(p8, descr=nextdescr) + i19 = getfield_gc_i(p16, descr=valuedescr) i20 = int_ge(i17, i19) guard_false(i20) [] - i21 = getfield_gc(p16, descr=otherdescr) - i22 = getfield_gc(p16, descr=nextdescr) + i21 = getfield_gc_i(p16, descr=otherdescr) + i22 = getfield_gc_i(p16, descr=nextdescr) i23 = int_mul(i17, i22) i24 = int_add(i21, i23) p26 = new_with_vtable(ConstClass(node_vtable)) setfield_gc(p26, i24, descr=adescr) i28 = int_add(i17, 1) setfield_gc(p8, i28, descr=nextdescr) - i34 = getfield_gc_pure(p11, descr=valuedescr) - i35 = getfield_gc_pure(p26, descr=adescr) + i34 = getfield_gc_pure_i(p11, descr=valuedescr) + i35 = getfield_gc_pure_i(p26, descr=adescr) guard_nonnull(p12) [] i36 = int_add_ovf(i34, i35) guard_no_overflow() [] @@ -3286,7 +3290,7 @@ [p8, p11, i24, i39, i19, p16, i21, i34] i40 = int_ge(i39, i19) guard_false(i40) [] - i41 = getfield_gc(p16, descr=nextdescr) + i41 = getfield_gc_i(p16, descr=nextdescr) i42 = int_mul(i39, i41) i43 = int_add(i21, i42) i44 = int_add(i39, 1) @@ -3444,17 +3448,17 @@ def test_residual_call_does_not_invalidate_caches(self): ops = """ [p1, p2] - i1 = getfield_gc(p1, descr=valuedescr) - i2 = call(i1, descr=nonwritedescr) - i3 = getfield_gc(p1, descr=valuedescr) + i1 = getfield_gc_i(p1, descr=valuedescr) + i2 = call_i(i1, descr=nonwritedescr) + i3 = getfield_gc_i(p1, descr=valuedescr) escape_n(i1) escape_n(i3) jump(p1, p2) """ expected = """ [p1, p2] - i1 = getfield_gc(p1, descr=valuedescr) - i2 = call(i1, descr=nonwritedescr) + i1 = getfield_gc_i(p1, descr=valuedescr) + i2 = call_i(i1, descr=nonwritedescr) escape_n(i1) escape_n(i1) jump(p1, p2) @@ -3464,11 +3468,11 @@ def test_residual_call_invalidate_some_caches(self): ops = """ [p1, p2] - i1 = getfield_gc(p1, descr=adescr) - i2 = getfield_gc(p1, descr=bdescr) - i3 = call(i1, descr=writeadescr) - i4 = getfield_gc(p1, descr=adescr) - i5 = getfield_gc(p1, descr=bdescr) + i1 = getfield_gc_i(p1, descr=adescr) + i2 = getfield_gc_i(p1, descr=bdescr) + i3 = call_i(i1, descr=writeadescr) + i4 = getfield_gc_i(p1, descr=adescr) + i5 = getfield_gc_i(p1, descr=bdescr) escape_n(i1) escape_n(i2) escape_n(i4) @@ -3477,10 +3481,10 @@ """ expected = """ [p1, p2] - i1 = getfield_gc(p1, descr=adescr) - i2 = getfield_gc(p1, descr=bdescr) - i3 = call(i1, descr=writeadescr) - i4 = getfield_gc(p1, descr=adescr) + i1 = getfield_gc_i(p1, descr=adescr) + i2 = getfield_gc_i(p1, descr=bdescr) + i3 = call_i(i1, descr=writeadescr) + i4 = getfield_gc_i(p1, descr=adescr) escape_n(i1) escape_n(i2) escape_n(i4) @@ -3492,11 +3496,11 @@ def test_residual_call_invalidate_arrays(self): ops = """ [p1, p2, i1] - p3 = getarrayitem_gc(p1, 0, descr=arraydescr2) - p4 = getarrayitem_gc(p2, 1, descr=arraydescr2) - i3 = call(i1, descr=writeadescr) - p5 = getarrayitem_gc(p1, 0, descr=arraydescr2) - p6 = getarrayitem_gc(p2, 1, descr=arraydescr2) + p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2) + p4 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) + i3 = call_i(i1, descr=writeadescr) + p5 = getarrayitem_gc_r(p1, 0, descr=arraydescr2) + p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) escape_n(p3) escape_n(p4) escape_n(p5) @@ -3505,9 +3509,9 @@ """ expected = """ [p1, p2, i1] - p3 = getarrayitem_gc(p1, 0, descr=arraydescr2) - p4 = getarrayitem_gc(p2, 1, descr=arraydescr2) - i3 = call(i1, descr=writeadescr) + p3 = getarrayitem_gc_r(p1, 0, descr=arraydescr2) + p4 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) + i3 = call_i(i1, descr=writeadescr) escape_n(p3) escape_n(p4) escape_n(p3) @@ -3519,12 +3523,12 @@ def test_residual_call_invalidate_some_arrays(self): ops = """ [p1, p2, i1] - p3 = getarrayitem_gc(p2, 0, descr=arraydescr2) - p4 = getarrayitem_gc(p2, 1, descr=arraydescr2) + p3 = getarrayitem_gc_r(p2, 0, descr=arraydescr2) + p4 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr) - i3 = call(i1, descr=writearraydescr) - p5 = getarrayitem_gc(p2, 0, descr=arraydescr2) - p6 = getarrayitem_gc(p2, 1, descr=arraydescr2) + i3 = call_i(i1, descr=writearraydescr) + p5 = getarrayitem_gc_r(p2, 0, descr=arraydescr2) + p6 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) i4 = getarrayitem_gc_i(p1, 1, descr=arraydescr) escape_n(p3) escape_n(p4) @@ -3536,10 +3540,10 @@ """ expected = """ [p1, p2, i1] - p3 = getarrayitem_gc(p2, 0, descr=arraydescr2) - p4 = getarrayitem_gc(p2, 1, descr=arraydescr2) + p3 = getarrayitem_gc_r(p2, 0, descr=arraydescr2) + p4 = getarrayitem_gc_r(p2, 1, descr=arraydescr2) i2 = getarrayitem_gc_i(p1, 1, descr=arraydescr) - i3 = call(i1, descr=writearraydescr) + i3 = call_i(i1, descr=writearraydescr) i4 = getarrayitem_gc_i(p1, 1, descr=arraydescr) escape_n(p3) escape_n(p4) @@ -3556,7 +3560,7 @@ [p1, i1, p2, i2] setfield_gc(p1, i1, descr=valuedescr) setfield_gc(p2, i2, descr=adescr) - i3 = call(i1, descr=readadescr) + i3 = call_i(i1, descr=readadescr) setfield_gc(p1, i3, descr=valuedescr) setfield_gc(p2, i3, descr=adescr) jump(p1, i1, p2, i2) @@ -3564,7 +3568,7 @@ expected = """ [p1, i1, p2, i2] setfield_gc(p2, i2, descr=adescr) - i3 = call(i1, descr=readadescr) + i3 = call_i(i1, descr=readadescr) setfield_gc(p1, i3, descr=valuedescr) setfield_gc(p2, i3, descr=adescr) jump(p1, i1, p2, i2) @@ -4682,11 +4686,11 @@ def test_add_sub_ovf_virtual_unroll(self): ops = """ [p15] - i886 = getfield_gc_pure(p15, descr=valuedescr) + i886 = getfield_gc_pure_i(p15, descr=valuedescr) i888 = int_sub_ovf(i886, 1) guard_no_overflow() [] escape_n(i888) - i4360 = getfield_gc_pure(p15, descr=valuedescr) + i4360 = getfield_gc_pure_i(p15, descr=valuedescr) i4362 = int_add_ovf(i4360, 1) guard_no_overflow() [] i4360p = int_sub_ovf(i4362, 1) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -432,6 +432,8 @@ operations + \ [ResOperation(rop.LABEL, jump_args, descr=token)] start_state = self._do_optimize_loop(preamble, call_pure_results) + import pdb + pdb.set_trace() assert preamble.operations[-1].getopnum() == rop.LABEL diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py --- a/rpython/jit/metainterp/optimizeopt/unroll.py +++ b/rpython/jit/metainterp/optimizeopt/unroll.py @@ -305,6 +305,8 @@ # Construct jumpargs from the virtual state original_jumpargs = jumpop.getarglist()[:] values = [self.getvalue(arg) for arg in jumpop.getarglist()] + import pdb + pdb.set_trace() try: jumpargs = virtual_state.make_inputargs(values, self.optimizer) except BadVirtualState: @@ -635,5 +637,7 @@ debug_print(" short boxes") self.short_boxes.dump(logops) debug_print(" exported values") - #self.exported_values.dump(logops) + for k, v in self.exported_values.iteritems(): + debug_print("%s:%s" % (logops.repr_of_resop(k), + logops.repr_of_resop(v.box))) debug_stop("jit-exported-state") diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py --- a/rpython/jit/metainterp/optimizeopt/virtualize.py +++ b/rpython/jit/metainterp/optimizeopt/virtualize.py @@ -421,8 +421,8 @@ class VRawBufferValue(AbstractVArrayValue): is_about_raw = True - def __init__(self, cpu, logops, size, keybox, source_op): - AbstractVirtualValue.__init__(self, keybox, source_op) + def __init__(self, cpu, logops, size, source_op): + AbstractVirtualValue.__init__(self, source_op) # note that size is unused, because we assume that the buffer is big # enough to write/read everything we need. If it's not, it's undefined # behavior anyway, although in theory we could probably detect such @@ -467,7 +467,7 @@ itemvalue = self.buffer.values[i] itembox = itemvalue.force_box(optforce) op = ResOperation(rop.RAW_STORE, - [self.box, ConstInt(offset), itembox], None, + [self.box, ConstInt(offset), itembox], descr=descr) optforce.emit_operation(op) @@ -484,8 +484,8 @@ class VRawSliceValue(AbstractVirtualValue): is_about_raw = True - def __init__(self, rawbuffer_value, offset, keybox, source_op): - AbstractVirtualValue.__init__(self, keybox, source_op) + def __init__(self, rawbuffer_value, offset, source_op): + AbstractVirtualValue.__init__(self, source_op) self.rawbuffer_value = rawbuffer_value self.offset = offset @@ -540,15 +540,15 @@ self.make_equal_to(source_op, vvalue) return vvalue - def make_virtual_raw_memory(self, size, box, source_op): + def make_virtual_raw_memory(self, size, source_op): logops = self.optimizer.loop.logops - vvalue = VRawBufferValue(self.optimizer.cpu, logops, size, box, source_op) - self.make_equal_to(box, vvalue) + vvalue = VRawBufferValue(self.optimizer.cpu, logops, size, source_op) + self.make_equal_to(source_op, vvalue) return vvalue - def make_virtual_raw_slice(self, rawbuffer_value, offset, box, source_op): - vvalue = VRawSliceValue(rawbuffer_value, offset, box, source_op) - self.make_equal_to(box, vvalue) + def make_virtual_raw_slice(self, rawbuffer_value, offset, source_op): + vvalue = VRawSliceValue(rawbuffer_value, offset, source_op) + self.make_equal_to(source_op, vvalue) return vvalue def optimize_GUARD_NO_EXCEPTION(self, op): @@ -736,6 +736,7 @@ else: self.emit_operation(op) optimize_CALL_R = optimize_CALL_N + optimize_CALL_I = optimize_CALL_N def do_RAW_MALLOC_VARSIZE_CHAR(self, op): sizebox = self.get_constant_box(op.getarg(1)) diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -644,6 +644,7 @@ # op = op.clone(self.memo) # op.is_source_op = True if box in self.short_boxes: + return # XXX avoid those corner cases #if op is None: # xxx # oldop = self.short_boxes[box] @@ -659,15 +660,15 @@ #value = self.optimizer.getvalue(box) #self.optimizer.emit_operation(ResOperation(rop.SAME_AS, [box], newbox)) #self.optimizer.make_equal_to(newbox, value) - if op is None: - if self.short_boxes[box] is not box: - xxx - else: - if self.short_boxes[box] is not op: - if self.short_boxes[box] is None: - self.short_boxes[box] = op - else: - xxx + #if op is None: + # if self.short_boxes[box] is not box: + # xxx + #else: + # if self.short_boxes[box] is not op: + # if self.short_boxes[box] is None: + # self.short_boxes[box] = op + # else: + # xxx else: self.short_boxes[box] = op _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit