[pypy-svn] r69712 - in pypy/branch/virtual-forcing/pypy/jit/backend: . llgraph test x86

arigo at codespeak.net arigo at codespeak.net
Fri Nov 27 21:50:32 CET 2009


Author: arigo
Date: Fri Nov 27 21:50:30 2009
New Revision: 69712

Modified:
   pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py
   pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
   pypy/branch/virtual-forcing/pypy/jit/backend/model.py
   pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py
   pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py
   pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py
   pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py
Log:
(pedronis, arigo)

Two fixes for cpu.force():

- ignores the result of the call in the failargs (the call did
  not return yet!).

- returns the faildescr.



Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py	Fri Nov 27 21:50:30 2009
@@ -397,15 +397,16 @@
         else:
             return self.env[v]
 
-    def _populate_fail_args(self, op):
+    def _populate_fail_args(self, op, skip=None):
         fail_args = []
         if op.fail_args:
             for fail_arg in op.fail_args:
-                if fail_arg is None:
+                if fail_arg is None or fail_arg is skip:
                     fail_args.append(None)
                 else:
                     fail_args.append(self.getenv(fail_arg))
-        self.fail_args = fail_args        
+        self.fail_args = fail_args
+        self.fail_index = op.fail_index
 
     def execute(self):
         """Execute all operations in a loop,
@@ -793,7 +794,7 @@
     def op_call_may_force(self, calldescr, func, *args):
         assert not self._forced
         self._may_force = self.opindex
-        self.op_call(calldescr, func, *args)
+        return self.op_call(calldescr, func, *args)
 
     def op_guard_not_forced(self, descr):
         forced = self._forced
@@ -1071,12 +1072,19 @@
     opaque_frame = llmemory.cast_adr_to_ptr(force_token,
                                             lltype.Ptr(_TO_OPAQUE[Frame]))
     frame = _from_opaque(opaque_frame)
+    assert not frame._forced
     frame._forced = True
     assert frame._may_force >= 0
+    call_op = frame.loop.operations[frame._may_force]
     guard_op = frame.loop.operations[frame._may_force+1]
-    frame._populate_fail_args(guard_op)
+    frame._populate_fail_args(guard_op, skip=call_op.result)
     return opaque_frame
 
+def get_forced_fail_index(opaque_frame):
+    frame = _from_opaque(opaque_frame)
+    assert frame._forced
+    return frame.fail_index
+
 class MemoCast(object):
     def __init__(self):
         self.addresses = [llmemory.NULL]
@@ -1447,6 +1455,7 @@
 setannotation(get_zero_division_error, annmodel.SomeAddress())
 setannotation(get_zero_division_error_value, annmodel.SomePtr(llmemory.GCREF))
 setannotation(force, s_Frame)
+setannotation(get_forced_fail_index, annmodel.SomeInteger())
 
 setannotation(new_memo_cast, s_MemoCast)
 setannotation(cast_adr_to_int, annmodel.SomeInteger())

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py	Fri Nov 27 21:50:30 2009
@@ -497,9 +497,13 @@
     def do_cast_ptr_to_int(self, ptrbox):
         return history.BoxInt(llimpl.cast_to_int(ptrbox.getref_base(),
                                                         self.memo_cast))
+
     def force(self, force_token):
         frame = llimpl.force(self.cast_int_to_adr(force_token))
         self.latest_frame = frame
+        fail_index = llimpl.get_forced_fail_index(frame)
+        return self.get_fail_descr_from_number(fail_index)
+
 
 class OOtypeCPU(BaseCPU):
     is_oo = True

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/model.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/model.py	Fri Nov 27 21:50:30 2009
@@ -209,9 +209,9 @@
         raise NotImplementedError
 
     def do_call_may_force(self, args, calldescr):
-        raise NotImplementedError
+        return self.do_call(args, calldescr)
 
-    def force(self, force_token, descr, args):
+    def force(self, force_token):
         raise NotImplementedError
 
     # ootype specific operations

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py	Fri Nov 27 21:50:30 2009
@@ -1221,7 +1221,7 @@
             else:
                 assert record == []
 
-    def test_force_operations(self):
+    def test_force_operations_returning_void(self):
         values = []
         def maybe_force(token, flag):
             if flag:
@@ -1263,6 +1263,51 @@
         assert self.cpu.get_latest_value_int(1) == 10
         assert values == [1, 10]
 
+    def test_force_operations_returning_int(self):
+        values = []
+        def maybe_force(token, flag):
+            if flag:
+               self.cpu.force(token)
+               values.append(self.cpu.get_latest_value_int(0))
+               values.append(self.cpu.get_latest_value_int(2))
+            return 42
+
+        FUNC = self.FuncType([lltype.Signed, lltype.Signed], lltype.Signed)
+        func_ptr = llhelper(lltype.Ptr(FUNC), maybe_force)
+        funcbox = self.get_funcbox(self.cpu, func_ptr).constbox()
+        calldescr = self.cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT)
+        cpu = self.cpu
+        i0 = BoxInt()
+        i1 = BoxInt()
+        i2 = BoxInt()
+        tok = BoxInt()
+        faildescr = BasicFailDescr(1)
+        ops = [
+        ResOperation(rop.FORCE_TOKEN, [], tok),
+        ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], i2,
+                     descr=calldescr),
+        ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
+        ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(0))
+        ]
+        ops[2].fail_args = [i1, i2, i0]
+        looptoken = LoopToken()
+        self.cpu.compile_loop([i0, i1], ops, looptoken)
+        self.cpu.set_future_value_int(0, 20)
+        self.cpu.set_future_value_int(1, 0)
+        fail = self.cpu.execute_token(looptoken)
+        assert fail.identifier == 0
+        assert self.cpu.get_latest_value_int(0) == 42
+        assert values == []
+
+        self.cpu.set_future_value_int(0, 10)
+        self.cpu.set_future_value_int(1, 1)
+        fail = self.cpu.execute_token(looptoken)
+        assert fail.identifier == 1
+        assert self.cpu.get_latest_value_int(0) == 1
+        assert self.cpu.get_latest_value_int(1) == 42
+        assert self.cpu.get_latest_value_int(2) == 10
+        assert values == [1, 10]
+
     # pure do_ / descr features
 
     def test_do_operations(self):

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py	Fri Nov 27 21:50:30 2009
@@ -879,8 +879,7 @@
             arglocs.append(loc)
         return arglocs[:]
 
-    def grab_frame_values(self, bytecode, frame_addr,
-                          registers=lltype.nullptr(rffi.LONGP.TO)):
+    def grab_frame_values(self, bytecode, frame_addr, registers):
         num = 0
         value_hi = 0
         while 1:
@@ -915,7 +914,6 @@
                         continue
                     assert code == self.DESCR_STOP
                     break
-                assert registers    # it's NULL when called from cpu.force()
                 code >>= 2
                 if kind == self.DESCR_FLOAT:
                     xmmregisters = rffi.ptradd(registers, -16)

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py	Fri Nov 27 21:50:30 2009
@@ -615,6 +615,8 @@
         self.rm.before_call(force_store, save_all_regs=save_all_regs)
         self.xrm.before_call(force_store, save_all_regs=save_all_regs)
         if guard_not_forced_op is not None:
+            if op.result is not None:
+                self.force_allocate_reg(op.result, selected_reg=eax)  # XXX!!!
             self.perform_with_guard(op, guard_not_forced_op, arglocs, eax)
         else:
             self.Perform(op, arglocs, eax)

Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py	Fri Nov 27 21:50:30 2009
@@ -87,6 +87,9 @@
         adr = llmemory.cast_ptr_to_adr(x)
         return CPU386.cast_adr_to_int(adr)
 
+    all_null_registers = lltype.malloc(rffi.LONGP.TO, 24,
+                                       flavor='raw', zero=True)
+
     def force(self, addr_of_force_index):
         TP = rffi.CArrayPtr(lltype.Signed)
         fail_index = rffi.cast(TP, addr_of_force_index)[0]
@@ -98,7 +101,8 @@
         # start of "no gc operation!" block
         fail_index_2 = self.assembler.grab_frame_values(
             bytecode,
-            addr_of_force_index - FORCE_INDEX_OFS)
+            addr_of_force_index - FORCE_INDEX_OFS,
+            rffi.ptradd(self.all_null_registers, 16))
         self.assembler.leave_jitted_hook()
         # end of "no gc operation!" block
         assert fail_index == fail_index_2



More information about the Pypy-commit mailing list