[pypy-commit] pypy kill-gen-store-back-in: kill a short-lived resop

fijal noreply at buildbot.pypy.org
Wed Jul 24 19:42:56 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: kill-gen-store-back-in
Changeset: r65624:7a884a450023
Date: 2013-07-24 19:41 +0200
http://bitbucket.org/pypy/pypy/changeset/7a884a450023/

Log:	kill a short-lived resop

diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -182,7 +182,7 @@
     def arraydescrof(self, A):
         raise NotImplementedError
 
-    def calldescrof(self, FUNC, ARGS, RESULT):
+    def calldescrof(self, FUNC, ARGS, RESULT, extrainfo):
         # FUNC is the original function type, but ARGS is a list of types
         # with Voids removed
         raise NotImplementedError
@@ -298,11 +298,6 @@
     def bh_copyunicodecontent(self, src, dst, srcstart, dststart, length):
         raise NotImplementedError
 
-    def bh_force_virtualizable(self, v, descr):
-        vinfo = descr.get_vinfo()
-        if vinfo is not None:
-            vinfo.clear_vable_token(v)
-
 class CompiledLoopToken(object):
     asmmemmgr_blocks = None
     asmmemmgr_gcroots = 0
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -314,8 +314,7 @@
             self.assembler.mc.mark_op(op)
             self.rm.position = i
             self.xrm.position = i
-            if (op.has_no_side_effect() and op.result not in self.longevity
-                and op.opnum != rop.FORCE_VIRTUALIZABLE):
+            if op.has_no_side_effect() and op.result not in self.longevity:
                 i += 1
                 self.possibly_free_vars_for_op(op)
                 continue
@@ -865,18 +864,6 @@
             gc_ll_descr.get_nursery_top_addr(),
             sizeloc, gcmap)
 
-    def consider_force_virtualizable(self, op):
-        # just do a call for now
-        vinfo = op.getdescr().get_vinfo()
-        if vinfo is None:
-            return # for tests
-        calldescr = vinfo.clear_vable_descr
-        assert isinstance(calldescr, CallDescr)
-        fval = rffi.cast(lltype.Signed, vinfo.clear_vable_ptr)
-        op = ResOperation(rop.CALL, [ConstInt(fval), op.getarg(0)], None,
-                          descr=calldescr)
-        self.consider_call(op)
-
     def consider_call_malloc_nursery_varsize(self, op):
         gc_ll_descr = self.assembler.cpu.gc_ll_descr
         if not hasattr(gc_ll_descr, 'max_size_of_young_obj'):
diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -84,6 +84,7 @@
     OS_UNI_COPY_TO_RAW          = 113
 
     OS_JIT_FORCE_VIRTUAL        = 120
+    OS_JIT_FORCE_VIRTUALIZABLE  = 121
 
     # for debugging:
     _OS_CANRAISE = set([
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1320,10 +1320,6 @@
         from rpython.jit.metainterp import quasiimmut
         quasiimmut.do_force_quasi_immutable(cpu, struct, mutatefielddescr)
 
-    @arguments("cpu", "r", "d")
-    def bhimpl_force_virtualizable(cpu, v, descr):
-        cpu.bh_force_virtualizable(v, descr)
-
     @arguments("r")
     def bhimpl_hint_force_virtualizable(r):
         pass
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -281,9 +281,6 @@
 def do_keepalive(cpu, _, x):
     pass
 
-def do_force_virtualizable(cpu, _, v, descr):
-    cpu.bh_force_virtualizable(v.getref_base(), descr)
-
 # ____________________________________________________________
 
 ##def do_force_token(cpu):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -7090,7 +7090,7 @@
         ops = """
         [i0]
         p1 = new_with_vtable(ConstClass(node_vtable))
-        force_virtualizable(p1)
+        cond_call(1, 123, p1, descr=clear_vable)
         jump(i0)
         """
         expected = """
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -256,12 +256,19 @@
     asmdescr = LoopToken() # it can be whatever, it's not a descr though
 
     from rpython.jit.metainterp.virtualref import VirtualRefInfo
+
     class FakeWarmRunnerDesc:
         pass
     FakeWarmRunnerDesc.cpu = cpu
     vrefinfo = VirtualRefInfo(FakeWarmRunnerDesc)
     virtualtokendescr = vrefinfo.descr_virtual_token
     virtualforceddescr = vrefinfo.descr_forced
+    FUNC = lltype.FuncType([], lltype.Void)
+    ei = EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE,
+                    can_invalidate=False,
+                    oopspecindex=EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE)
+    clear_vable = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, ei)
+
     jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable
     jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable)
 
@@ -447,7 +454,7 @@
         preamble.inputargs = inputargs
         preamble.resume_at_jump_descr = FakeDescrWithSnapshot()
 
-        token = JitCellToken() 
+        token = JitCellToken()
         preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \
                               operations +  \
                               [ResOperation(rop.LABEL, jump_args, None, descr=token)]
@@ -460,7 +467,7 @@
         loop.operations = [preamble.operations[-1]] + \
                           [inliner.inline_op(op, clone=False) for op in cloned_operations] + \
                           [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args],
-                                        None, descr=token)] 
+                                        None, descr=token)]
                           #[inliner.inline_op(jumpop)]
         assert loop.operations[-1].getopnum() == rop.JUMP
         assert loop.operations[0].getopnum() == rop.LABEL
@@ -479,7 +486,7 @@
             preamble.operations.insert(-1, op)
 
         return preamble
-        
+
 
 class FakeDescr(compile.ResumeGuardDescr):
     def clone_if_mutable(self):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -543,12 +543,6 @@
         else:
             self.emit_operation(op)
 
-    def optimize_FORCE_VIRTUALIZABLE(self, op):
-        val = self.getvalue(op.getarg(0))
-        if val.is_virtual():
-            return
-        self.emit_operation(op)
-
     def optimize_CALL_MAY_FORCE(self, op):
         effectinfo = op.getdescr().get_extra_info()
         oopspecindex = effectinfo.oopspecindex
@@ -557,6 +551,15 @@
                 return
         self.emit_operation(op)
 
+    def optimize_COND_CALL(self, op):
+        effectinfo = op.getdescr().get_extra_info()
+        oopspecindex = effectinfo.oopspecindex
+        if oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE:
+            value = self.getvalue(op.getarg(2))
+            if value.is_virtual():
+                return
+        self.emit_operation(op)
+
     def optimize_VIRTUAL_REF(self, op):
         # get some constants
         vrefinfo = self.optimizer.metainterp_sd.virtualref_info
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -491,7 +491,6 @@
     'NEWSTR/1',
     'NEWUNICODE/1',
     '_MALLOC_LAST',
-    'FORCE_VIRTUALIZABLE/1d', # forces a non-standard virtualizable
     '_CANMALLOC_LAST',
     'FORCE_TOKEN/0',
     'VIRTUAL_REF/2',         # removed before it's passed to the backend
diff --git a/rpython/jit/metainterp/test/test_recursive.py b/rpython/jit/metainterp/test/test_recursive.py
--- a/rpython/jit/metainterp/test/test_recursive.py
+++ b/rpython/jit/metainterp/test/test_recursive.py
@@ -796,7 +796,7 @@
             return frame.thing.val
 
         res = self.meta_interp(main, [0], inline=True)
-        self.check_resops(force_virtualizable=2)
+        self.check_resops(cond_call=2)
         assert res == main(0)
 
     def test_directly_call_assembler_virtualizable_reset_token(self):
diff --git a/rpython/jit/metainterp/virtualizable.py b/rpython/jit/metainterp/virtualizable.py
--- a/rpython/jit/metainterp/virtualizable.py
+++ b/rpython/jit/metainterp/virtualizable.py
@@ -300,9 +300,12 @@
         self.clear_vable_ptr = self.warmrunnerdesc.helper_func(
             FUNCPTR, self.clear_vable_token)
         FUNC = FUNCPTR.TO
+        ei = EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE,
+                        can_invalidate=False,
+                        oopspecindex=EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE)
+
         self.clear_vable_descr = self.cpu.calldescrof(FUNC, FUNC.ARGS,
-                                                      FUNC.RESULT,
-                                                      EffectInfo.LEAST_GENERAL)
+                                                      FUNC.RESULT, ei)
 
     def unwrap_virtualizable_box(self, virtualizable_box):
         return virtualizable_box.getref(llmemory.GCREF)


More information about the pypy-commit mailing list