[pypy-commit] pypy jit-multilabel: Dont change the result box of ops as they are emitted. That will cause an unecesarry renaming of the box as it passes a label which complicates unroll.py
hakanardo
noreply at buildbot.pypy.org
Tue Dec 13 09:08:23 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-multilabel
Changeset: r50456:1e4c74e007f4
Date: 2011-12-13 09:07 +0100
http://bitbucket.org/pypy/pypy/changeset/1e4c74e007f4/
Log: Dont change the result box of ops as they are emitted. That will
cause an unecesarry renaming of the box as it passes a label which
complicates unroll.py
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
@@ -4211,7 +4211,6 @@
preamble = """
[p0]
i0 = strlen(p0)
- i3 = same_as(i0) # Should be killed by backend
jump(p0)
"""
expected = """
@@ -5668,8 +5667,7 @@
p3 = newstr(i3)
copystrcontent(p1, p3, 0, 0, i1)
copystrcontent(p2, p3, 0, i1, i2)
- i7 = same_as(i2)
- jump(p2, p3, i7)
+ jump(p2, p3, i2)
"""
expected = """
[p1, p2, i1]
@@ -5744,9 +5742,7 @@
copystrcontent(p1, p5, 0, 0, i1)
copystrcontent(p2, p5, 0, i1, i2)
copystrcontent(p3, p5, 0, i12, i3)
- i129 = same_as(i2)
- i130 = same_as(i3)
- jump(p2, p3, p5, i129, i130)
+ jump(p2, p3, p5, i2, i3)
"""
expected = """
[p1, p2, p3, i1, i2]
@@ -5959,8 +5955,7 @@
p4 = newstr(i5)
copystrcontent(p1, p4, i1, 0, i3)
copystrcontent(p2, p4, 0, i3, i4)
- i9 = same_as(i4)
- jump(p4, i1, i2, p2, i5, i3, i9)
+ jump(p4, i1, i2, p2, i5, i3, i4)
"""
expected = """
[p1, i1, i2, p2, i5, i3, i4]
@@ -6082,9 +6077,7 @@
copystrcontent(p2, p4, 0, i1, i2)
i0 = call(0, p3, p4, descr=strequaldescr)
escape(i0)
- i11 = same_as(i1)
- i12 = same_as(i2)
- jump(p1, p2, p3, i3, i11, i12)
+ jump(p1, p2, p3, i3, i1, i2)
"""
expected = """
[p1, p2, p3, i3, i1, i2]
@@ -6304,7 +6297,6 @@
i1 = strlen(p1)
i0 = int_eq(i1, 0)
escape(i0)
- i3 = same_as(i1)
jump(p1, i0)
"""
self.optimize_strunicode_loop_extradescrs(ops, expected, preamble)
@@ -6350,9 +6342,7 @@
copystrcontent(p2, p4, 0, i1, i2)
i0 = call(0, s"hello world", p4, descr=streq_nonnull_descr)
escape(i0)
- i11 = same_as(i1)
- i12 = same_as(i2)
- jump(p1, p2, i3, i11, i12)
+ jump(p1, p2, i3, i1, i2)
"""
expected = """
[p1, p2, i3, i1, i2]
@@ -6925,8 +6915,7 @@
[p9]
i843 = strlen(p9)
call(i843, descr=nonwritedescr)
- i0 = same_as(i843)
- jump(p9, i0)
+ jump(p9, i843)
"""
short = """
[p9]
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
@@ -199,8 +199,8 @@
self.optimizer.emitting_dissabled = True
for op in exported_state.inputarg_setup_ops:
self.optimizer.send_extra_operation(op)
+
seen = {}
-
for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.result:
@@ -211,10 +211,7 @@
self.optimizer.importable_values[value] = imp
newvalue = self.optimizer.getvalue(op.result)
newresult = newvalue.get_key_box()
- if newresult is not op.result and not newvalue.is_constant():
- self.short_boxes.alias(newresult, op.result)
- op = ResOperation(rop.SAME_AS, [op.result], newresult)
- self.optimizer._newoperations = [op] + self.optimizer._newoperations # XXX
+ assert newresult is op.result or newvalue.is_constant()
self.optimizer.flush()
self.optimizer.emitting_dissabled = False
@@ -373,7 +370,6 @@
target_token.short_preamble = self.short
target_token.exported_state = None
-
def ensure_short_op_emitted(self, op, optimizer, seen):
if op is None:
return
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -44,7 +44,7 @@
class __extend__(optimizer.OptValue):
"""New methods added to the base class OptValue for this file."""
- def getstrlen(self, string_optimizer, mode):
+ def getstrlen(self, string_optimizer, mode, lengthbox=None):
if mode is mode_string:
s = self.get_constant_string_spec(mode_string)
if s is not None:
@@ -57,7 +57,8 @@
return None
self.ensure_nonnull()
box = self.force_box(string_optimizer)
- lengthbox = BoxInt()
+ if lengthbox is None:
+ lengthbox = BoxInt()
string_optimizer.emit_operation(ResOperation(mode.STRLEN, [box], lengthbox))
return lengthbox
@@ -135,7 +136,7 @@
self._chars = longerlist[start:stop]
# slice the 'longerlist', which may also contain Nones
- def getstrlen(self, _, mode):
+ def getstrlen(self, _, mode, lengthbox=None):
if self._lengthbox is None:
self._lengthbox = ConstInt(len(self._chars))
return self._lengthbox
@@ -216,7 +217,7 @@
self.left = left
self.right = right
- def getstrlen(self, string_optimizer, mode):
+ def getstrlen(self, string_optimizer, mode, lengthbox=None):
if self.lengthbox is None:
len1box = self.left.getstrlen(string_optimizer, mode)
if len1box is None:
@@ -268,7 +269,7 @@
self.vstart = vstart
self.vlength = vlength
- def getstrlen(self, optforce, mode):
+ def getstrlen(self, optforce, mode, lengthbox=None):
return self.vlength.force_box(optforce)
@specialize.arg(1)
@@ -360,7 +361,7 @@
string_optimizer.emit_operation(ResOperation(rop.INT_SUB, [box1, box2], resbox))
return resbox
-def _strgetitem(string_optimizer, strbox, indexbox, mode):
+def _strgetitem(string_optimizer, strbox, indexbox, mode, resbox=None):
if isinstance(strbox, ConstPtr) and isinstance(indexbox, ConstInt):
if mode is mode_string:
s = strbox.getref(lltype.Ptr(rstr.STR))
@@ -368,7 +369,8 @@
else:
s = strbox.getref(lltype.Ptr(rstr.UNICODE))
return ConstInt(ord(s.chars[indexbox.getint()]))
- resbox = BoxInt()
+ if resbox is None:
+ resbox = BoxInt()
string_optimizer.emit_operation(ResOperation(mode.STRGETITEM, [strbox, indexbox],
resbox))
return resbox
@@ -434,10 +436,13 @@
def _optimize_STRGETITEM(self, op, mode):
value = self.getvalue(op.getarg(0))
vindex = self.getvalue(op.getarg(1))
- vresult = self.strgetitem(value, vindex, mode)
- self.make_equal_to(op.result, vresult)
+ vresult = self.strgetitem(value, vindex, mode, op.result)
+ if op.result in self.optimizer.values:
+ assert self.getvalue(op.result) is vresult
+ else:
+ self.make_equal_to(op.result, vresult)
- def strgetitem(self, value, vindex, mode):
+ def strgetitem(self, value, vindex, mode, resbox=None):
value.ensure_nonnull()
#
if value.is_virtual() and isinstance(value, VStringSliceValue):
@@ -464,7 +469,7 @@
vindex = optimizer.ConstantValue(ConstInt(index - len1))
return self.strgetitem(value.right, vindex, mode)
#
- resbox = _strgetitem(self, value.force_box(self), vindex.force_box(self), mode)
+ resbox = _strgetitem(self, value.force_box(self), vindex.force_box(self), mode, resbox)
return self.getvalue(resbox)
def optimize_STRLEN(self, op):
@@ -474,8 +479,11 @@
def _optimize_STRLEN(self, op, mode):
value = self.getvalue(op.getarg(0))
- lengthbox = value.getstrlen(self, mode)
- self.make_equal_to(op.result, self.getvalue(lengthbox))
+ lengthbox = value.getstrlen(self, mode, op.result)
+ if op.result in self.optimizer.values:
+ assert self.getvalue(op.result) is self.getvalue(lengthbox)
+ elif op.result is not lengthbox:
+ self.make_equal_to(op.result, self.getvalue(lengthbox))
def optimize_COPYSTRCONTENT(self, op):
self._optimize_COPYSTRCONTENT(op, mode_string)
More information about the pypy-commit
mailing list