Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r79714:e809b9eb72e9 Date: 2015-09-20 10:06 +0200 http://bitbucket.org/pypy/pypy/changeset/e809b9eb72e9/
Log: a test and a fix 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 @@ -469,11 +469,9 @@ if op is None: continue val = op.getarg(1) - if val.type == 'r': - ptrinfo = self.getptrinfo(val) - if ptrinfo and ptrinfo.is_virtual(): - pendingfields.append(op) - continue + if self.optimizer.is_virtual(val): + pendingfields.append(op) + continue cf.force_lazy_setfield(self, descr) for descr, submap in self.cached_arrayitems.iteritems(): for index, cf in submap.iteritems(): @@ -486,12 +484,8 @@ # SETFIELD_GC or SETARRAYITEM_GC. opinfo = self.getptrinfo(op.getarg(0)) assert not opinfo.is_virtual() # it must be a non-virtual - if op.getarg(2).type == 'r': - fieldinfo = self.getptrinfo(op.getarg(2)) - if fieldinfo and fieldinfo.is_virtual(): - pendingfields.append(op) - else: - cf.force_lazy_setfield(self, descr) + if self.optimizer.is_virtual(op.getarg(2)): + pendingfields.append(op) else: cf.force_lazy_setfield(self, descr) return pendingfields diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -651,6 +651,14 @@ op.getopnum(), argboxes, op.getdescr(), op.type) + def is_virtual(self, op): + if op.type == 'r': + opinfo = self.getptrinfo(op) + return opinfo and opinfo.is_virtual() + if op.type == 'i': + opinfo = self.getrawptrinfo(op) + return opinfo and opinfo.is_virtual() + def pure_reverse(self, op): import sys if self.optpure is None: 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 @@ -8881,5 +8881,26 @@ """ self.optimize_loop(ops, expected) + def test_pending_setfield_delayed_malloc(self): + ops = """ + [i0, p0] + i2 = call_i('malloc', 10, descr=raw_malloc_descr) + setarrayitem_raw(i2, 0, 13, descr=rawarraydescr) + setfield_gc(p0, i2, descr=valuedescr) + i1 = int_add(i0, 1) + i3 = int_lt(i1, 10) + guard_true(i3) [] + setfield_gc(p0, 0, descr=valuedescr) + jump(i1, p0) + """ + expected = """ + [i0, p0] + i1 = int_add(i0, 1) + i3 = int_lt(i1, 10) + guard_true(i3) [p0] + jump(i1, p0) + """ + self.optimize_loop(ops, expected) + class TestLLtype(OptimizeOptTest, LLtypeMixin): pass diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py --- a/rpython/jit/metainterp/test/test_ajit.py +++ b/rpython/jit/metainterp/test/test_ajit.py @@ -723,6 +723,7 @@ elif n == 7: a = 3 else: a = 2 x = intmask(x * 10 + a) + print "XXXXXXXXXXXXXX", x i += 1 return x res = self.meta_interp(f, [0], backendopt=True) diff --git a/rpython/jit/metainterp/test/test_loop.py b/rpython/jit/metainterp/test/test_loop.py --- a/rpython/jit/metainterp/test/test_loop.py +++ b/rpython/jit/metainterp/test/test_loop.py @@ -1069,6 +1069,26 @@ res = self.meta_interp(run, [42], backendopt=True) assert res == 420 + def test_not_too_many_bridges(self): + jitdriver = JitDriver(greens = [], reds = 'auto') + + def f(i): + s = 0 + while i > 0: + jitdriver.jit_merge_point() + if i % 2 == 0: + s += 1 + elif i % 3 == 0: + s += 1 + elif i % 5 == 0: + s += 1 + elif i % 7 == 0: + s += 1 + i -= 1 + return s + + self.meta_interp(f, [30]) + self.check_trace_count(3) class TestLLtype(LoopTest, LLJitMixin): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit