[pypy-commit] pypy jit-short_from_state: dont override the short_box with an aliased box if it is already present
hakanardo
noreply at buildbot.pypy.org
Tue Aug 9 17:13:13 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r46398:53e4e61a8535
Date: 2011-08-09 17:15 +0200
http://bitbucket.org/pypy/pypy/changeset/53e4e61a8535/
Log: dont override the short_box with an aliased box if it is already
present
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
@@ -6924,9 +6924,26 @@
setfield_gc(p5, 1, descr=valuedescr)
jump(p5, 1)
"""
-
self.optimize_loop(ops, expected, preamble)
-
+
+ def test_dont_mixup_equal_boxes(self):
+ ops = """
+ [p8]
+ i9 = getfield_gc_pure(p8, descr=valuedescr)
+ i10 = int_gt(i9, 0)
+ guard_true(i10) []
+ i29 = int_lshift(i9, 1)
+ i30 = int_rshift(i29, 1)
+ i40 = int_ne(i30, i9)
+ guard_false(i40) []
+ jump(p8)
+ """
+ expected = """
+ [p8]
+ jump(p8)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -242,13 +242,14 @@
for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.result:
+ # The order of these guards is not important as
+ # self.optimizer.emitting_dissabled is False
value = preamble_optimizer.getvalue(op.result)
for guard in value.make_guards(op.result):
self.optimizer.send_extra_operation(guard)
newresult = self.optimizer.getvalue(op.result).get_key_box()
if newresult is not op.result:
self.short_boxes.alias(newresult, op.result)
-
self.optimizer.flush()
self.optimizer.emitting_dissabled = False
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -11,6 +11,7 @@
from pypy.jit.metainterp.resoperation import rop, ResOperation
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib.debug import debug_start, debug_stop, debug_print
+from pypy.rlib.objectmodel import we_are_translated
class AbstractVirtualStateInfo(resume.AbstractVirtualInfo):
position = -1
@@ -509,6 +510,10 @@
debug_stop('jit-short-boxes')
def operations(self):
+ if not we_are_translated(): # For tests
+ ops = self.short_boxes.values()
+ ops.sort(key=str, reverse=True)
+ return ops
return self.short_boxes.values()
def producer(self, box):
@@ -518,7 +523,7 @@
return box in self.short_boxes
def alias(self, newbox, oldbox):
- if not isinstance(oldbox, Const):
+ if not isinstance(oldbox, Const) and newbox not in self.short_boxes:
self.short_boxes[newbox] = self.short_boxes[oldbox]
self.aliases[newbox] = oldbox
diff --git a/pypy/jit/tl/pypyjit.py b/pypy/jit/tl/pypyjit.py
--- a/pypy/jit/tl/pypyjit.py
+++ b/pypy/jit/tl/pypyjit.py
@@ -37,13 +37,13 @@
set_opt_level(config, level='jit')
config.objspace.allworkingmodules = False
config.objspace.usemodules.pypyjit = True
-config.objspace.usemodules.array = True
+config.objspace.usemodules.array = False
config.objspace.usemodules._weakref = True
config.objspace.usemodules._sre = False
config.objspace.usemodules._lsprof = True
#
config.objspace.usemodules._ffi = True
-config.objspace.usemodules.micronumpy = True
+config.objspace.usemodules.micronumpy = False
#
set_pypy_opt_level(config, level='jit')
diff --git a/pypy/jit/tl/pypyjit_demo.py b/pypy/jit/tl/pypyjit_demo.py
--- a/pypy/jit/tl/pypyjit_demo.py
+++ b/pypy/jit/tl/pypyjit_demo.py
@@ -1,47 +1,23 @@
-def fannkuch(n):
- count = range(1, n+1)
- max_flips = 0
- m = n-1
- r = n
- check = 0
- perm1 = range(n)
- perm = range(n)
- perm1_ins = perm1.insert
- perm1_pop = perm1.pop
+import pypyjit
+pypyjit.set_param(threshold=200)
- while 1:
- if check < 30:
- #print "".join(str(i+1) for i in perm1)
- check += 1
- while r != 1:
- count[r-1] = r
- r -= 1
-
- if perm1[0] != 0 and perm1[m] != m:
- perm = perm1[:]
- flips_count = 0
- k = perm[0]
- while k:
- perm[:k+1] = perm[k::-1]
- flips_count += 1
- k = perm[0]
-
- if flips_count > max_flips:
- max_flips = flips_count
-
- while r != n:
- perm1_ins(r, perm1_pop(0))
- count[r] -= 1
- if count[r] > 0:
- break
- r += 1
- else:
- return max_flips
-
+def main(a, b):
+ i = sa = 0
+ while i < 300:
+ if a > 0: # Specialises the loop
+ pass
+ if b < 2 and b > 0:
+ pass
+ if (a >> b) >= 0:
+ sa += 1
+ if (a << b) > 2:
+ sa += 10000
+ i += 1
+ return sa
try:
- fannkuch(9)
+ print main(2, 1)
except Exception, e:
print "Exception: ", type(e)
More information about the pypy-commit
mailing list