[pypy-svn] pypy jitypes2: allow setfield_gcs to be between libffi_prepare and libffi_call
antocuni
commits-noreply at bitbucket.org
Thu Jan 27 10:11:05 CET 2011
Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: jitypes2
Changeset: r41382:155ff1131410
Date: 2011-01-27 10:10 +0100
http://bitbucket.org/pypy/pypy/changeset/155ff1131410/
Log: allow setfield_gcs to be between libffi_prepare and libffi_call
diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -15,7 +15,6 @@
restype = None
descr = None
prepare_op = None
- force_token_op = None
def __init__(self, funcval, cpu, prepare_op):
self.funcval = funcval
@@ -27,6 +26,7 @@
# e.g., I or U for long longs
self.descr = None
self.prepare_op = prepare_op
+ self.delayed_ops = []
def _get_signature(self, funcval):
"""
@@ -107,8 +107,8 @@
self.emit_operation(funcinfo.prepare_op)
for op in funcinfo.opargs:
self.emit_operation(op)
- if funcinfo.force_token_op:
- self.emit_operation(funcinfo.force_token_op)
+ for delayed_op in funcinfo.delayed_ops:
+ self.emit_operation(delayed_op)
def emit_operation(self, op):
# we cannot emit any operation during the optimization
@@ -153,10 +153,15 @@
# call_may_force and the setfield_gc, so the final result we get is
# again force_token/setfield_gc/call_may_force.
#
+ # However, note that nowadays we also allow to have any setfield_gc
+ # between libffi_prepare and libffi_call, so while the comment above
+ # it's a bit superfluous, it has been left there for future reference.
if self.funcinfo is None:
self.emit_operation(op)
else:
- self.funcinfo.force_token_op = op
+ self.funcinfo.delayed_ops.append(op)
+
+ optimize_SETFIELD_GC = optimize_FORCE_TOKEN
def do_prepare_call(self, op):
self.rollback_maybe('prepare call', op)
@@ -187,8 +192,8 @@
descr=funcinfo.descr)
self.commit_optimization()
ops = []
- if funcinfo.force_token_op:
- ops.append(funcinfo.force_token_op)
+ for delayed_op in funcinfo.delayed_ops:
+ ops.append(delayed_op)
ops.append(newop)
return ops
diff --git a/pypy/jit/metainterp/test/test_optimizefficall.py b/pypy/jit/metainterp/test/test_optimizefficall.py
--- a/pypy/jit/metainterp/test/test_optimizefficall.py
+++ b/pypy/jit/metainterp/test/test_optimizefficall.py
@@ -38,6 +38,8 @@
cpu = LLtypeMixin.cpu
FUNC = LLtypeMixin.FUNC
vable_token_descr = LLtypeMixin.valuedescr
+ valuedescr = LLtypeMixin.valuedescr
+
int_float__int = MyCallDescr('if', 'i')
funcptr = FakeLLObject()
func = FakeLLObject(_fake_class=Func,
@@ -242,3 +244,25 @@
"""
expected = ops
loop = self.optimize_loop(ops, expected)
+
+ def test_allow_setfields_in_between(self):
+ ops = """
+ [i0, f1, p2]
+ call(0, ConstPtr(func), descr=libffi_prepare)
+ call(0, ConstPtr(func), i0, descr=libffi_push_arg)
+ call(0, ConstPtr(func), f1, descr=libffi_push_arg)
+ setfield_gc(p2, i0, descr=valuedescr)
+ i3 = call_may_force(0, ConstPtr(func), 12345, descr=libffi_call)
+ guard_not_forced() []
+ guard_no_exception() []
+ jump(i3, f1, p2)
+ """
+ expected = """
+ [i0, f1, p2]
+ setfield_gc(p2, i0, descr=valuedescr)
+ i3 = call_may_force(12345, i0, f1, descr=int_float__int)
+ guard_not_forced() []
+ guard_no_exception() []
+ jump(i3, f1, p2)
+ """
+ loop = self.optimize_loop(ops, expected)
More information about the Pypy-commit
mailing list