[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