[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