[pypy-commit] pypy optresult: few small fixes
fijal
noreply at buildbot.pypy.org
Wed May 27 09:55:19 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77608:ae589174c1c1
Date: 2015-05-27 09:43 +0200
http://bitbucket.org/pypy/pypy/changeset/ae589174c1c1/
Log: few small fixes
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -590,7 +590,7 @@
# NB: emitting the GETFIELD_GC_PURE is only safe because the
# QUASIIMMUT_FIELD is also emitted to make sure the dependency is
# registered.
- structvalue = self.getvalue(op.getarg(0))
+ structvalue = self.ensure_ptr_info_arg0(op)
if not structvalue.is_constant():
self._remove_guard_not_invalidated = True
return # not a constant at all; ignore QUASIIMMUT_FIELD
@@ -601,7 +601,8 @@
# check that the value is still correct; it could have changed
# already between the tracing and now. In this case, we mark the loop
# as invalid
- if not qmutdescr.is_still_valid_for(structvalue.get_key_box()):
+ if not qmutdescr.is_still_valid_for(
+ self.get_box_replacement(op.getarg(0))):
raise InvalidLoop('quasi immutable field changed during tracing')
# record as an out-of-line guard
if self.optimizer.quasi_immutable_deps is None:
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -344,7 +344,7 @@
def getstrlen(self, op, string_optimizer, mode, create_ops=True):
s = self._unpack_str(mode)
- if not s:
+ if s is None:
return None
return ConstInt(len(s))
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -9,7 +9,7 @@
MODE_UNICODE
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, AbstractResOp
-
+from rpython.jit.metainterp.optimizeopt import vstring
def get_integer_min(is_unsigned, byte_size):
if is_unsigned:
@@ -382,12 +382,14 @@
def optimize_STRLEN(self, op):
self.emit_operation(op)
- array = self.ensure_ptr_info_arg0(op)
+ self.make_nonnull_str(op.getarg(0), vstring.mode_string)
+ array = self.getptrinfo(op.getarg(0))
self.get_box_replacement(op).set_forwarded(array.getlenbound())
def optimize_UNICODELEN(self, op):
self.emit_operation(op)
- array = self.ensure_ptr_info_arg0(op)
+ self.make_nonnull_str(op.getarg(0), vstring.mode_unicode)
+ array = self.getptrinfo(op.getarg(0))
self.get_box_replacement(op).set_forwarded(array.getlenbound())
def optimize_STRGETITEM(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -657,9 +657,9 @@
if old_op is not None:
self.optimizer.make_equal_to(old_op, vvalue)
else:
- self.getvalue(op).ensure_nonnull()
+ self.make_nonnull_str(op, mode)
self.emit_operation(op)
- self.pure(mode.STRLEN, [op], op.getarg(0))
+ self.pure_from_args(mode.STRLEN, [op], op.getarg(0))
def optimize_STRSETITEM(self, op):
value = self.getptrinfo(op.getarg(0))
@@ -767,9 +767,8 @@
dst.setitem(index + dst_start, vresult)
else:
new_op = ResOperation(mode.STRSETITEM, [
- dst.force_box(self),
- ConstInt(index + dst_start),
- vresult.force_box(self),
+ op.getarg(1), ConstInt(index + dst_start),
+ vresult,
])
self.emit_operation(new_op)
else:
@@ -819,8 +818,10 @@
# More generally, supporting non-constant but virtual cases is
# not obvious, because of the exception UnicodeDecodeError that
# can be raised by ll_str2unicode()
- varg = self.getvalue(op.getarg(1))
- s = varg.get_constant_string_spec(mode_string)
+ varg = self.getptrinfo(op.getarg(1))
+ s = None
+ if varg:
+ s = varg.get_constant_string_spec(self, mode_string)
if s is None:
return False
try:
@@ -910,10 +911,14 @@
l2box = None
l1box = None
if i2:
- l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+ l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
if isinstance(l2box, ConstInt):
if l2box.value == 0:
- lengthbox = v1.getstrlen(self, mode, None)
+ # XXXX fix after merge to default, but this is not proven
+ # just yet
+ self.make_nonnull_str(arg1, mode)
+ i1 = self.getptrinfo(arg1)
+ lengthbox = i1.getstrlen(arg1, self, mode)
seo = self.optimizer.send_extra_operation
op = self.replace_op_with(resultop, rop.INT_EQ,
[lengthbox, CONST_0],
More information about the pypy-commit
mailing list