[pypy-svn] r74465 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Mon May 10 15:15:13 CEST 2010


Author: arigo
Date: Mon May 10 15:15:11 2010
New Revision: 74465

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
Log:
Constant-fold 'if _we_are_jitted' and 'if malloc_zero_filled'.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Mon May 10 15:15:11 2010
@@ -6,6 +6,8 @@
 from pypy.jit.codewriter.flatten import ListOfKind
 from pypy.jit.codewriter import support, heaptracker
 from pypy.translator.simplify import get_funcobj
+from pypy.rlib import objectmodel
+from pypy.rlib.jit import _we_are_jitted
 
 
 def transform_graph(graph, cpu=None, callcontrol=None, portal=True):
@@ -50,9 +52,16 @@
                 if op is op_raising_exception:
                     self.killed_exception_raising_operation(block)
             else:
-                op2 = self.do_renaming(rename, op1)
-                newoperations.append(op2)
+                if isinstance(op1, SpaceOperation):
+                    op2 = self.do_renaming(rename, op1)
+                    newoperations.append(op2)
+                elif isinstance(op1, Constant):
+                    rename[op.result] = op1
+                else:
+                    raise TypeError(repr(op1))
         block.operations = newoperations
+        block.exitswitch = rename.get(block.exitswitch, block.exitswitch)
+        self.follow_constant_exit(block)
         self.optimize_goto_if_not(block)
         for link in block.exits:
             self.do_renaming_on_link(rename, link)
@@ -85,6 +94,19 @@
 
     # ----------
 
+    def follow_constant_exit(self, block):
+        v = block.exitswitch
+        if isinstance(v, Constant) and v != c_last_exception:
+            llvalue = v.value
+            for link in block.exits:
+                if link.llexitcase == llvalue:
+                    break
+            else:
+                assert link.exitcase == 'default'
+            block.exitswitch = None
+            link.exitcase = link.llexitcase = None
+            block.recloseblock(link)
+
     def optimize_goto_if_not(self, block):
         """Replace code like 'v = int_gt(x,y); exitswitch = v'
            with just 'exitswitch = ('int_gt',x,y)'."""
@@ -574,6 +596,19 @@
                              op.result)
         return self.rewrite_operation(op1)
 
+    def rewrite_op_int_is_true(self, op):
+        if isinstance(op.args[0], Constant):
+            value = op.args[0].value
+            if value is objectmodel.malloc_zero_filled:
+                value = True
+            elif value is _we_are_jitted:
+                value = True
+            else:
+                raise AssertionError("don't know the truth value of %r"
+                                     % (value,))
+            return Constant(value, lltype.Bool)
+        return op
+
 # ____________________________________________________________
 
 def _with_prefix(prefix):

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py	Mon May 10 15:15:11 2010
@@ -9,6 +9,7 @@
 from pypy.translator.unsimplify import varoftype
 from pypy.rlib.rarithmetic import ovfcheck
 from pypy.rlib.jit import dont_look_inside
+from pypy.rlib.jit import _we_are_jitted
 
 
 class FakeRegAlloc:
@@ -434,3 +435,13 @@
             residual_call_ir_i $<* fn cannot_raise>, <Descr>, I[%i0, %i1], R[], %i2
             int_return %i2
         """, transform=True, liveness=True)
+
+    def test_we_are_jitted(self):
+        def f(x):
+            if _we_are_jitted:
+                return 2
+            else:
+                return 3 + x
+        self.encoding_test(f, [5], """
+            int_return $2
+        """, transform=True)



More information about the Pypy-commit mailing list