[pypy-commit] pypy result-in-resops: stop just short of starting to implement virtuals
fijal
noreply at buildbot.pypy.org
Sat Oct 27 12:05:44 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r58500:b3ef852cc2fa
Date: 2012-10-27 12:05 +0200
http://bitbucket.org/pypy/pypy/changeset/b3ef852cc2fa/
Log: stop just short of starting to implement virtuals
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -213,13 +213,16 @@
self.postprocess_guard(op, CONST_0)
def optimize_GUARD_ISNULL(self, op):
- value = self.getvalue(op.getarg(0))
+ value = self.getforwarded(op.getarg(0))
if value.is_null():
return
elif value.is_nonnull():
raise InvalidLoop('A GUARD_ISNULL was proven to always fail')
- self.emit_operation(op)
- value.make_constant(self.optimizer.cpu.ts.CONST_NULL)
+ return op
+
+ def postprocess_GUARD_ISNULL(self, op):
+ self.optimizer.make_constant(op.getarg(0),
+ self.optimizer.cpu.ts.CONST_NULL)
def optimize_GUARD_NONNULL(self, op):
value = self.getforwarded(op.getarg(0))
@@ -228,7 +231,7 @@
elif value.is_null():
raise InvalidLoop('A GUARD_NONNULL was proven to always fail')
value.setknownnonnull(True)
- value.setlastguardpos(self.optimizer.getpos())
+ value.setlastguardpos(self.optimizer.get_pos())
return op
def optimize_GUARD_VALUE(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -433,13 +433,13 @@
def test_ooisnull_on_null_ptr_1(self):
ops = """
[p0, p1]
- guard_isnull(p0) []
- guard_isnull(p0) []
+ guard_isnull(p0)
+ guard_isnull(p0)
jump(p1, p1)
"""
expected = """
[p0, p1]
- guard_isnull(p0) []
+ guard_isnull(p0)
jump(p1, p1)
"""
self.optimize_loop(ops, expected)
@@ -449,14 +449,14 @@
[p0]
pv = new_with_vtable(ConstClass(node_vtable))
setfield_gc(pv, p0, descr=valuedescr)
- guard_nonnull(p0) []
+ guard_nonnull(p0)
p1 = getfield_gc_r(pv, descr=valuedescr)
- guard_nonnull(p1) []
+ guard_nonnull(p1)
jump(p0)
"""
expected = """
[p0]
- guard_nonnull(p0) []
+ guard_nonnull(p0)
jump(p0)
"""
self.optimize_loop(ops, expected)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -453,14 +453,16 @@
optimize_GETFIELD_GC_PURE_f = optimize_GETFIELD_GC_i
def optimize_SETFIELD_GC(self, op):
- value = self.getvalue(op.getarg(0))
+ value = self.getforwarded(op.getarg(0))
if value.is_virtual():
- fieldvalue = self.getvalue(op.getarg(1))
+ fieldvalue = self.getforwarded(op.getarg(1))
+ xxx
value.setfield(op.getdescr(), fieldvalue)
else:
+ xxx
value.ensure_nonnull()
- self.emit_operation(op)
+ return op
def optimize_NEW_WITH_VTABLE(self, op):
value = self.getforwarded(op)
diff --git a/pypy/jit/metainterp/optmodel.py b/pypy/jit/metainterp/optmodel.py
--- a/pypy/jit/metainterp/optmodel.py
+++ b/pypy/jit/metainterp/optmodel.py
@@ -75,11 +75,17 @@
if cls.getopnum() in (rop.NEW_WITH_VTABLE, rop.NEW):
def force(self, optimizer):
- optimizer.emit_operation(self)
+ if not self._isforced:
+ optimizer.emit_operation(self)
+ self._isforced = True
return self
+ def is_virtual(self):
+ return not self._isforced
else:
def force(self, _):
return self
+ def is_virtual(self):
+ return False
if cls.is_guard() or cls.getopnum() == rop.FINISH:
addattr(Mutable, 'failargs')
if cls.is_guard():
@@ -95,6 +101,8 @@
addattr(Mutable, 'knownnonnull', False)
Mutable.is_nonnull = ref_is_nonnull
Mutable.is_null = ref_is_null
+ if cls.getopnum() in (rop.NEW_WITH_VTABLE, rop.NEW):
+ addattr(Mutable, 'isforced', False)
# for tracking last guard and merging GUARD_VALUE with
# GUARD_NONNULL etc
addattr(Mutable, 'lastguardpos', -1)
More information about the pypy-commit
mailing list