Author: Armin Rigo <[email protected]>
Branch: continulet-jit-3
Changeset: r58225:5365a6953d35
Date: 2012-10-18 17:46 +0200
http://bitbucket.org/pypy/pypy/changeset/5365a6953d35/
Log: Fix the fast path of call_assembler.
diff --git a/pypy/jit/backend/llgraph/runner.py
b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -217,6 +217,7 @@
frame.finish_value = e.arg
frame.latest_values = e.failargs
frame.latest_descr = e.descr
+ frame._execution_finished = True
return frame
except GuardFailed, e:
frame.latest_values = e.failargs
@@ -529,6 +530,7 @@
class LLFrame(object):
_TYPE = llmemory.GCREF
_forced = False
+ _execution_finished = False
def __init__(self, cpu, argboxes, args):
self.env = {}
@@ -774,8 +776,9 @@
def execute_call_assembler(self, descr, *args):
frame = self.cpu._execute_token(descr, *args)
+ if frame._execution_finished: # fast path
+ return frame.finish_value
jd = descr.outermost_jitdriver_sd
- # xxx fast path?????
assembler_helper_ptr = jd.assembler_helper_adr.ptr # fish
try:
result = assembler_helper_ptr(frame)
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -12,11 +12,6 @@
# Boxes and Consts are BoxFloats and ConstFloats.
supports_singlefloats = False
- done_with_this_frame_void_v = -1
- done_with_this_frame_int_v = -1
- done_with_this_frame_ref_v = -1
- done_with_this_frame_float_v = -1
- propagate_exception_v = -1
total_compiled_loops = 0
total_compiled_bridges = 0
total_freed_loops = 0
diff --git a/pypy/jit/backend/test/runner_test.py
b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2724,7 +2724,6 @@
def test_assembler_call(self):
called = []
def assembler_helper(jitframe):
- assert self.cpu.get_finish_value_int(jitframe) == 97
faildescr = self.cpu.get_latest_descr(jitframe)
failindex = self.cpu.get_fail_descr_number(faildescr)
called.append(failindex)
@@ -2743,7 +2742,8 @@
self.cpu.reserve_some_free_fail_descr_number()
ops = '''
[i0, i1, i2, i3, i4, i5, i6, i7, i8, i9]
- i10 = int_add(i0, i1)
+ i10 = int_add_ovf(i0, i1)
+ guard_no_overflow() []
i11 = int_add(i10, i2)
i12 = int_add(i11, i3)
i13 = int_add(i12, i4)
@@ -2756,7 +2756,8 @@
loop = parse(ops)
looptoken = JitCellToken()
looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
- done_number =
self.cpu.get_fail_descr_number(loop.operations[-1].getdescr())
+ fail_number = self.cpu.get_fail_descr_number(
+ loop.operations[1].getdescr())
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
ARGS = [lltype.Signed] * 10
RES = lltype.Signed
@@ -2775,33 +2776,26 @@
'''
loop = parse(ops, namespace=locals())
othertoken = JitCellToken()
+
+ # test the fast path, which should not call assembler_helper()
self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
args = [i+1 for i in range(10)]
frame = self.cpu.execute_token(othertoken, *args)
+ assert self.cpu.get_finish_value_int(frame) == 97
+ assert called == []
+
+ # test the slow path, going via assembler_helper()
+ args[1] = sys.maxint
+ frame = self.cpu.execute_token(othertoken, *args)
assert self.cpu.get_finish_value_int(frame) == 13
- assert called == [done_number]
-
- # test the fast path, which should not call assembler_helper()
- del called[:]
- self.cpu.done_with_this_frame_int_v = done_number
- try:
- othertoken = JitCellToken()
- self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
- args = [i+1 for i in range(10)]
- frame = self.cpu.execute_token(othertoken, *args)
- assert self.cpu.get_finish_value_int(frame) == 97
- assert not called
- finally:
- del self.cpu.done_with_this_frame_int_v
+ assert called == [fail_number]
def test_assembler_call_float(self):
if not self.cpu.supports_floats:
py.test.skip("requires floats")
called = []
def assembler_helper(jitframe):
- x = self.cpu.get_finish_value_float(jitframe)
- assert longlong.getrealfloat(x) == 1.2 + 3.2
- faildescr =self.cpu.get_latest_descr(jitframe)
+ faildescr = self.cpu.get_latest_descr(jitframe)
failindex = self.cpu.get_fail_descr_number(faildescr)
called.append(failindex)
return 13.5
@@ -2823,10 +2817,13 @@
self.cpu.reserve_some_free_fail_descr_number()
ops = '''
[f0, f1]
+ i0 = float_eq(f0, -1.0)
+ guard_false(i0) []
f2 = float_add(f0, f1)
finish(f2)'''
loop = parse(ops)
- done_number =
self.cpu.get_fail_descr_number(loop.operations[-1].getdescr())
+ fail_number = self.cpu.get_fail_descr_number(
+ loop.operations[1].getdescr())
looptoken = JitCellToken()
looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
@@ -2844,27 +2841,21 @@
loop = parse(ops, namespace=locals())
othertoken = JitCellToken()
self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
+
+ # test the fast path, which should not call assembler_helper()
args = [longlong.getfloatstorage(1.2),
longlong.getfloatstorage(3.2)]
frame = self.cpu.execute_token(othertoken, *args)
x = self.cpu.get_finish_value_float(frame)
+ assert longlong.getrealfloat(x) == 1.2 + 3.2
+ assert called == []
+
+ # test the slow path, going via assembler_helper()
+ args[0] = longlong.getfloatstorage(-1.0)
+ frame = self.cpu.execute_token(othertoken, *args)
+ x = self.cpu.get_finish_value_float(frame)
assert longlong.getrealfloat(x) == 13.5
- assert called == [done_number]
-
- # test the fast path, which should not call assembler_helper()
- del called[:]
- self.cpu.done_with_this_frame_float_v = done_number
- try:
- othertoken = JitCellToken()
- self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
- args = [longlong.getfloatstorage(1.2),
- longlong.getfloatstorage(3.2)]
- frame = self.cpu.execute_token(othertoken, *args)
- x = self.cpu.get_finish_value_float(frame)
- assert longlong.getrealfloat(x) == 1.2 + 3.2
- assert not called
- finally:
- del self.cpu.done_with_this_frame_float_v
+ assert called == [fail_number]
def test_raw_malloced_getarrayitem(self):
ARRAY = rffi.CArray(lltype.Signed)
@@ -2895,8 +2886,6 @@
py.test.skip("requires floats")
called = []
def assembler_helper(jitframe):
- x = self.cpu.get_finish_value_float(jitframe)
- assert longlong.getrealfloat(x) == 1.25 + 3.25
faildescr =self.cpu.get_latest_descr(jitframe)
failindex = self.cpu.get_fail_descr_number(faildescr)
called.append(failindex)
@@ -2919,13 +2908,16 @@
self.cpu.reserve_some_free_fail_descr_number()
ops = '''
[f0, f1]
+ i0 = float_eq(f0, -1.0)
+ guard_false(i0) []
f2 = float_add(f0, f1)
finish(f2)'''
loop = parse(ops)
looptoken = JitCellToken()
looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
- done_number =
self.cpu.get_fail_descr_number(loop.operations[-1].getdescr())
+ fail_number = self.cpu.get_fail_descr_number(
+ loop.operations[1].getdescr())
args = [longlong.getfloatstorage(1.25),
longlong.getfloatstorage(2.35)]
frame = self.cpu.execute_token(looptoken, *args)
@@ -2948,31 +2940,46 @@
longlong.getfloatstorage(3.25)]
frame = self.cpu.execute_token(othertoken, *args)
x = self.cpu.get_finish_value_float(frame)
+ assert longlong.getrealfloat(x) == 1.25 + 3.25
+ assert called == []
+
+ args[0] = longlong.getfloatstorage(-1.0)
+ frame = self.cpu.execute_token(othertoken, *args)
+ x = self.cpu.get_finish_value_float(frame)
assert longlong.getrealfloat(x) == 13.5
- assert called == [done_number]
+ assert called == [fail_number]
del called[:]
# compile a replacement
ops = '''
[f0, f1]
+ i0 = float_eq(f0, -2.0)
+ guard_false(i0) []
f2 = float_sub(f0, f1)
finish(f2)'''
loop = parse(ops)
looptoken2 = JitCellToken()
looptoken2.outermost_jitdriver_sd = FakeJitDriverSD()
self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken2)
- done_number =
self.cpu.get_fail_descr_number(loop.operations[-1].getdescr())
+ fail_number = self.cpu.get_fail_descr_number(
+ loop.operations[1].getdescr())
# install it
self.cpu.redirect_call_assembler(looptoken, looptoken2)
# now, our call_assembler should go to looptoken2
- args = [longlong.getfloatstorage(6.0),
- longlong.getfloatstorage(1.5)] # 6.0-1.5 == 1.25+3.25
+ args = [longlong.getfloatstorage(116.0),
+ longlong.getfloatstorage(1.5)]
+ frame = self.cpu.execute_token(othertoken, *args)
+ x = self.cpu.get_finish_value_float(frame)
+ assert longlong.getrealfloat(x) == 116.0 - 1.5
+ assert called == []
+
+ args[0] = longlong.getfloatstorage(-2.0)
frame = self.cpu.execute_token(othertoken, *args)
x = self.cpu.get_finish_value_float(frame)
assert longlong.getrealfloat(x) == 13.5
- assert called == [done_number]
+ assert called == [fail_number]
def test_short_result_of_getfield_direct(self):
# Test that a getfield that returns a CHAR, SHORT or INT, signed
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit