[pypy-svn] r76179 - in pypy/branch/interplevel-array/pypy/jit: metainterp metainterp/test tl
hakanardo at codespeak.net
hakanardo at codespeak.net
Tue Jul 13 14:07:38 CEST 2010
Author: hakanardo
Date: Tue Jul 13 14:07:37 2010
New Revision: 76179
Modified:
pypy/branch/interplevel-array/pypy/jit/metainterp/optimizeopt.py
pypy/branch/interplevel-array/pypy/jit/metainterp/resoperation.py
pypy/branch/interplevel-array/pypy/jit/metainterp/test/test_optimizeopt.py
pypy/branch/interplevel-array/pypy/jit/tl/pypyjit_demo.py
Log:
guard removal by rewriting boolean expressions
Modified: pypy/branch/interplevel-array/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/interplevel-array/pypy/jit/metainterp/optimizeopt.py Tue Jul 13 14:07:37 2010
@@ -1,7 +1,7 @@
from pypy.jit.metainterp.history import Box, BoxInt, LoopToken, BoxFloat,\
ConstFloat
from pypy.jit.metainterp.history import Const, ConstInt, ConstPtr, ConstObj, REF
-from pypy.jit.metainterp.resoperation import rop, ResOperation
+from pypy.jit.metainterp.resoperation import rop, ResOperation, opboolinvers, opboolreflex
from pypy.jit.metainterp import jitprof
from pypy.jit.metainterp.executor import execute_nonspec
from pypy.jit.metainterp.specnode import SpecNode, NotSpecNode, ConstantSpecNode
@@ -611,12 +611,46 @@
assert oldop.opnum == op.opnum
self.make_equal_to(op.result, self.getvalue(oldop.result))
return
+ elif self.find_rewriteable_constant(op, args):
+ return
else:
self.pure_operations[args] = op
# otherwise, the operation remains
self.emit_operation(op)
+
+ def find_rewriteable_constant(self, op, args):
+ try:
+ oldopnum = opboolinvers[op.opnum]
+ targ = args[0:2] + [ConstInt(oldopnum)]
+ oldop = self.pure_operations.get(targ, None)
+ if oldop is not None and oldop.descr is op.descr:
+ value = self.getvalue(oldop.result)
+ if value.is_constant():
+ if value.box is CONST_1:
+ self.make_constant(op.result, CONST_0)
+ return True
+ elif value.box is CONST_0:
+ self.make_constant(op.result, CONST_1)
+ return True
+ except KeyError:
+ pass
+
+ try:
+ oldopnum = opboolreflex[op.opnum]
+ targ = args[1::-1] + [ConstInt(oldopnum)]
+ oldop = self.pure_operations.get(targ, None)
+ if oldop is not None and oldop.descr is op.descr:
+ value = self.getvalue(oldop.result)
+ if value.is_constant():
+ self.make_constant(op.result, value.box)
+ return True
+ except KeyError:
+ pass
+
+ return False
+
def optimize_JUMP(self, op):
orgop = self.loop.operations[-1]
exitargs = []
Modified: pypy/branch/interplevel-array/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/branch/interplevel-array/pypy/jit/metainterp/resoperation.py Tue Jul 13 14:07:37 2010
@@ -274,3 +274,41 @@
setup(__name__ == '__main__') # print out the table when run directly
del _oplist
+
+opboolinvers = {
+ rop.INT_EQ: rop.INT_NE,
+ rop.INT_NE: rop.INT_EQ,
+ rop.INT_LT: rop.INT_GE,
+ rop.INT_GE: rop.INT_LT,
+ rop.INT_GT: rop.INT_LE,
+ rop.INT_LE: rop.INT_GT,
+
+ rop.FLOAT_EQ: rop.FLOAT_NE,
+ rop.FLOAT_NE: rop.FLOAT_EQ,
+ rop.FLOAT_LT: rop.FLOAT_GE,
+ rop.FLOAT_GE: rop.FLOAT_LT,
+ rop.FLOAT_GT: rop.FLOAT_LE,
+ rop.FLOAT_LE: rop.FLOAT_GT,
+
+ rop.PTR_EQ: rop.PTR_NE,
+ rop.PTR_NE: rop.PTR_EQ,
+ }
+
+opboolreflex = {
+ rop.INT_EQ: rop.INT_EQ,
+ rop.INT_NE: rop.INT_NE,
+ rop.INT_LT: rop.INT_GT,
+ rop.INT_GE: rop.INT_LE,
+ rop.INT_GT: rop.INT_LT,
+ rop.INT_LE: rop.INT_GE,
+
+ rop.FLOAT_EQ: rop.FLOAT_EQ,
+ rop.FLOAT_NE: rop.FLOAT_NE,
+ rop.FLOAT_LT: rop.FLOAT_GT,
+ rop.FLOAT_GE: rop.FLOAT_LE,
+ rop.FLOAT_GT: rop.FLOAT_LT,
+ rop.FLOAT_LE: rop.FLOAT_GE,
+
+ rop.PTR_EQ: rop.PTR_EQ,
+ rop.PTR_NE: rop.PTR_NE,
+ }
Modified: pypy/branch/interplevel-array/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/interplevel-array/pypy/jit/metainterp/test/test_optimizeopt.py Tue Jul 13 14:07:37 2010
@@ -364,6 +364,57 @@
"""
self.optimize_loop(ops, 'Not', expected)
+ def test_constant_boolrewrite1(self):
+ ops = """
+ [i0]
+ i1 = int_lt(i0, 0)
+ guard_true(i1) []
+ i2 = int_ge(i0, 0)
+ guard_false(i2) []
+ jump(i0)
+ """
+ expected = """
+ [i0]
+ i1 = int_lt(i0, 0)
+ guard_true(i1) []
+ jump(i0)
+ """
+ self.optimize_loop(ops, 'Not', expected)
+
+ def test_constant_boolrewrite2(self):
+ ops = """
+ [i0]
+ i1 = int_gt(i0, 0)
+ guard_true(i1) []
+ i2 = int_le(i0, 0)
+ guard_false(i2) []
+ jump(i0)
+ """
+ expected = """
+ [i0]
+ i1 = int_gt(i0, 0)
+ guard_true(i1) []
+ jump(i0)
+ """
+ self.optimize_loop(ops, 'Not', expected)
+
+ def test_constant_boolrewrite3(self):
+ ops = """
+ [i0]
+ i1 = int_gt(i0, 0)
+ guard_true(i1) []
+ i2 = int_lt(0, i0)
+ guard_true(i2) []
+ jump(i0)
+ """
+ expected = """
+ [i0]
+ i1 = int_gt(i0, 0)
+ guard_true(i1) []
+ jump(i0)
+ """
+ self.optimize_loop(ops, 'Not', expected)
+
def test_remove_consecutive_guard_value_constfold(self):
ops = """
[]
Modified: pypy/branch/interplevel-array/pypy/jit/tl/pypyjit_demo.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/jit/tl/pypyjit_demo.py (original)
+++ pypy/branch/interplevel-array/pypy/jit/tl/pypyjit_demo.py Tue Jul 13 14:07:37 2010
@@ -37,14 +37,24 @@
## t2 = time.time()
## print t2 - t1
-from array import array
-def f(img):
+## from array import array
+## def f(img):
+## i=0
+## sa=0
+## while i<4:
+## sa+=img[i]
+## i+=1
+## return sa
+
+## img=array('i',(1,2,3,4))
+## print f(img)
+
+def f():
+ a=7
i=0
- sa=0
while i<4:
- sa+=img[i]
+ if i<0: break
+ if i<0: break
i+=1
- return sa
-img=array('i',(1,2,3,4))
-print f(img)
+f()
More information about the Pypy-commit
mailing list