[pypy-commit] pypy optresult: simple whacking at the backend

fijal noreply at buildbot.pypy.org
Wed May 27 11:18:38 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77619:bab2d31d5723
Date: 2015-05-27 10:59 +0200
http://bitbucket.org/pypy/pypy/changeset/bab2d31d5723/

Log:	simple whacking at the backend

diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -633,7 +633,7 @@
         locs = []
         base_ofs = self.assembler.cpu.get_baseofs_of_frame_field()
         for box in inputargs:
-            assert isinstance(box, Box)
+            assert not isinstance(box, Const)
             loc = self.fm.get_new_loc(box)
             locs.append(loc.value - base_ofs)
         if looptoken.compiled_loop_token is not None:
@@ -641,9 +641,8 @@
             looptoken.compiled_loop_token._ll_initial_locs = locs
 
     def can_merge_with_next_guard(self, op, i, operations):
-        if (op.getopnum() == rop.CALL_MAY_FORCE or
-            op.getopnum() == rop.CALL_ASSEMBLER or
-            op.getopnum() == rop.CALL_RELEASE_GIL):
+        if (op.is_call_may_force() or op.is_call_assembler() or
+            op.is_call_release_gil()):
             assert operations[i + 1].getopnum() == rop.GUARD_NOT_FORCED
             return True
         if not op.is_comparison():
@@ -682,16 +681,13 @@
     # never appear in the assembler or it does not matter if they appear on
     # stack or in registers. Main example is loop arguments that go
     # only to guard operations or to jump or to finish
-    produced = {}
     last_used = {}
     last_real_usage = {}
     for i in range(len(operations)-1, -1, -1):
         op = operations[i]
-        if op.result:
-            if op.result not in last_used and op.has_no_side_effect():
+        if op.type != 'v':
+            if op not in last_used and op.has_no_side_effect():
                 continue
-            assert op.result not in produced
-            produced[op.result] = i
         opnum = op.getopnum()
         for j in range(op.numargs()):
             arg = op.getarg(j)
@@ -711,14 +707,14 @@
                     last_used[arg] = i
     #
     longevity = {}
-    for arg in produced:
-        if arg in last_used:
+    for i, arg in enumerate(operations):
+        if arg.type != 'v' and arg in last_used:
             assert isinstance(arg, Box)
-            assert produced[arg] < last_used[arg]
-            longevity[arg] = (produced[arg], last_used[arg])
+            assert i < last_used[arg]
+            longevity[arg] = (i, last_used[arg])
             del last_used[arg]
     for arg in inputargs:
-        assert isinstance(arg, Box)
+        assert not isinstance(arg, Const)
         if arg not in last_used:
             longevity[arg] = (-1, -1)
         else:
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
@@ -187,8 +187,8 @@
             var = op.getarg(i)
             if var is not None: # xxx kludgy
                 self.possibly_free_var(var)
-        if op.result:
-            self.possibly_free_var(op.result)
+        if op.type != 'v':
+            self.possibly_free_var(op)
 
     def possibly_free_vars(self, vars):
         for var in vars:
@@ -316,7 +316,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:
+            if op.has_no_side_effect() and op not in self.longevity:
                 i += 1
                 self.possibly_free_vars_for_op(op)
                 continue
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
@@ -269,7 +269,14 @@
         return (opnum == rop.CALL_PURE_I or
                 opnum == rop.CALL_PURE_R or
                 opnum == rop.CALL_PURE_N or
-                opnum == rop.CALL_PURE_F)        
+                opnum == rop.CALL_PURE_F)
+
+    def is_call_release_gil(self):
+        opnum = self.opnum
+        # no R returning call_release_gil
+        return (opnum == rop.CALL_RELEASE_GIL_I or
+                opnum == rop.CALL_RELEASE_GIL_F or
+                opnum == rop.CALL_RELEASE_GIL_N)
 
     def is_ovf(self):
         return rop._OVF_FIRST <= self.getopnum() <= rop._OVF_LAST


More information about the pypy-commit mailing list