Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit