Author: Hakan Ardo <ha...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit